Snap for 8564071 from 3b9beac059a2a187dbb538dace479aa6e770a844 to mainline-os-statsd-release

Change-Id: I5c845db35168da41f8d2c7b240d21cbe68ecf23f
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..1e956d2
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,16 @@
+version: 2
+updates:
+# TODO(b/170636568): Enable Maven updates? Perhaps wait until we can more
+# easily import the generated PRs into our internal repo.
+#  - package-ecosystem: "maven"
+#    directory: "/"
+#    schedule:
+#      interval: "daily"
+#  - package-ecosystem: "maven"
+#    directory: "/android"
+#    schedule:
+#      interval: "daily"
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "daily"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..df20b1a
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,105 @@
+name: CI
+
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+    branches:
+      - master
+
+jobs:
+  test:
+    name: "${{ matrix.root-pom }} on JDK ${{ matrix.java }}"
+    strategy:
+      matrix:
+        java: [ 8, 11 ]
+        root-pom: [ 'pom.xml', 'android/pom.xml' ]
+    runs-on: ubuntu-latest
+    env:
+      ROOT_POM: ${{ matrix.root-pom }}
+    steps:
+      # Cancel any previous runs for the same branch that are still running.
+      - name: 'Cancel previous runs'
+        uses: styfle/cancel-workflow-action@0.9.1
+        with:
+          access_token: ${{ github.token }}
+      - name: 'Check out repository'
+        uses: actions/checkout@v2.3.4
+      - name: 'Cache local Maven repository'
+        uses: actions/cache@v2.1.6
+        with:
+          path: ~/.m2/repository
+          key: maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            maven-
+      - name: 'Set up JDK ${{ matrix.java }}'
+        uses: actions/setup-java@v2
+        with:
+          java-version: ${{ matrix.java }}
+          distribution: 'zulu'
+      - name: 'Install'
+        shell: bash
+        run: mvn -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn install -U -DskipTests=true -f $ROOT_POM
+      - name: 'Test'
+        shell: bash
+        run: mvn -B -P!standard-with-extra-repos verify -U -Dmaven.javadoc.skip=true -f $ROOT_POM
+      - name: 'Print Surefire reports'
+        # Note: Normally a step won't run if the job has failed, but this causes it to
+        if: ${{ failure() }}
+        shell: bash
+        run: ./util/print_surefire_reports.sh
+
+  publish_snapshot:
+    name: 'Publish snapshot'
+    needs: test
+    if: github.event_name == 'push' && github.repository == 'google/guava'
+    runs-on: ubuntu-latest
+    steps:
+      - name: 'Check out repository'
+        uses: actions/checkout@v2.3.4
+      - name: 'Cache local Maven repository'
+        uses: actions/cache@v2.1.6
+        with:
+          path: ~/.m2/repository
+          key: maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            maven-
+      - name: 'Set up JDK 11'
+        uses: actions/setup-java@v2
+        with:
+          java-version: 11
+          distribution: 'zulu'
+          server-id: sonatype-nexus-snapshots
+          server-username: CI_DEPLOY_USERNAME
+          server-password: CI_DEPLOY_PASSWORD
+      - name: 'Publish'
+        env:
+          CI_DEPLOY_USERNAME: ${{ secrets.CI_DEPLOY_USERNAME }}
+          CI_DEPLOY_PASSWORD: ${{ secrets.CI_DEPLOY_PASSWORD }}
+        run: ./util/deploy_snapshot.sh
+
+  generate_docs:
+    name: 'Generate latest docs'
+    needs: test
+    if: github.event_name == 'push' && github.repository == 'google/guava'
+    runs-on: ubuntu-latest
+    steps:
+      - name: 'Check out repository'
+        uses: actions/checkout@v2.3.4
+      - name: 'Cache local Maven repository'
+        uses: actions/cache@v2.1.6
+        with:
+          path: ~/.m2/repository
+          key: maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            maven-
+      - name: 'Set up JDK 11'
+        uses: actions/setup-java@v2
+        with:
+          java-version: 11
+          distribution: 'zulu'
+      - name: 'Generate latest docs'
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        run: ./util/update_snapshot_docs.sh
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index fac7af9..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-sudo: false
-
-language: java
-
-jdk:
-  - openjdk8
-  - openjdk11
-
-addons:
-  apt:
-    packages:
-      - openjdk-8-source
-
-install: mvn -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn install -U -DskipTests=true -f $ROOT_POM
-
-# https://docs.travis-ci.com/user/common-build-problems/#build-times-out-because-no-output-was-received
-script: travis_wait 60 mvn -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn verify -U -Dmaven.javadoc.skip=true -f $ROOT_POM
-
-after_success:
-  - util/deploy_snapshot.sh
-  - util/update_snapshot_docs.sh
-
-after_failure:
-  - util/print_surefire_reports.sh
-
-cache:
-  directories:
-  - $HOME/.m2
-
-env:
-  global:
-    - secure: "IPvqFwnLx/GXyImJuwM2MIvzDlBLqEXaQXFGJgAP1nbuenaLAloOOlqQ+iy2FDLBD/j+zjSbR3WWF9DIT4YxAS03Z6iMwxh7GCfk+tyhVtLQnwt7w1rquyhbrrGFsY5U0hr5q80Ww6J+zfp2yZ8aP9FHSy5ahNjqys4FtubOWLk="
-    - secure: "G77Wt2h2fceQ867i1uwOjUygrNeBpLRS8sxgfUZsO66dvlrx1wYFpZLLRIiPcy01peUTE2SvXIXLHKe9v3AlMonPibsQtvvfQSVfx+jgKwLZx9cuf/M5VQlD3etRUh4K/rBezlxWRroeeKcM2DQqiEVLsTDSyNZV9kVAjwfLTvM="
-    - secure: "wieIClPLTXS3QjDzqyp0TqIrVP/Q6iWNPOtcUQYfdDZJGwufE61laTFtzVKXZRb7uJ4GXDObcVU3AcpAwkTX/5sEksBxgv3TZ5Qi0mVx2GRmbE06ULLxi7sPnTCZ/VFtselDWcWArWGAcdCjW9gcCrgj5K/+sYpVKz9a8V+SDM4="
-  matrix:
-    - ROOT_POM="pom.xml"
-    - ROOT_POM="android/pom.xml"
-
-branches:
-  only:
-    - master
-    - /^release.*$/
diff --git a/Android.bp b/Android.bp
index 2fdd93c..376abe9 100644
--- a/Android.bp
+++ b/Android.bp
@@ -49,6 +49,24 @@
     ],
 }
 
+// Instructions for updating the guava version
+//
+// Guava updates must be merged to AOSP first. Make sure you are not using a
+// shallow copy of the Android tree to run the following instructions:
+//
+// 1. File a bug to generate a branch with the version you want to update to.
+//    You can use b/209469232 as starting point. This step will generate an
+//    upstream branch.
+// 2. Create your work branch using `repo start <your_branch_name>`.
+// 3. Fetch the upstream branch using `git fetch aosp <upstream_branch_name>`.
+// 4. Run the merge using `git merge FETCH_HEAD`.
+// 5. Update the METADATA file in this directory to reflect your changes.
+//
+// Note: When running `repo upload` to generate the CL, repo will produce a
+// warning about the number of commits you are trying to upload. This is
+// expected, and you can accept safely (a single gerrit "merge commit" change
+// will be created).
+
 java_library {
     name: "guava",
     host_supported: true,
diff --git a/BUILD b/BUILD
new file mode 100644
index 0000000..22c9e62
--- /dev/null
+++ b/BUILD
@@ -0,0 +1,58 @@
+# TODO(b/198224074): auto-generate this file using bp2build.
+#
+
+alias(
+    name = "guava",
+    actual = select({
+        "//build/bazel/platforms/os:android": ":guava-android-host",
+        "//conditions:default": ":guava-jre",
+    }),
+    visibility = ["//visibility:public"],
+)
+
+java_library(
+    name = "guava-android-host",
+    srcs = glob(["android/guava/src/**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        ":guava-android-annotation-stubs",
+        ":guava-both",
+        "//external/error_prone:error_prone_annotations",
+    ],
+    exports = [
+        ":guava-both",
+    ],
+    target_compatible_with = ["//build/bazel/platforms/os:android"],
+)
+
+java_library(
+    name = "guava-android-annotation-stubs",
+    srcs = glob(["android-annotation-stubs/src/**/*.java"]),
+)
+
+java_library(
+    name = "guava-both",
+    srcs = glob(["futures/failureaccess/**/*.java"]),
+    deps = [
+        ":guava-android-annotation-stubs",
+        "//external/error_prone:error_prone_annotations",
+        "//external/jsr305",
+    ],
+    exports = [
+        "//external/jsr305",
+    ],
+)
+
+java_library(
+    name = "guava-jre",
+    srcs = glob(["guava/src/**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        ":guava-android-annotation-stubs",
+        ":guava-both",
+        "//external/error_prone:error_prone_annotations",
+    ],
+    exports = [
+        ":guava-both",
+    ],
+)
diff --git a/METADATA b/METADATA
index 27cdada..9bf3de1 100644
--- a/METADATA
+++ b/METADATA
@@ -9,11 +9,11 @@
     type: GIT
     value: "https://github.com/google/guava.git"
   }
-  version: "27.1"
+  version: "31.0.1"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2019
-    month: 4
-    day: 10
+    year: 2021
+    month: 12
+    day: 7
   }
 }
diff --git a/README.md b/README.md
index f95062c..d5bcf55 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # Guava: Google Core Libraries for Java
 
 [![Latest release](https://img.shields.io/github/release/google/guava.svg)](https://github.com/google/guava/releases/latest)
-[![Build Status](https://travis-ci.org/google/guava.svg?branch=master)](https://travis-ci.org/google/guava)
+[![Build Status](https://github.com/google/guava/workflows/CI/badge.svg?branch=master)](https://github.com/google/guava/actions)
 
 Guava is a set of core Java libraries from Google that includes new collection types
 (such as multimap and multiset), immutable collections, a graph library, and
@@ -23,7 +23,7 @@
 Guava provides two different "flavors": one for use on a (Java 8+) JRE and one
 for use on Android or Java 7 or by any library that wants to be compatible with
 either of those. These flavors are specified in the Maven version field as
-either `30.0-jre` or `30.0-android`. For more about depending on Guava, see
+either `31.0.1-jre` or `31.0.1-android`. For more about depending on Guava, see
 [using Guava in your build].
 
 To add a dependency on Guava using Maven, use the following:
@@ -32,9 +32,9 @@
 <dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
-  <version>30.0-jre</version>
+  <version>31.0.1-jre</version>
   <!-- or, for Android: -->
-  <version>30.0-android</version>
+  <version>31.0.1-android</version>
 </dependency>
 ```
 
@@ -45,16 +45,16 @@
   // Pick one:
 
   // 1. Use Guava in your implementation only:
-  implementation("com.google.guava:guava:30.0-jre")
+  implementation("com.google.guava:guava:31.0.1-jre")
 
   // 2. Use Guava types in your public API:
-  api("com.google.guava:guava:30.0-jre")
+  api("com.google.guava:guava:31.0.1-jre")
 
   // 3. Android - Use Guava in your implementation only:
-  implementation("com.google.guava:guava:30.0-android")
+  implementation("com.google.guava:guava:31.0.1-android")
 
   // 4. Android - Use Guava types in your public API:
-  api("com.google.guava:guava:30.0-android")
+  api("com.google.guava:guava:31.0.1-android")
 }
 ```
 
@@ -101,8 +101,10 @@
     plans to start removing things again, but officially, we're leaving our
     options open in case of surprises (like, say, a serious security problem).
 
-3.  Guava has one dependency that is needed at runtime:
-    `com.google.guava:failureaccess:1.0.1`
+3.  Guava has one dependency that is needed for linkage at runtime:
+    `com.google.guava:failureaccess:1.0.1`. It also has
+    [some annotation-only dependencies][guava-deps], which we discuss in more
+    detail at that link.
 
 4.  Serialized forms of ALL objects are subject to change unless noted
     otherwise. Do not persist these and assume they can be read by a future
@@ -111,10 +113,10 @@
 5.  Our classes are not designed to protect against a malicious caller. You
     should not use them for communication between trusted and untrusted code.
 
-6.  For the mainline flavor, we unit-test the libraries using only OpenJDK 1.8
-    on Linux. Some features, especially in `com.google.common.io`, may not work
-    correctly in other environments. For the Android flavor, our unit tests run
-    on API level 15 (Ice Cream Sandwich).
+6.  For the mainline flavor, we test the libraries using only OpenJDK 8 and
+    OpenJDK 11 on Linux. Some features, especially in `com.google.common.io`,
+    may not work correctly in other environments. For the Android flavor, our
+    unit tests also run on API level 15 (Ice Cream Sandwich).
 
 [guava-snapshot-api-docs]: https://guava.dev/releases/snapshot-jre/api/docs/
 [guava-snapshot-api-diffs]: https://guava.dev/releases/snapshot-jre/api/diffs/
@@ -125,4 +127,4 @@
 
 [using Guava in your build]: https://github.com/google/guava/wiki/UseGuavaInYourBuild
 [repackage]: https://github.com/google/guava/wiki/UseGuavaInYourBuild#what-if-i-want-to-use-beta-apis-from-a-library-that-people-use-as-a-dependency
-
+[guava-deps]: https://github.com/google/guava/wiki/UseGuavaInYourBuild#what-about-guavas-own-dependencies
diff --git a/android/guava-bom/pom.xml b/android/guava-bom/pom.xml
index cbb2fda..b0afa45 100644
--- a/android/guava-bom/pom.xml
+++ b/android/guava-bom/pom.xml
@@ -8,13 +8,14 @@
 
   <groupId>com.google.guava</groupId>
   <artifactId>guava-bom</artifactId>
-  <version>30.0-android</version>
+  <version>31.0.1-android</version>
   <packaging>pom</packaging>
   
   <parent>
     <groupId>org.sonatype.oss</groupId>
     <artifactId>oss-parent</artifactId>
     <version>9</version>
+    <relativePath></relativePath>
   </parent>
 
   <name>Guava BOM</name>
diff --git a/android/guava-testlib/pom.xml b/android/guava-testlib/pom.xml
index ed18b46..8e67de7 100644
--- a/android/guava-testlib/pom.xml
+++ b/android/guava-testlib/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>30.0-android</version>
+    <version>31.0.1-android</version>
   </parent>
   <artifactId>guava-testlib</artifactId>
   <name>Guava Testing Library</name>
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/CollectionTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/CollectionTestSuiteBuilder.java
index cf1ed23..5f9aff4 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/CollectionTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/CollectionTestSuiteBuilder.java
@@ -57,6 +57,8 @@
               .named(getName() + " reserialized")
               .withFeatures(computeReserializedCollectionFeatures(parentBuilder.getFeatures()))
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
     return derivedSuites;
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
index 0d921a5..b629fa9 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
@@ -81,7 +81,7 @@
     return self();
   }
 
-  protected Runnable getSetUp() {
+  public Runnable getSetUp() {
     return setUp;
   }
 
@@ -90,13 +90,13 @@
     return self();
   }
 
-  protected Runnable getTearDown() {
+  public Runnable getTearDown() {
     return tearDown;
   }
 
   // Features
 
-  private Set<Feature<?>> features = new LinkedHashSet<>();
+  private final Set<Feature<?>> features = new LinkedHashSet<>();
 
   /**
    * Configures this builder to produce tests appropriate for the given features. This method may be
@@ -138,7 +138,7 @@
 
   // Test suppression
 
-  private Set<Method> suppressedTests = new HashSet<>();
+  private final Set<Method> suppressedTests = new HashSet<>();
 
   /**
    * Prevents the given methods from being run as part of the test suite.
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/ListTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/ListTestSuiteBuilder.java
index e010564..061e310 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/ListTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/ListTestSuiteBuilder.java
@@ -112,6 +112,8 @@
               .named(getName() + " reserialized")
               .withFeatures(computeReserializedCollectionFeatures(parentBuilder.getFeatures()))
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
     return derivedSuites;
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/MapTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/MapTestSuiteBuilder.java
index 7bb418f..7b8e40a 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/MapTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/MapTestSuiteBuilder.java
@@ -101,6 +101,8 @@
               .withFeatures(computeReserializedMapFeatures(parentBuilder.getFeatures()))
               .named(parentBuilder.getName() + " reserialized")
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
 
@@ -110,6 +112,8 @@
             .withFeatures(computeEntrySetFeatures(parentBuilder.getFeatures()))
             .named(parentBuilder.getName() + " entrySet")
             .suppressing(parentBuilder.getSuppressedTests())
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
 
     derivedSuites.add(
@@ -117,6 +121,8 @@
             .withFeatures(computeKeySetFeatures(parentBuilder.getFeatures()))
             .named(parentBuilder.getName() + " keys")
             .suppressing(parentBuilder.getSuppressedTests())
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
 
     derivedSuites.add(
@@ -125,6 +131,8 @@
             .named(parentBuilder.getName() + " values")
             .withFeatures(computeValuesCollectionFeatures(parentBuilder.getFeatures()))
             .suppressing(parentBuilder.getSuppressedTests())
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
 
     return derivedSuites;
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/SetTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/SetTestSuiteBuilder.java
index 26a2870..4ac51a4 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/SetTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/SetTestSuiteBuilder.java
@@ -78,6 +78,8 @@
               .named(getName() + " reserialized")
               .withFeatures(computeReserializedCollectionFeatures(parentBuilder.getFeatures()))
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
     return derivedSuites;
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
index e95383a..aa1d6d5 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
@@ -121,6 +121,8 @@
         .named(parentBuilder.getName() + " subMap " + from + "-" + to)
         .withFeatures(features)
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
index e97b08f..5092661 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
@@ -94,6 +94,8 @@
         .named(parentBuilder.getName() + " subSet " + from + "-" + to)
         .withFeatures(features)
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/BiMapTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/google/BiMapTestSuiteBuilder.java
index fa21a71..0821fb0 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/BiMapTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/BiMapTestSuiteBuilder.java
@@ -88,6 +88,8 @@
             .suppressing(parentBuilder.getSuppressedTests())
             .suppressing(SetCreationTester.class.getMethods())
             // BiMap.entrySet() duplicate-handling behavior is too confusing for SetCreationTester
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
     /*
      * TODO(cpovirk): the Map tests duplicate most of this effort by using a
@@ -101,6 +103,8 @@
             .suppressing(parentBuilder.getSuppressedTests())
             .suppressing(SetCreationTester.class.getMethods())
             // BiMap.values() duplicate-handling behavior is too confusing for SetCreationTester
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
     if (!parentBuilder.getFeatures().contains(NoRecurse.INVERSE)) {
       derived.add(
@@ -109,6 +113,8 @@
               .withFeatures(computeInverseFeatures(parentBuilder.getFeatures()))
               .named(parentBuilder.getName() + " inverse")
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
 
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/MultimapTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/google/MultimapTestSuiteBuilder.java
index 8504940..97c24c9 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/MultimapTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/MultimapTestSuiteBuilder.java
@@ -115,6 +115,8 @@
               .withFeatures(computeReserializedMultimapFeatures(parentBuilder.getFeatures()))
               .named(parentBuilder.getName() + " reserialized")
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
 
@@ -123,6 +125,8 @@
             .withFeatures(computeAsMapFeatures(parentBuilder.getFeatures()))
             .named(parentBuilder.getName() + ".asMap")
             .suppressing(parentBuilder.getSuppressedTests())
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
 
     derivedSuites.add(computeEntriesTestSuite(parentBuilder));
@@ -153,6 +157,8 @@
         .withFeatures(computeEntriesFeatures(parentBuilder.getFeatures()))
         .named(parentBuilder.getName() + ".entries")
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
@@ -164,6 +170,8 @@
         .withFeatures(computeMultimapGetFeatures(parentBuilder.getFeatures()))
         .named(parentBuilder.getName() + ".get[key]")
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
@@ -179,6 +187,8 @@
           .withFeatures(features)
           .named(parentBuilder.getName() + ".asMap[].get[key]")
           .suppressing(parentBuilder.getSuppressedTests())
+          .withSetUp(parentBuilder.getSetUp())
+          .withTearDown(parentBuilder.getTearDown())
           .createTestSuite();
     }
   }
@@ -191,6 +201,8 @@
         .withFeatures(computeKeysFeatures(parentBuilder.getFeatures()))
         .named(parentBuilder.getName() + ".keys")
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/google/MultisetTestSuiteBuilder.java b/android/guava-testlib/src/com/google/common/collect/testing/google/MultisetTestSuiteBuilder.java
index 266daa4..d6a665c 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/google/MultisetTestSuiteBuilder.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/google/MultisetTestSuiteBuilder.java
@@ -130,6 +130,8 @@
               .named(getName() + ".entrySet")
               .withFeatures(computeEntrySetFeatures(parentBuilder.getFeatures()))
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
 
@@ -140,6 +142,8 @@
               .named(getName() + " reserialized")
               .withFeatures(computeReserializedMultisetFeatures(parentBuilder.getFeatures()))
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
     return derivedSuites;
@@ -153,6 +157,8 @@
         .named(getName() + ".elementSet")
         .withFeatures(computeElementSetFeatures(parentBuilder.getFeatures()))
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
diff --git a/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionToArrayTester.java b/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionToArrayTester.java
index 83a4cea..b40fc36 100644
--- a/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionToArrayTester.java
+++ b/android/guava-testlib/src/com/google/common/collect/testing/testers/CollectionToArrayTester.java
@@ -48,8 +48,8 @@
   }
 
   /**
-   * {@link Collection#toArray(Object[])} says: "Note that <tt>toArray(new Object[0])</tt> is
-   * identical in function to <tt>toArray()</tt>."
+   * {@link Collection#toArray(Object[])} says: "Note that {@code toArray(new Object[0])} is
+   * identical in function to {@code toArray()}."
    *
    * <p>For maximum effect, the collection under test should be created from an element array of a
    * type other than {@code Object[]}.
diff --git a/android/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java b/android/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
index 21e25cb..9110490 100644
--- a/android/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
+++ b/android/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
@@ -354,7 +354,7 @@
   private @interface Empty {}
 
   @Generates
-  private Class<?> generateClass() {
+  Class<?> generateClass() {
     return pickInstance(
         ImmutableList.of(
             int.class, long.class, void.class, Object.class, Object[].class, Iterable.class),
@@ -362,147 +362,147 @@
   }
 
   @Generates
-  private Object generateObject() {
+  Object generateObject() {
     return generateString();
   }
 
   @Generates
-  private Number generateNumber() {
+  Number generateNumber() {
     return generateInt();
   }
 
   @Generates
-  private int generateInt() {
+  int generateInt() {
     return freshness.get();
   }
 
   @Generates
-  private Integer generateInteger() {
+  Integer generateInteger() {
     return new Integer(generateInt());
   }
 
   @Generates
-  private long generateLong() {
+  long generateLong() {
     return generateInt();
   }
 
   @Generates
-  private Long generateLongObject() {
+  Long generateLongObject() {
     return new Long(generateLong());
   }
 
   @Generates
-  private float generateFloat() {
+  float generateFloat() {
     return generateInt();
   }
 
   @Generates
-  private Float generateFloatObject() {
+  Float generateFloatObject() {
     return new Float(generateFloat());
   }
 
   @Generates
-  private double generateDouble() {
+  double generateDouble() {
     return generateInt();
   }
 
   @Generates
-  private Double generateDoubleObject() {
+  Double generateDoubleObject() {
     return new Double(generateDouble());
   }
 
   @Generates
-  private short generateShort() {
+  short generateShort() {
     return (short) generateInt();
   }
 
   @Generates
-  private Short generateShortObject() {
+  Short generateShortObject() {
     return new Short(generateShort());
   }
 
   @Generates
-  private byte generateByte() {
+  byte generateByte() {
     return (byte) generateInt();
   }
 
   @Generates
-  private Byte generateByteObject() {
+  Byte generateByteObject() {
     return new Byte(generateByte());
   }
 
   @Generates
-  private char generateChar() {
+  char generateChar() {
     return generateString().charAt(0);
   }
 
   @Generates
-  private Character generateCharacter() {
+  Character generateCharacter() {
     return new Character(generateChar());
   }
 
   @Generates
-  private boolean generateBoolean() {
+  boolean generateBoolean() {
     return generateInt() % 2 == 0;
   }
 
   @Generates
-  private Boolean generateBooleanObject() {
+  Boolean generateBooleanObject() {
     return new Boolean(generateBoolean());
   }
 
   @Generates
-  private UnsignedInteger generateUnsignedInteger() {
+  UnsignedInteger generateUnsignedInteger() {
     return UnsignedInteger.fromIntBits(generateInt());
   }
 
   @Generates
-  private UnsignedLong generateUnsignedLong() {
+  UnsignedLong generateUnsignedLong() {
     return UnsignedLong.fromLongBits(generateLong());
   }
 
   @Generates
-  private BigInteger generateBigInteger() {
+  BigInteger generateBigInteger() {
     return BigInteger.valueOf(generateInt());
   }
 
   @Generates
-  private BigDecimal generateBigDecimal() {
+  BigDecimal generateBigDecimal() {
     return BigDecimal.valueOf(generateInt());
   }
 
   @Generates
-  private CharSequence generateCharSequence() {
+  CharSequence generateCharSequence() {
     return generateString();
   }
 
   @Generates
-  private String generateString() {
+  String generateString() {
     return Integer.toString(generateInt());
   }
 
   @Generates
-  private Comparable<?> generateComparable() {
+  Comparable<?> generateComparable() {
     return generateString();
   }
 
   @Generates
-  private Pattern generatePattern() {
+  Pattern generatePattern() {
     return Pattern.compile(generateString());
   }
 
   @Generates
-  private Charset generateCharset() {
+  Charset generateCharset() {
     return pickInstance(Charset.availableCharsets().values(), Charsets.UTF_8);
   }
 
   @Generates
-  private Locale generateLocale() {
+  Locale generateLocale() {
     return pickInstance(Locale.getAvailableLocales(), Locale.US);
   }
 
   @Generates
-  private Currency generateCurrency() {
+  Currency generateCurrency() {
     try {
       Method method = Currency.class.getMethod("getAvailableCurrencies");
       @SuppressWarnings("unchecked") // getAvailableCurrencies() returns Set<Currency>.
@@ -538,27 +538,27 @@
 
   // common.base
   @Empty
-  private <T> com.google.common.base.Optional<T> generateGoogleOptional() {
+  <T> com.google.common.base.Optional<T> generateGoogleOptional() {
     return com.google.common.base.Optional.absent();
   }
 
   @Generates
-  private <T> com.google.common.base.Optional<T> generateGoogleOptional(T value) {
+  <T> com.google.common.base.Optional<T> generateGoogleOptional(T value) {
     return com.google.common.base.Optional.of(value);
   }
 
   @Generates
-  private Joiner generateJoiner() {
+  Joiner generateJoiner() {
     return Joiner.on(generateString());
   }
 
   @Generates
-  private Splitter generateSplitter() {
+  Splitter generateSplitter() {
     return Splitter.on(generateString());
   }
 
   @Generates
-  private <T> Equivalence<T> generateEquivalence() {
+  <T> Equivalence<T> generateEquivalence() {
     return new Equivalence<T>() {
       @Override
       protected boolean doEquivalent(T a, T b) {
@@ -580,7 +580,7 @@
   }
 
   @Generates
-  private CharMatcher generateCharMatcher() {
+  CharMatcher generateCharMatcher() {
     return new CharMatcher() {
       @Override
       public boolean matches(char c) {
@@ -597,7 +597,7 @@
   }
 
   @Generates
-  private Ticker generateTicker() {
+  Ticker generateTicker() {
     return new Ticker() {
       @Override
       public long read() {
@@ -615,12 +615,12 @@
 
   // collect
   @Generates
-  private <T> Comparator<T> generateComparator() {
+  <T> Comparator<T> generateComparator() {
     return generateOrdering();
   }
 
   @Generates
-  private <T> Ordering<T> generateOrdering() {
+  <T> Ordering<T> generateOrdering() {
     return new Ordering<T>() {
       @Override
       public int compare(T left, T right) {
@@ -637,279 +637,283 @@
   }
 
   @Empty
-  private static <C extends Comparable<?>> Range<C> generateRange() {
+  static <C extends Comparable<?>> Range<C> generateRange() {
     return Range.all();
   }
 
   @Generates
-  private static <C extends Comparable<?>> Range<C> generateRange(C freshElement) {
+  static <C extends Comparable<?>> Range<C> generateRange(C freshElement) {
     return Range.singleton(freshElement);
   }
 
   @Generates
-  private static <E> Iterable<E> generateIterable(E freshElement) {
+  static <E> Iterable<E> generateIterable(@NullableDecl E freshElement) {
     return generateList(freshElement);
   }
 
   @Generates
-  private static <E> Collection<E> generateCollection(E freshElement) {
+  static <E> Collection<E> generateCollection(@NullableDecl E freshElement) {
     return generateList(freshElement);
   }
 
   @Generates
-  private static <E> List<E> generateList(E freshElement) {
+  static <E> List<E> generateList(@NullableDecl E freshElement) {
     return generateArrayList(freshElement);
   }
 
   @Generates
-  private static <E> ArrayList<E> generateArrayList(E freshElement) {
+  static <E> ArrayList<E> generateArrayList(@NullableDecl E freshElement) {
     ArrayList<E> list = Lists.newArrayList();
     list.add(freshElement);
     return list;
   }
 
   @Generates
-  private static <E> LinkedList<E> generateLinkedList(E freshElement) {
+  static <E> LinkedList<E> generateLinkedList(@NullableDecl E freshElement) {
     LinkedList<E> list = Lists.newLinkedList();
     list.add(freshElement);
     return list;
   }
 
   @Generates
-  private static <E> ImmutableList<E> generateImmutableList(E freshElement) {
+  static <E> ImmutableList<E> generateImmutableList(E freshElement) {
     return ImmutableList.of(freshElement);
   }
 
   @Generates
-  private static <E> ImmutableCollection<E> generateImmutableCollection(E freshElement) {
+  static <E> ImmutableCollection<E> generateImmutableCollection(E freshElement) {
     return generateImmutableList(freshElement);
   }
 
   @Generates
-  private static <E> Set<E> generateSet(E freshElement) {
+  static <E> Set<E> generateSet(@NullableDecl E freshElement) {
     return generateHashSet(freshElement);
   }
 
   @Generates
-  private static <E> HashSet<E> generateHashSet(E freshElement) {
+  static <E> HashSet<E> generateHashSet(@NullableDecl E freshElement) {
     return generateLinkedHashSet(freshElement);
   }
 
   @Generates
-  private static <E> LinkedHashSet<E> generateLinkedHashSet(E freshElement) {
+  static <E> LinkedHashSet<E> generateLinkedHashSet(@NullableDecl E freshElement) {
     LinkedHashSet<E> set = Sets.newLinkedHashSet();
     set.add(freshElement);
     return set;
   }
 
   @Generates
-  private static <E> ImmutableSet<E> generateImmutableSet(E freshElement) {
+  static <E> ImmutableSet<E> generateImmutableSet(E freshElement) {
     return ImmutableSet.of(freshElement);
   }
 
   @Generates
-  private static <E extends Comparable<? super E>> SortedSet<E> generateSortedSet(E freshElement) {
+  static <E extends Comparable<? super E>> SortedSet<E> generateSortedSet(E freshElement) {
     return generateNavigableSet(freshElement);
   }
 
   @Generates
-  private static <E extends Comparable<? super E>> NavigableSet<E> generateNavigableSet(
-      E freshElement) {
+  static <E extends Comparable<? super E>> NavigableSet<E> generateNavigableSet(E freshElement) {
     return generateTreeSet(freshElement);
   }
 
   @Generates
-  private static <E extends Comparable<? super E>> TreeSet<E> generateTreeSet(E freshElement) {
+  static <E extends Comparable<? super E>> TreeSet<E> generateTreeSet(E freshElement) {
     TreeSet<E> set = Sets.newTreeSet();
     set.add(freshElement);
     return set;
   }
 
   @Generates
-  private static <E extends Comparable<? super E>> ImmutableSortedSet<E> generateImmutableSortedSet(
+  static <E extends Comparable<? super E>> ImmutableSortedSet<E> generateImmutableSortedSet(
       E freshElement) {
     return ImmutableSortedSet.of(freshElement);
   }
 
   @Generates
-  private static <E> Multiset<E> generateMultiset(E freshElement) {
+  static <E> Multiset<E> generateMultiset(@NullableDecl E freshElement) {
     return generateHashMultiset(freshElement);
   }
 
   @Generates
-  private static <E> HashMultiset<E> generateHashMultiset(E freshElement) {
+  static <E> HashMultiset<E> generateHashMultiset(@NullableDecl E freshElement) {
     HashMultiset<E> multiset = HashMultiset.create();
     multiset.add(freshElement);
     return multiset;
   }
 
   @Generates
-  private static <E> LinkedHashMultiset<E> generateLinkedHashMultiset(E freshElement) {
+  static <E> LinkedHashMultiset<E> generateLinkedHashMultiset(@NullableDecl E freshElement) {
     LinkedHashMultiset<E> multiset = LinkedHashMultiset.create();
     multiset.add(freshElement);
     return multiset;
   }
 
   @Generates
-  private static <E> ImmutableMultiset<E> generateImmutableMultiset(E freshElement) {
+  static <E> ImmutableMultiset<E> generateImmutableMultiset(E freshElement) {
     return ImmutableMultiset.of(freshElement);
   }
 
   @Generates
-  private static <E extends Comparable<E>> SortedMultiset<E> generateSortedMultiset(
-      E freshElement) {
+  static <E extends Comparable<E>> SortedMultiset<E> generateSortedMultiset(E freshElement) {
     return generateTreeMultiset(freshElement);
   }
 
   @Generates
-  private static <E extends Comparable<E>> TreeMultiset<E> generateTreeMultiset(E freshElement) {
+  static <E extends Comparable<E>> TreeMultiset<E> generateTreeMultiset(E freshElement) {
     TreeMultiset<E> multiset = TreeMultiset.create();
     multiset.add(freshElement);
     return multiset;
   }
 
   @Generates
-  private static <E extends Comparable<E>>
-      ImmutableSortedMultiset<E> generateImmutableSortedMultiset(E freshElement) {
+  static <E extends Comparable<E>> ImmutableSortedMultiset<E> generateImmutableSortedMultiset(
+      E freshElement) {
     return ImmutableSortedMultiset.of(freshElement);
   }
 
   @Generates
-  private static <K, V> Map<K, V> generateMap(K key, V value) {
+  static <K, V> Map<K, V> generateMap(@NullableDecl K key, @NullableDecl V value) {
     return generateHashdMap(key, value);
   }
 
   @Generates
-  private static <K, V> HashMap<K, V> generateHashdMap(K key, V value) {
+  static <K, V> HashMap<K, V> generateHashdMap(@NullableDecl K key, @NullableDecl V value) {
     return generateLinkedHashMap(key, value);
   }
 
   @Generates
-  private static <K, V> LinkedHashMap<K, V> generateLinkedHashMap(K key, V value) {
+  static <K, V> LinkedHashMap<K, V> generateLinkedHashMap(
+      @NullableDecl K key, @NullableDecl V value) {
     LinkedHashMap<K, V> map = Maps.newLinkedHashMap();
     map.put(key, value);
     return map;
   }
 
   @Generates
-  private static <K, V> ImmutableMap<K, V> generateImmutableMap(K key, V value) {
+  static <K, V> ImmutableMap<K, V> generateImmutableMap(K key, V value) {
     return ImmutableMap.of(key, value);
   }
 
   @Empty
-  private static <K, V> ConcurrentMap<K, V> generateConcurrentMap() {
+  static <K, V> ConcurrentMap<K, V> generateConcurrentMap() {
     return Maps.newConcurrentMap();
   }
 
   @Generates
-  private static <K, V> ConcurrentMap<K, V> generateConcurrentMap(K key, V value) {
+  static <K, V> ConcurrentMap<K, V> generateConcurrentMap(K key, V value) {
     ConcurrentMap<K, V> map = Maps.newConcurrentMap();
     map.put(key, value);
     return map;
   }
 
   @Generates
-  private static <K extends Comparable<? super K>, V> SortedMap<K, V> generateSortedMap(
-      K key, V value) {
+  static <K extends Comparable<? super K>, V> SortedMap<K, V> generateSortedMap(
+      K key, @NullableDecl V value) {
     return generateNavigableMap(key, value);
   }
 
   @Generates
-  private static <K extends Comparable<? super K>, V> NavigableMap<K, V> generateNavigableMap(
-      K key, V value) {
+  static <K extends Comparable<? super K>, V> NavigableMap<K, V> generateNavigableMap(
+      K key, @NullableDecl V value) {
     return generateTreeMap(key, value);
   }
 
   @Generates
-  private static <K extends Comparable<? super K>, V> TreeMap<K, V> generateTreeMap(
-      K key, V value) {
+  static <K extends Comparable<? super K>, V> TreeMap<K, V> generateTreeMap(
+      K key, @NullableDecl V value) {
     TreeMap<K, V> map = Maps.newTreeMap();
     map.put(key, value);
     return map;
   }
 
   @Generates
-  private static <K extends Comparable<? super K>, V>
-      ImmutableSortedMap<K, V> generateImmutableSortedMap(K key, V value) {
+  static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> generateImmutableSortedMap(
+      K key, V value) {
     return ImmutableSortedMap.of(key, value);
   }
 
   @Generates
-  private static <K, V> Multimap<K, V> generateMultimap(K key, V value) {
+  static <K, V> Multimap<K, V> generateMultimap(@NullableDecl K key, @NullableDecl V value) {
     return generateListMultimap(key, value);
   }
 
   @Generates
-  private static <K, V> ImmutableMultimap<K, V> generateImmutableMultimap(K key, V value) {
+  static <K, V> ImmutableMultimap<K, V> generateImmutableMultimap(K key, V value) {
     return ImmutableMultimap.of(key, value);
   }
 
   @Generates
-  private static <K, V> ListMultimap<K, V> generateListMultimap(K key, V value) {
+  static <K, V> ListMultimap<K, V> generateListMultimap(
+      @NullableDecl K key, @NullableDecl V value) {
     return generateArrayListMultimap(key, value);
   }
 
   @Generates
-  private static <K, V> ArrayListMultimap<K, V> generateArrayListMultimap(K key, V value) {
+  static <K, V> ArrayListMultimap<K, V> generateArrayListMultimap(
+      @NullableDecl K key, @NullableDecl V value) {
     ArrayListMultimap<K, V> multimap = ArrayListMultimap.create();
     multimap.put(key, value);
     return multimap;
   }
 
   @Generates
-  private static <K, V> ImmutableListMultimap<K, V> generateImmutableListMultimap(K key, V value) {
+  static <K, V> ImmutableListMultimap<K, V> generateImmutableListMultimap(K key, V value) {
     return ImmutableListMultimap.of(key, value);
   }
 
   @Generates
-  private static <K, V> SetMultimap<K, V> generateSetMultimap(K key, V value) {
+  static <K, V> SetMultimap<K, V> generateSetMultimap(@NullableDecl K key, @NullableDecl V value) {
     return generateLinkedHashMultimap(key, value);
   }
 
   @Generates
-  private static <K, V> HashMultimap<K, V> generateHashMultimap(K key, V value) {
+  static <K, V> HashMultimap<K, V> generateHashMultimap(
+      @NullableDecl K key, @NullableDecl V value) {
     HashMultimap<K, V> multimap = HashMultimap.create();
     multimap.put(key, value);
     return multimap;
   }
 
   @Generates
-  private static <K, V> LinkedHashMultimap<K, V> generateLinkedHashMultimap(K key, V value) {
+  static <K, V> LinkedHashMultimap<K, V> generateLinkedHashMultimap(
+      @NullableDecl K key, @NullableDecl V value) {
     LinkedHashMultimap<K, V> multimap = LinkedHashMultimap.create();
     multimap.put(key, value);
     return multimap;
   }
 
   @Generates
-  private static <K, V> ImmutableSetMultimap<K, V> generateImmutableSetMultimap(K key, V value) {
+  static <K, V> ImmutableSetMultimap<K, V> generateImmutableSetMultimap(K key, V value) {
     return ImmutableSetMultimap.of(key, value);
   }
 
   @Generates
-  private static <K, V> BiMap<K, V> generateBimap(K key, V value) {
+  static <K, V> BiMap<K, V> generateBimap(@NullableDecl K key, @NullableDecl V value) {
     return generateHashBiMap(key, value);
   }
 
   @Generates
-  private static <K, V> HashBiMap<K, V> generateHashBiMap(K key, V value) {
+  static <K, V> HashBiMap<K, V> generateHashBiMap(@NullableDecl K key, @NullableDecl V value) {
     HashBiMap<K, V> bimap = HashBiMap.create();
     bimap.put(key, value);
     return bimap;
   }
 
   @Generates
-  private static <K, V> ImmutableBiMap<K, V> generateImmutableBimap(K key, V value) {
+  static <K, V> ImmutableBiMap<K, V> generateImmutableBimap(K key, V value) {
     return ImmutableBiMap.of(key, value);
   }
 
   @Generates
-  private static <R, C, V> Table<R, C, V> generateTable(R row, C column, V value) {
+  static <R, C, V> Table<R, C, V> generateTable(
+      @NullableDecl R row, @NullableDecl C column, @NullableDecl V value) {
     return generateHashBasedTable(row, column, value);
   }
 
   @Generates
-  private static <R, C, V> HashBasedTable<R, C, V> generateHashBasedTable(
-      R row, C column, V value) {
+  static <R, C, V> HashBasedTable<R, C, V> generateHashBasedTable(
+      @NullableDecl R row, @NullableDecl C column, @NullableDecl V value) {
     HashBasedTable<R, C, V> table = HashBasedTable.create();
     table.put(row, column, value);
     return table;
@@ -917,14 +921,14 @@
 
   @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such
   @Generates
-  private static <R extends Comparable, C extends Comparable, V>
+  static <R extends Comparable, C extends Comparable, V>
       RowSortedTable<R, C, V> generateRowSortedTable(R row, C column, V value) {
     return generateTreeBasedTable(row, column, value);
   }
 
   @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such
   @Generates
-  private static <R extends Comparable, C extends Comparable, V>
+  static <R extends Comparable, C extends Comparable, V>
       TreeBasedTable<R, C, V> generateTreeBasedTable(R row, C column, V value) {
     TreeBasedTable<R, C, V> table = TreeBasedTable.create();
     table.put(row, column, value);
@@ -932,85 +936,84 @@
   }
 
   @Generates
-  private static <R, C, V> ImmutableTable<R, C, V> generateImmutableTable(
-      R row, C column, V value) {
+  static <R, C, V> ImmutableTable<R, C, V> generateImmutableTable(R row, C column, V value) {
     return ImmutableTable.of(row, column, value);
   }
 
   // common.reflect
   @Generates
-  private TypeToken<?> generateTypeToken() {
+  TypeToken<?> generateTypeToken() {
     return TypeToken.of(generateClass());
   }
 
   // io types
   @Generates
-  private File generateFile() {
+  File generateFile() {
     return new File(generateString());
   }
 
   @Generates
-  private static ByteArrayInputStream generateByteArrayInputStream() {
+  static ByteArrayInputStream generateByteArrayInputStream() {
     return new ByteArrayInputStream(new byte[0]);
   }
 
   @Generates
-  private static InputStream generateInputStream() {
+  static InputStream generateInputStream() {
     return generateByteArrayInputStream();
   }
 
   @Generates
-  private StringReader generateStringReader() {
+  StringReader generateStringReader() {
     return new StringReader(generateString());
   }
 
   @Generates
-  private Reader generateReader() {
+  Reader generateReader() {
     return generateStringReader();
   }
 
   @Generates
-  private Readable generateReadable() {
+  Readable generateReadable() {
     return generateReader();
   }
 
   @Generates
-  private Buffer generateBuffer() {
+  Buffer generateBuffer() {
     return generateCharBuffer();
   }
 
   @Generates
-  private CharBuffer generateCharBuffer() {
+  CharBuffer generateCharBuffer() {
     return CharBuffer.allocate(generateInt());
   }
 
   @Generates
-  private ByteBuffer generateByteBuffer() {
+  ByteBuffer generateByteBuffer() {
     return ByteBuffer.allocate(generateInt());
   }
 
   @Generates
-  private ShortBuffer generateShortBuffer() {
+  ShortBuffer generateShortBuffer() {
     return ShortBuffer.allocate(generateInt());
   }
 
   @Generates
-  private IntBuffer generateIntBuffer() {
+  IntBuffer generateIntBuffer() {
     return IntBuffer.allocate(generateInt());
   }
 
   @Generates
-  private LongBuffer generateLongBuffer() {
+  LongBuffer generateLongBuffer() {
     return LongBuffer.allocate(generateInt());
   }
 
   @Generates
-  private FloatBuffer generateFloatBuffer() {
+  FloatBuffer generateFloatBuffer() {
     return FloatBuffer.allocate(generateInt());
   }
 
   @Generates
-  private DoubleBuffer generateDoubleBuffer() {
+  DoubleBuffer generateDoubleBuffer() {
     return DoubleBuffer.allocate(generateInt());
   }
 }
diff --git a/android/guava-testlib/src/com/google/common/testing/NullPointerTester.java b/android/guava-testlib/src/com/google/common/testing/NullPointerTester.java
index a32a53b..e32a950 100644
--- a/android/guava-testlib/src/com/google/common/testing/NullPointerTester.java
+++ b/android/guava-testlib/src/com/google/common/testing/NullPointerTester.java
@@ -52,7 +52,7 @@
 /**
  * A test utility that verifies that your methods and constructors throw {@link
  * NullPointerException} or {@link UnsupportedOperationException} whenever null is passed to a
- * parameter that isn't annotated with an annotation with the simple name {@code Nullable}, {@lcode
+ * parameter that isn't annotated with an annotation with the simple name {@code Nullable}, {@code
  * CheckForNull}, {@link NullableType}, or {@link NullableDecl}.
  *
  * <p>The tested methods and constructors are invoked -- each time with one parameter being null and
@@ -474,7 +474,8 @@
   }
 
   private static final ImmutableSet<String> NULLABLE_ANNOTATION_SIMPLE_NAMES =
-      ImmutableSet.of("CheckForNull", "Nullable", "NullableDecl", "NullableType");
+      ImmutableSet.of(
+          "CheckForNull", "Nullable", "NullableDecl", "NullableType", "ParametricNullness");
 
   static boolean isNullable(AnnotatedElement e) {
     for (Annotation annotation : e.getAnnotations()) {
@@ -490,7 +491,7 @@
   }
 
   /**
-   * Returns true if the the given member is a method that overrides {@link Object#equals(Object)}.
+   * Returns true if the given member is a method that overrides {@link Object#equals(Object)}.
    *
    * <p>The documentation for {@link Object#equals} says it should accept null, so don't require an
    * explicit {@code @NullableDecl} annotation (see <a
diff --git a/android/guava-testlib/src/com/google/common/testing/SerializableTester.java b/android/guava-testlib/src/com/google/common/testing/SerializableTester.java
index 65445e5..6298076 100644
--- a/android/guava-testlib/src/com/google/common/testing/SerializableTester.java
+++ b/android/guava-testlib/src/com/google/common/testing/SerializableTester.java
@@ -29,7 +29,6 @@
  * serialization tests require more setup. This no-op behavior allows test authors to intersperse
  * {@code SerializableTester} calls with other, GWT-compatible tests.
  *
- *
  * @author Mike Bostock
  * @since 10.0
  */
diff --git a/android/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractListenableFutureTest.java b/android/guava-testlib/src/com/google/common/util/concurrent/testing/AbstractListenableFutureTest.java
old mode 100755
new mode 100644
diff --git a/android/guava-testlib/src/com/google/common/util/concurrent/testing/MockFutureListener.java b/android/guava-testlib/src/com/google/common/util/concurrent/testing/MockFutureListener.java
old mode 100755
new mode 100644
diff --git a/android/guava-testlib/src/com/google/common/util/concurrent/testing/SameThreadScheduledExecutorService.java b/android/guava-testlib/src/com/google/common/util/concurrent/testing/SameThreadScheduledExecutorService.java
old mode 100755
new mode 100644
diff --git a/android/guava-testlib/src/com/google/common/util/concurrent/testing/TestingExecutors.java b/android/guava-testlib/src/com/google/common/util/concurrent/testing/TestingExecutors.java
old mode 100755
new mode 100644
diff --git a/android/guava-testlib/test/com/google/common/collect/testing/MapTestSuiteBuilderTests.java b/android/guava-testlib/test/com/google/common/collect/testing/MapTestSuiteBuilderTests.java
index 1a54f68..a4d216d 100644
--- a/android/guava-testlib/test/com/google/common/collect/testing/MapTestSuiteBuilderTests.java
+++ b/android/guava-testlib/test/com/google/common/collect/testing/MapTestSuiteBuilderTests.java
@@ -26,6 +26,11 @@
 import com.google.common.collect.testing.features.CollectionSize;
 import com.google.common.collect.testing.features.Feature;
 import com.google.common.collect.testing.features.MapFeature;
+import com.google.common.reflect.Reflection;
+import java.io.Serializable;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.AbstractMap;
 import java.util.AbstractSet;
 import java.util.Collection;
@@ -36,6 +41,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
@@ -52,6 +58,7 @@
     TestSuite suite = new TestSuite(MapTestSuiteBuilderTests.class.getSimpleName());
     suite.addTest(testsForHashMapNullKeysForbidden());
     suite.addTest(testsForHashMapNullValuesForbidden());
+    suite.addTest(testsForSetUpTearDown());
     return suite;
   }
 
@@ -252,4 +259,89 @@
         "HashMap w/out null values",
         ALLOWS_NULL_KEYS);
   }
+
+  /**
+   * Map generator that verifies that {@code setUp()} methods are called in all the test cases. The
+   * {@code setUpRan} parameter is set true by the {@code setUp} that every test case is supposed to
+   * have registered, and set false by the {@code tearDown}. We use a dynamic proxy to intercept all
+   * of the {@code Map} method calls and check that {@code setUpRan} is true.
+   */
+  private static class CheckSetUpHashMapGenerator extends WrappedHashMapGenerator {
+    private final AtomicBoolean setUpRan;
+
+    CheckSetUpHashMapGenerator(AtomicBoolean setUpRan) {
+      this.setUpRan = setUpRan;
+    }
+
+    @Override
+    Map<String, String> wrap(HashMap<String, String> map) {
+      @SuppressWarnings("unchecked")
+      Map<String, String> proxy =
+          Reflection.newProxy(Map.class, new CheckSetUpInvocationHandler(map, setUpRan));
+      return proxy;
+    }
+  }
+
+  /**
+   * Intercepts calls to a {@code Map} to check that {@code setUpRan} is true when they happen. Then
+   * forwards the calls to the underlying {@code Map}.
+   */
+  private static class CheckSetUpInvocationHandler implements InvocationHandler, Serializable {
+    private final Map<String, String> map;
+    private final AtomicBoolean setUpRan;
+
+    CheckSetUpInvocationHandler(Map<String, String> map, AtomicBoolean setUpRan) {
+      this.map = map;
+      this.setUpRan = setUpRan;
+    }
+
+    @Override
+    public Object invoke(Object target, Method method, Object[] args) throws Throwable {
+      assertTrue("setUp should have run", setUpRan.get());
+      try {
+        return method.invoke(map, args);
+      } catch (InvocationTargetException e) {
+        throw e.getCause();
+      } catch (IllegalAccessException e) {
+        throw newLinkageError(e);
+      }
+    }
+  }
+
+  /** Verifies that {@code setUp} and {@code tearDown} are called in all map test cases. */
+  private static Test testsForSetUpTearDown() {
+    final AtomicBoolean setUpRan = new AtomicBoolean();
+    Runnable setUp =
+        new Runnable() {
+          @Override
+          public void run() {
+            assertFalse("previous tearDown should have run before setUp", setUpRan.getAndSet(true));
+          }
+        };
+    Runnable tearDown =
+        new Runnable() {
+          @Override
+          public void run() {
+            assertTrue("setUp should have run", setUpRan.getAndSet(false));
+          }
+        };
+    return MapTestSuiteBuilder.using(new CheckSetUpHashMapGenerator(setUpRan))
+        .named("setUpTearDown")
+        .withFeatures(
+            MapFeature.GENERAL_PURPOSE,
+            MapFeature.ALLOWS_NULL_KEYS,
+            MapFeature.ALLOWS_NULL_VALUES,
+            CollectionFeature.SERIALIZABLE,
+            CollectionFeature.SUPPORTS_ITERATOR_REMOVE,
+            CollectionSize.ANY)
+        .withSetUp(setUp)
+        .withTearDown(tearDown)
+        .createTestSuite();
+  }
+
+  private static LinkageError newLinkageError(Throwable cause) {
+    LinkageError error = new LinkageError(cause.toString());
+    error.initCause(cause);
+    return error;
+  }
 }
diff --git a/android/guava-testlib/test/com/google/common/testing/FakeTickerTest.java b/android/guava-testlib/test/com/google/common/testing/FakeTickerTest.java
index 5c00832..654304b 100644
--- a/android/guava-testlib/test/com/google/common/testing/FakeTickerTest.java
+++ b/android/guava-testlib/test/com/google/common/testing/FakeTickerTest.java
@@ -151,7 +151,7 @@
     final CountDownLatch startLatch = new CountDownLatch(numberOfThreads);
     final CountDownLatch doneLatch = new CountDownLatch(numberOfThreads);
     for (int i = numberOfThreads; i > 0; i--) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError =
           executorService.submit(
               new Callable<Void>() {
diff --git a/android/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java b/android/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
index 99f01d6..d1dc49b 100644
--- a/android/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
+++ b/android/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
@@ -54,6 +54,7 @@
  * @author Kevin Bourrillion
  * @author Mick Killianey
  */
+@SuppressWarnings("CheckReturnValue")
 public class NullPointerTesterTest extends TestCase {
 
   /** Non-NPE RuntimeException. */
diff --git a/android/guava-testlib/test/com/google/common/testing/PackageSanityTests.java b/android/guava-testlib/test/com/google/common/testing/PackageSanityTests.java
index cf446d2..d5483d3 100644
--- a/android/guava-testlib/test/com/google/common/testing/PackageSanityTests.java
+++ b/android/guava-testlib/test/com/google/common/testing/PackageSanityTests.java
@@ -16,6 +16,7 @@
 
 package com.google.common.testing;
 
+
 /** Test nulls for the entire package. */
 
 public class PackageSanityTests extends AbstractPackageSanityTests {}
diff --git a/android/guava-testlib/test/com/google/common/util/concurrent/testing/TestingExecutorsTest.java b/android/guava-testlib/test/com/google/common/util/concurrent/testing/TestingExecutorsTest.java
old mode 100755
new mode 100644
diff --git a/android/guava-tests/benchmark/com/google/common/base/CharMatcherBenchmark.java b/android/guava-tests/benchmark/com/google/common/base/CharMatcherBenchmark.java
index e2ba458..9dee99b 100644
--- a/android/guava-tests/benchmark/com/google/common/base/CharMatcherBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/base/CharMatcherBenchmark.java
@@ -29,7 +29,6 @@
 /**
  * Benchmark for the {@link CharMatcher} class.
  *
- *
  * @author David Beaumont
  * @author Kevin Bourrillion
  * @author David Richter
diff --git a/android/guava-tests/benchmark/com/google/common/base/StringsRepeatBenchmark.java b/android/guava-tests/benchmark/com/google/common/base/StringsRepeatBenchmark.java
index 30261da..16e00ef 100644
--- a/android/guava-tests/benchmark/com/google/common/base/StringsRepeatBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/base/StringsRepeatBenchmark.java
@@ -40,7 +40,7 @@
   }
 
   @Benchmark
-  void oldRepeat(int reps) {
+  void oldRepeat(long reps) {
     for (int i = 0; i < reps; i++) {
       String x = oldRepeat(originalString, count);
       if (x.length() != (originalString.length() * count)) {
@@ -62,7 +62,7 @@
   }
 
   @Benchmark
-  void mikeRepeat(int reps) {
+  void mikeRepeat(long reps) {
     for (int i = 0; i < reps; i++) {
       String x = mikeRepeat(originalString, count);
       if (x.length() != (originalString.length() * count)) {
@@ -95,7 +95,7 @@
   }
 
   @Benchmark
-  void martinRepeat(int reps) {
+  void martinRepeat(long reps) {
     for (int i = 0; i < reps; i++) {
       String x = martinRepeat(originalString, count);
       if (x.length() != (originalString.length() * count)) {
diff --git a/android/guava-tests/benchmark/com/google/common/base/ToStringHelperBenchmark.java b/android/guava-tests/benchmark/com/google/common/base/ToStringHelperBenchmark.java
index 6b33599..47dd8f4 100644
--- a/android/guava-tests/benchmark/com/google/common/base/ToStringHelperBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/base/ToStringHelperBenchmark.java
@@ -18,6 +18,8 @@
 
 import com.google.caliper.Benchmark;
 import com.google.caliper.Param;
+import java.util.Arrays;
+import java.util.Collections;
 
 /**
  * Some microbenchmarks for the {@link MoreObjects.ToStringHelper} class.
@@ -26,33 +28,114 @@
  */
 public class ToStringHelperBenchmark {
 
-  @Param({"0", "2", "5", "10"})
+  @Param({"0", "1", "5"})
   int dataSize;
 
-  private static final String NAME = "abcdefgh";
-  private static final String NAME3 = Strings.repeat(NAME, 3);
+  @Param({"false", "true"})
+  boolean omitNulls;
 
-  private static void addEntries(MoreObjects.ToStringHelper helper) {
-    helper
-        .add(NAME, 10)
-        .addValue(10L)
-        .add(NAME, 3.14f)
-        .addValue(3.14d)
-        .add(NAME3, false)
-        .add(NAME3, NAME3)
-        .add(NAME3, 'x');
+  enum Dataset {
+    SMALL {
+      void addEntries(MoreObjects.ToStringHelper helper) {
+        helper
+            .add(SHORT_NAME, 10)
+            .addValue(10L)
+            .add(SHORT_NAME, 3.14f)
+            .addValue(3.14d)
+            .add(LONG_NAME, false)
+            .add(LONG_NAME, LONG_NAME);
+      }
+    },
+    CONDITIONAL {
+      void addEntries(MoreObjects.ToStringHelper helper) {
+        helper
+            .add(SHORT_NAME, "x")
+            .add(LONG_NAME, "y")
+            .add(SHORT_NAME, null)
+            .add(LONG_NAME, null)
+            .addValue("z")
+            .addValue("")
+            .addValue(null)
+            .add(SHORT_NAME, Arrays.asList("A"))
+            .add(LONG_NAME, Arrays.asList("B"))
+            .add(SHORT_NAME, Arrays.asList())
+            .add(LONG_NAME, Arrays.asList())
+            .addValue(Arrays.asList("C"))
+            .addValue(Arrays.asList())
+            .add(SHORT_NAME, Collections.singletonMap("k1", "v1"))
+            .add(LONG_NAME, Collections.singletonMap("k2", "v2"))
+            .addValue(Collections.singletonMap("k3", "v3"))
+            .addValue(Collections.emptyMap())
+            .addValue(null)
+            .add(SHORT_NAME, Optional.of("1"))
+            .add(LONG_NAME, Optional.of("1"))
+            .add(SHORT_NAME, Optional.absent())
+            .add(LONG_NAME, Optional.absent())
+            .add(SHORT_NAME, Optional.of("2"))
+            .add(SHORT_NAME, Optional.absent())
+            .addValue(null)
+            .add(SHORT_NAME, new int[] {1})
+            .add(LONG_NAME, new int[] {2})
+            .addValue(new int[] {3})
+            .addValue(new int[] {})
+            .addValue(null);
+      }
+    },
+    UNCONDITIONAL {
+      void addEntries(MoreObjects.ToStringHelper helper) {
+        helper
+            .add(SHORT_NAME, false)
+            .add(LONG_NAME, false)
+            .addValue(true)
+            .add(SHORT_NAME, (byte) 1)
+            .add(LONG_NAME, (byte) 2)
+            .addValue((byte) 3)
+            .add(SHORT_NAME, 'A')
+            .add(LONG_NAME, 'B')
+            .addValue('C')
+            .add(SHORT_NAME, (short) 4)
+            .add(LONG_NAME, (short) 5)
+            .addValue((short) 6)
+            .add(SHORT_NAME, 7)
+            .add(LONG_NAME, 8)
+            .addValue(9)
+            .add(SHORT_NAME, 10L)
+            .add(LONG_NAME, 11L)
+            .addValue(12L)
+            .add(SHORT_NAME, 13.0f)
+            .add(LONG_NAME, 14.0f)
+            .addValue(15.0f);
+      }
+    };
+
+    void addEntries(MoreObjects.ToStringHelper helper) {}
+  }
+
+  @Param Dataset dataset;
+
+  private static final String SHORT_NAME = "userId";
+  private static final String LONG_NAME = "fluxCapacitorFailureRate95Percentile";
+
+  private MoreObjects.ToStringHelper newHelper() {
+    MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper("klass");
+    if (omitNulls) {
+      helper = helper.omitNullValues();
+    }
+    return helper;
   }
 
   @Benchmark
   int toString(int reps) {
     int dummy = 0;
     for (int i = 0; i < reps; i++) {
-      MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper("klass").omitNullValues();
+      MoreObjects.ToStringHelper helper = newHelper();
       for (int j = 0; j < dataSize; ++j) {
-        addEntries(helper);
+        dataset.addEntries(helper);
       }
       dummy ^= helper.toString().hashCode();
     }
     return dummy;
   }
+
+  // When omitEmptyValues() is released, remove this method and add a new @Param "omitEmptyValues".
 }
diff --git a/android/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java b/android/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java
index e1b94a3..c9df774 100644
--- a/android/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java
@@ -252,7 +252,7 @@
     final AtomicInteger integer = new AtomicInteger();
     // Execute a bunch of tasks to ensure that our threads are allocated and hot
     for (int i = 0; i < NUM_THREADS * 10; i++) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError =
           executorService.submit(
               new Runnable() {
@@ -334,10 +334,10 @@
       list = impl.newExecutionList();
       listenerLatch = new CountDownLatch(numListeners * NUM_THREADS);
       for (int j = 0; j < NUM_THREADS; j++) {
-        @SuppressWarnings("unused") // go/futurereturn-lsc
+        @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
         Future<?> possiblyIgnoredError = executorService.submit(addTask);
       }
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError = executorService.submit(executeTask);
       returnValue += (int) listenerLatch.getCount();
       listenerLatch.await();
@@ -360,10 +360,10 @@
     for (int i = 0; i < reps; i++) {
       list = impl.newExecutionList();
       listenerLatch = new CountDownLatch(numListeners * NUM_THREADS);
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError = executorService.submit(executeTask);
       for (int j = 0; j < NUM_THREADS; j++) {
-        @SuppressWarnings("unused") // go/futurereturn-lsc
+        @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
         Future<?> possiblyIgnoredError1 = executorService.submit(addTask);
       }
       returnValue += (int) listenerLatch.getCount();
diff --git a/android/guava-tests/benchmark/com/google/common/util/concurrent/FuturesGetCheckedBenchmark.java b/android/guava-tests/benchmark/com/google/common/util/concurrent/FuturesGetCheckedBenchmark.java
index dd1883b..bb76420 100644
--- a/android/guava-tests/benchmark/com/google/common/util/concurrent/FuturesGetCheckedBenchmark.java
+++ b/android/guava-tests/benchmark/com/google/common/util/concurrent/FuturesGetCheckedBenchmark.java
@@ -21,7 +21,6 @@
 import static com.google.common.util.concurrent.Futures.immediateFailedFuture;
 import static com.google.common.util.concurrent.Futures.immediateFuture;
 import static com.google.common.util.concurrent.FuturesGetChecked.checkExceptionClassValidity;
-import static com.google.common.util.concurrent.FuturesGetChecked.classValueValidator;
 import static com.google.common.util.concurrent.FuturesGetChecked.getChecked;
 import static com.google.common.util.concurrent.FuturesGetChecked.isCheckedException;
 import static com.google.common.util.concurrent.FuturesGetChecked.weakSetValidator;
@@ -52,7 +51,7 @@
     NON_CACHING_WITH_CONSTRUCTOR_CHECK(nonCachingWithConstructorCheckValidator()),
     NON_CACHING_WITHOUT_CONSTRUCTOR_CHECK(nonCachingWithoutConstructorCheckValidator()),
     WEAK_SET(weakSetValidator()),
-    CLASS_VALUE(classValueValidator());
+    ;
 
     final GetCheckedTypeValidator validator;
 
diff --git a/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java b/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java
index 7998a72..61f735d 100644
--- a/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java
+++ b/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java
@@ -36,12 +36,12 @@
  *
  * <p>This is a classic &quot;bounded buffer&quot;, in which a fixed-sized array holds elements
  * inserted by producers and extracted by consumers. Once created, the capacity cannot be increased.
- * Attempts to <tt>put</tt> an element into a full queue will result in the operation blocking;
- * attempts to <tt>take</tt> an element from an empty queue will similarly block.
+ * Attempts to {@code put} an element into a full queue will result in the operation blocking;
+ * attempts to {@code take} an element from an empty queue will similarly block.
  *
  * <p>This class supports an optional fairness policy for ordering waiting producer and consumer
  * threads. By default, this ordering is not guaranteed. However, a queue constructed with fairness
- * set to <tt>true</tt> grants threads access in FIFO order. Fairness generally decreases throughput
+ * set to {@code true} grants threads access in FIFO order. Fairness generally decreases throughput
  * but reduces variability and avoids starvation.
  *
  * <p>This class and its iterator implement all of the <em>optional</em> methods of the {@link
@@ -139,24 +139,24 @@
   }
 
   /**
-   * Creates an <tt>MonitorBasedArrayBlockingQueue</tt> with the given (fixed) capacity and default
+   * Creates an {@code MonitorBasedArrayBlockingQueue} with the given (fixed) capacity and default
    * access policy.
    *
    * @param capacity the capacity of this queue
-   * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1
+   * @throws IllegalArgumentException if {@code capacity} is less than 1
    */
   public MonitorBasedArrayBlockingQueue(int capacity) {
     this(capacity, false);
   }
 
   /**
-   * Creates an <tt>MonitorBasedArrayBlockingQueue</tt> with the given (fixed) capacity and the
+   * Creates an {@code MonitorBasedArrayBlockingQueue} with the given (fixed) capacity and the
    * specified access policy.
    *
    * @param capacity the capacity of this queue
-   * @param fair if <tt>true</tt> then queue accesses for threads blocked on insertion or removal,
-   *     are processed in FIFO order; if <tt>false</tt> the access order is unspecified.
-   * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1
+   * @param fair if {@code true} then queue accesses for threads blocked on insertion or removal,
+   *     are processed in FIFO order; if {@code false} the access order is unspecified.
+   * @throws IllegalArgumentException if {@code capacity} is less than 1
    */
   public MonitorBasedArrayBlockingQueue(int capacity, boolean fair) {
     if (capacity <= 0) throw new IllegalArgumentException();
@@ -179,15 +179,15 @@
   }
 
   /**
-   * Creates an <tt>MonitorBasedArrayBlockingQueue</tt> with the given (fixed) capacity, the
+   * Creates an {@code MonitorBasedArrayBlockingQueue} with the given (fixed) capacity, the
    * specified access policy and initially containing the elements of the given collection, added in
    * traversal order of the collection's iterator.
    *
    * @param capacity the capacity of this queue
-   * @param fair if <tt>true</tt> then queue accesses for threads blocked on insertion or removal,
-   *     are processed in FIFO order; if <tt>false</tt> the access order is unspecified.
+   * @param fair if {@code true} then queue accesses for threads blocked on insertion or removal,
+   *     are processed in FIFO order; if {@code false} the access order is unspecified.
    * @param c the collection of elements to initially contain
-   * @throws IllegalArgumentException if <tt>capacity</tt> is less than <tt>c.size()</tt>, or less
+   * @throws IllegalArgumentException if {@code capacity} is less than {@code c.size()}, or less
    *     than 1.
    * @throws NullPointerException if the specified collection or any of its elements are null
    */
@@ -205,11 +205,11 @@
 
   /**
    * Inserts the specified element at the tail of this queue if it is possible to do so immediately
-   * without exceeding the queue's capacity, returning <tt>true</tt> upon success and throwing an
-   * <tt>IllegalStateException</tt> if this queue is full.
+   * without exceeding the queue's capacity, returning {@code true} upon success and throwing an
+   * {@code IllegalStateException} if this queue is full.
    *
    * @param e the element to add
-   * @return <tt>true</tt> (as specified by {@link Collection#add})
+   * @return {@code true} (as specified by {@link Collection#add})
    * @throws IllegalStateException if this queue is full
    * @throws NullPointerException if the specified element is null
    */
@@ -220,7 +220,7 @@
 
   /**
    * Inserts the specified element at the tail of this queue if it is possible to do so immediately
-   * without exceeding the queue's capacity, returning <tt>true</tt> upon success and <tt>false</tt>
+   * without exceeding the queue's capacity, returning {@code true} upon success and {@code false}
    * if this queue is full. This method is generally preferable to method {@link #add}, which can
    * fail to insert an element only by throwing an exception.
    *
@@ -361,11 +361,11 @@
   /**
    * Returns the number of additional elements that this queue can ideally (in the absence of memory
    * or resource constraints) accept without blocking. This is always equal to the initial capacity
-   * of this queue less the current <tt>size</tt> of this queue.
+   * of this queue less the current {@code size} of this queue.
    *
    * <p>Note that you <em>cannot</em> always tell if an attempt to insert an element will succeed by
-   * inspecting <tt>remainingCapacity</tt> because it may be the case that another thread is about
-   * to insert or remove an element.
+   * inspecting {@code remainingCapacity} because it may be the case that another thread is about to
+   * insert or remove an element.
    */
   @Override
   public int remainingCapacity() {
@@ -380,12 +380,12 @@
 
   /**
    * Removes a single instance of the specified element from this queue, if it is present. More
-   * formally, removes an element <tt>e</tt> such that <tt>o.equals(e)</tt>, if this queue contains
-   * one or more such elements. Returns <tt>true</tt> if this queue contained the specified element
+   * formally, removes an element {@code e} such that {@code o.equals(e)}, if this queue contains
+   * one or more such elements. Returns {@code true} if this queue contained the specified element
    * (or equivalently, if this queue changed as a result of the call).
    *
    * @param o element to be removed from this queue, if present
-   * @return <tt>true</tt> if this queue changed as a result of the call
+   * @return {@code true} if this queue changed as a result of the call
    */
   @Override
   public boolean remove(@NullableDecl Object o) {
@@ -410,12 +410,12 @@
   }
 
   /**
-   * Returns <tt>true</tt> if this queue contains the specified element. More formally, returns
-   * <tt>true</tt> if and only if this queue contains at least one element <tt>e</tt> such that
-   * <tt>o.equals(e)</tt>.
+   * Returns {@code true} if this queue contains the specified element. More formally, returns
+   * {@code true} if and only if this queue contains at least one element {@code e} such that {@code
+   * o.equals(e)}.
    *
    * @param o object to be checked for containment in this queue
-   * @return <tt>true</tt> if this queue contains the specified element
+   * @return {@code true} if this queue contains the specified element
    */
   @Override
   public boolean contains(@NullableDecl Object o) {
@@ -474,19 +474,19 @@
    *
    * <p>If this queue fits in the specified array with room to spare (i.e., the array has more
    * elements than this queue), the element in the array immediately following the end of the queue
-   * is set to <tt>null</tt>.
+   * is set to {@code null}.
    *
    * <p>Like the {@link #toArray()} method, this method acts as bridge between array-based and
    * collection-based APIs. Further, this method allows precise control over the runtime type of the
    * output array, and may, under certain circumstances, be used to save allocation costs.
    *
-   * <p>Suppose <tt>x</tt> is a queue known to contain only strings. The following code can be used
-   * to dump the queue into a newly allocated array of <tt>String</tt>:
+   * <p>Suppose {@code x} is a queue known to contain only strings. The following code can be used
+   * to dump the queue into a newly allocated array of {@code String}:
    *
    * <pre>
    *     String[] y = x.toArray(new String[0]);</pre>
    *
-   * <p>Note that <tt>toArray(new Object[0])</tt> is identical in function to <tt>toArray()</tt>.
+   * <p>Note that {@code toArray(new Object[0])} is identical in function to {@code toArray()}.
    *
    * @param a the array into which the elements of the queue are to be stored, if it is big enough;
    *     otherwise, a new array of the same runtime type is allocated for this purpose
@@ -626,8 +626,8 @@
   }
 
   /**
-   * Returns an iterator over the elements in this queue in proper sequence. The returned
-   * <tt>Iterator</tt> is a "weakly consistent" iterator that will never throw {@link
+   * Returns an iterator over the elements in this queue in proper sequence. The returned {@code
+   * Iterator} is a "weakly consistent" iterator that will never throw {@link
    * ConcurrentModificationException}, and guarantees to traverse elements as they existed upon
    * construction of the iterator, and may (but is not guaranteed to) reflect any modifications
    * subsequent to construction.
diff --git a/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java b/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java
index 715a9c8..086253d 100644
--- a/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java
+++ b/android/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java
@@ -35,23 +35,23 @@
 /**
  * An unbounded {@linkplain BlockingQueue blocking queue} that uses the same ordering rules as class
  * {@link PriorityQueue} and supplies blocking retrieval operations. While this queue is logically
- * unbounded, attempted additions may fail due to resource exhaustion (causing
- * <tt>OutOfMemoryError</tt>). This class does not permit <tt>null</tt> elements. A priority queue
- * relying on {@linkplain Comparable natural ordering} also does not permit insertion of
- * non-comparable objects (doing so results in <tt>ClassCastException</tt>).
+ * unbounded, attempted additions may fail due to resource exhaustion (causing {@code
+ * OutOfMemoryError}). This class does not permit {@code null} elements. A priority queue relying on
+ * {@linkplain Comparable natural ordering} also does not permit insertion of non-comparable objects
+ * (doing so results in {@code ClassCastException}).
  *
  * <p>This class and its iterator implement all of the <em>optional</em> methods of the {@link
  * Collection} and {@link Iterator} interfaces. The Iterator provided in method {@link #iterator()}
  * is <em>not</em> guaranteed to traverse the elements of the MonitorBasedPriorityBlockingQueue in
- * any particular order. If you need ordered traversal, consider using
- * <tt>Arrays.sort(pq.toArray())</tt>. Also, method <tt>drainTo</tt> can be used to <em>remove</em>
- * some or all elements in priority order and place them in another collection.
+ * any particular order. If you need ordered traversal, consider using {@code
+ * Arrays.sort(pq.toArray())}. Also, method {@code drainTo} can be used to <em>remove</em> some or
+ * all elements in priority order and place them in another collection.
  *
  * <p>Operations on this class make no guarantees about the ordering of elements with equal
  * priority. If you need to enforce an ordering, you can define custom classes or comparators that
  * use a secondary key to break ties in primary priority values. For example, here is a class that
  * applies first-in-first-out tie-breaking to comparable elements. To use it, you would insert a
- * <tt>new FIFOEntry(anEntry)</tt> instead of a plain entry object.
+ * {@code new FIFOEntry(anEntry)} instead of a plain entry object.
  *
  * <pre>
  * class FIFOEntry&lt;E extends Comparable&lt;? super E&gt;&gt;
@@ -96,32 +96,32 @@
       };
 
   /**
-   * Creates a <tt>MonitorBasedPriorityBlockingQueue</tt> with the default initial capacity (11)
-   * that orders its elements according to their {@linkplain Comparable natural ordering}.
+   * Creates a {@code MonitorBasedPriorityBlockingQueue} with the default initial capacity (11) that
+   * orders its elements according to their {@linkplain Comparable natural ordering}.
    */
   public MonitorBasedPriorityBlockingQueue() {
     q = new PriorityQueue<E>();
   }
 
   /**
-   * Creates a <tt>MonitorBasedPriorityBlockingQueue</tt> with the specified initial capacity that
+   * Creates a {@code MonitorBasedPriorityBlockingQueue} with the specified initial capacity that
    * orders its elements according to their {@linkplain Comparable natural ordering}.
    *
    * @param initialCapacity the initial capacity for this priority queue
-   * @throws IllegalArgumentException if <tt>initialCapacity</tt> is less than 1
+   * @throws IllegalArgumentException if {@code initialCapacity} is less than 1
    */
   public MonitorBasedPriorityBlockingQueue(int initialCapacity) {
     q = new PriorityQueue<E>(initialCapacity, null);
   }
 
   /**
-   * Creates a <tt>MonitorBasedPriorityBlockingQueue</tt> with the specified initial capacity that
+   * Creates a {@code MonitorBasedPriorityBlockingQueue} with the specified initial capacity that
    * orders its elements according to the specified comparator.
    *
    * @param initialCapacity the initial capacity for this priority queue
    * @param comparator the comparator that will be used to order this priority queue. If {@code
    *     null}, the {@linkplain Comparable natural ordering} of the elements will be used.
-   * @throws IllegalArgumentException if <tt>initialCapacity</tt> is less than 1
+   * @throws IllegalArgumentException if {@code initialCapacity} is less than 1
    */
   public MonitorBasedPriorityBlockingQueue(
       int initialCapacity, @NullableDecl Comparator<? super E> comparator) {
@@ -129,7 +129,7 @@
   }
 
   /**
-   * Creates a <tt>MonitorBasedPriorityBlockingQueue</tt> containing the elements in the specified
+   * Creates a {@code MonitorBasedPriorityBlockingQueue} containing the elements in the specified
    * collection. If the specified collection is a {@link SortedSet} or a {@link PriorityQueue}, this
    * priority queue will be ordered according to the same ordering. Otherwise, this priority queue
    * will be ordered according to the {@linkplain Comparable natural ordering} of its elements.
@@ -147,7 +147,7 @@
    * Inserts the specified element into this priority queue.
    *
    * @param e the element to add
-   * @return <tt>true</tt> (as specified by {@link Collection#add})
+   * @return {@code true} (as specified by {@link Collection#add})
    * @throws ClassCastException if the specified element cannot be compared with elements currently
    *     in the priority queue according to the priority queue's ordering
    * @throws NullPointerException if the specified element is null
@@ -161,7 +161,7 @@
    * Inserts the specified element into this priority queue.
    *
    * @param e the element to add
-   * @return <tt>true</tt> (as specified by {@link Queue#offer})
+   * @return {@code true} (as specified by {@link Queue#offer})
    * @throws ClassCastException if the specified element cannot be compared with elements currently
    *     in the priority queue according to the priority queue's ordering
    * @throws NullPointerException if the specified element is null
@@ -188,7 +188,7 @@
    * @param e the element to add
    * @param timeout This parameter is ignored as the method never blocks
    * @param unit This parameter is ignored as the method never blocks
-   * @return <tt>true</tt>
+   * @return {@code true}
    * @throws ClassCastException if the specified element cannot be compared with elements currently
    *     in the priority queue according to the priority queue's ordering
    * @throws NullPointerException if the specified element is null
@@ -261,10 +261,10 @@
   }
 
   /**
-   * Returns the comparator used to order the elements in this queue, or <tt>null</tt> if this queue
+   * Returns the comparator used to order the elements in this queue, or {@code null} if this queue
    * uses the {@linkplain Comparable natural ordering} of its elements.
    *
-   * @return the comparator used to order the elements in this queue, or <tt>null</tt> if this queue
+   * @return the comparator used to order the elements in this queue, or {@code null} if this queue
    *     uses the natural ordering of its elements
    */
   public Comparator<? super E> comparator() {
@@ -283,10 +283,10 @@
   }
 
   /**
-   * Always returns <tt>Integer.MAX_VALUE</tt> because a <tt>MonitorBasedPriorityBlockingQueue</tt>
-   * is not capacity constrained.
+   * Always returns {@code Integer.MAX_VALUE} because a {@code MonitorBasedPriorityBlockingQueue} is
+   * not capacity constrained.
    *
-   * @return <tt>Integer.MAX_VALUE</tt>
+   * @return {@code Integer.MAX_VALUE}
    */
   @Override
   public int remainingCapacity() {
@@ -300,7 +300,7 @@
    * specified element (or equivalently, if this queue changed as a result of the call).
    *
    * @param o element to be removed from this queue, if present
-   * @return <tt>true</tt> if this queue changed as a result of the call
+   * @return {@code true} if this queue changed as a result of the call
    */
   @Override
   public boolean remove(@NullableDecl Object o) {
@@ -319,7 +319,7 @@
    * o.equals(e)}.
    *
    * @param o object to be checked for containment in this queue
-   * @return <tt>true</tt> if this queue contains the specified element
+   * @return {@code true} if this queue contains the specified element
    */
   @Override
   public boolean contains(@NullableDecl Object o) {
@@ -363,19 +363,19 @@
    *
    * <p>If this queue fits in the specified array with room to spare (i.e., the array has more
    * elements than this queue), the element in the array immediately following the end of the queue
-   * is set to <tt>null</tt>.
+   * is set to {@code null}.
    *
    * <p>Like the {@link #toArray()} method, this method acts as bridge between array-based and
    * collection-based APIs. Further, this method allows precise control over the runtime type of the
    * output array, and may, under certain circumstances, be used to save allocation costs.
    *
-   * <p>Suppose <tt>x</tt> is a queue known to contain only strings. The following code can be used
-   * to dump the queue into a newly allocated array of <tt>String</tt>:
+   * <p>Suppose {@code x} is a queue known to contain only strings. The following code can be used
+   * to dump the queue into a newly allocated array of {@code String}:
    *
    * <pre>
    *     String[] y = x.toArray(new String[0]);</pre>
    *
-   * <p>Note that <tt>toArray(new Object[0])</tt> is identical in function to <tt>toArray()</tt>.
+   * <p>Note that {@code toArray(new Object[0])} is identical in function to {@code toArray()}.
    *
    * @param a the array into which the elements of the queue are to be stored, if it is big enough;
    *     otherwise, a new array of the same runtime type is allocated for this purpose
@@ -474,7 +474,7 @@
 
   /**
    * Returns an iterator over the elements in this queue. The iterator does not return the elements
-   * in any particular order. The returned <tt>Iterator</tt> is a "weakly consistent" iterator that
+   * in any particular order. The returned {@code Iterator} is a "weakly consistent" iterator that
    * will never throw {@link ConcurrentModificationException}, and guarantees to traverse elements
    * as they existed upon construction of the iterator, and may (but is not guaranteed to) reflect
    * any modifications subsequent to construction.
diff --git a/android/guava-tests/pom.xml b/android/guava-tests/pom.xml
index 5191c8e..7f57d87 100644
--- a/android/guava-tests/pom.xml
+++ b/android/guava-tests/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>30.0-android</version>
+    <version>31.0.1-android</version>
   </parent>
   <artifactId>guava-tests</artifactId>
   <name>Guava Unit Tests</name>
@@ -102,6 +102,9 @@
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>animal-sniffer-maven-plugin</artifactId>
+        <configuration>
+          <checkTestClasses>false</checkTestClasses> <!-- TODO(cpovirk): Consider checking them. -->
+        </configuration>
       </plugin>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
diff --git a/android/guava-tests/test/com/google/common/base/AbstractIteratorTest.java b/android/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
index e8f8b93..da732bf 100644
--- a/android/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
+++ b/android/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
@@ -171,6 +171,7 @@
     }
   }
 
+
   @GwtIncompatible // weak references
   public void testFreesNextReference() {
     Iterator<Object> itr =
diff --git a/android/guava-tests/test/com/google/common/base/AndroidIncompatible.java b/android/guava-tests/test/com/google/common/base/AndroidIncompatible.java
index e3a250d..5e190a3 100644
--- a/android/guava-tests/test/com/google/common/base/AndroidIncompatible.java
+++ b/android/guava-tests/test/com/google/common/base/AndroidIncompatible.java
@@ -32,7 +32,6 @@
  * Google-internal Android suite generators. Note that those generators also suppress any test
  * annotated with MediumTest or LargeTest.
  *
- *
  * <p>Why use a custom annotation instead of {@code android.test.suitebuilder.annotation.Suppress}?
  * I'm not completely sure that this is the right choice, but it has various advantages:
  *
diff --git a/android/guava-tests/test/com/google/common/base/EnumsTest.java b/android/guava-tests/test/com/google/common/base/EnumsTest.java
index 413f308..d8b13af 100644
--- a/android/guava-tests/test/com/google/common/base/EnumsTest.java
+++ b/android/guava-tests/test/com/google/common/base/EnumsTest.java
@@ -79,6 +79,7 @@
     assertThat(Enums.getIfPresent(TestEnum.class, "WOMBAT")).isAbsent();
   }
 
+
   @GwtIncompatible // weak references
   public void testGetIfPresent_doesNotPreventClassUnloading() throws Exception {
     WeakReference<?> shadowLoaderReference = doTestClassUnloading();
diff --git a/android/guava-tests/test/com/google/common/base/FinalizableReferenceQueueClassLoaderUnloadingTest.java b/android/guava-tests/test/com/google/common/base/FinalizableReferenceQueueClassLoaderUnloadingTest.java
index 453b23c..ae35c16 100644
--- a/android/guava-tests/test/com/google/common/base/FinalizableReferenceQueueClassLoaderUnloadingTest.java
+++ b/android/guava-tests/test/com/google/common/base/FinalizableReferenceQueueClassLoaderUnloadingTest.java
@@ -47,6 +47,7 @@
  * @author Eamonn McManus
  */
 
+
 public class FinalizableReferenceQueueClassLoaderUnloadingTest extends TestCase {
 
   /*
@@ -110,7 +111,8 @@
 
     // Now make a parallel FRQ and an associated FinalizableWeakReference to an object, in order to
     // exercise some classes from the parallel ClassLoader.
-    AtomicReference<Object> sepFrqA = new AtomicReference<Object>(sepFrqC.newInstance());
+    AtomicReference<Object> sepFrqA =
+        new AtomicReference<Object>(sepFrqC.getDeclaredConstructor().newInstance());
     Class<?> sepFwrC = sepLoader.loadClass(MyFinalizableWeakReference.class.getName());
     Constructor<?> sepFwrCons = sepFwrC.getConstructor(Object.class, sepFrqC);
     // The object that we will wrap in FinalizableWeakReference is a Stopwatch.
@@ -240,7 +242,7 @@
     assertNotSame(frqUserC, sepFrqUserC);
     assertSame(sepLoader, sepFrqUserC.getClassLoader());
 
-    Callable<?> sepFrqUser = (Callable<?>) sepFrqUserC.newInstance();
+    Callable<?> sepFrqUser = (Callable<?>) sepFrqUserC.getDeclaredConstructor().newInstance();
     WeakReference<?> finalizableWeakReference = (WeakReference<?>) sepFrqUser.call();
 
     GcFinalization.awaitClear(finalizableWeakReference);
diff --git a/android/guava-tests/test/com/google/common/base/FinalizableReferenceQueueTest.java b/android/guava-tests/test/com/google/common/base/FinalizableReferenceQueueTest.java
index 9678701..3e99122 100644
--- a/android/guava-tests/test/com/google/common/base/FinalizableReferenceQueueTest.java
+++ b/android/guava-tests/test/com/google/common/base/FinalizableReferenceQueueTest.java
@@ -40,6 +40,7 @@
     frq = null;
   }
 
+
   public void testFinalizeReferentCalled() {
     final MockReference reference = new MockReference(frq = new FinalizableReferenceQueue());
 
@@ -71,6 +72,7 @@
    */
   private WeakReference<ReferenceQueue<Object>> queueReference;
 
+
   public void testThatFinalizerStops() {
     weaklyReferenceQueue();
     GcFinalization.awaitClear(queueReference);
diff --git a/android/guava-tests/test/com/google/common/base/OptionalTest.java b/android/guava-tests/test/com/google/common/base/OptionalTest.java
index 35de2d4..ba6ace7 100644
--- a/android/guava-tests/test/com/google/common/base/OptionalTest.java
+++ b/android/guava-tests/test/com/google/common/base/OptionalTest.java
@@ -68,6 +68,7 @@
     assertFalse(Optional.absent().isPresent());
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testIsPresent_yes() {
     assertTrue(Optional.of("training").isPresent());
   }
@@ -85,6 +86,7 @@
     assertEquals("training", Optional.of("training").get());
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testOr_T_present() {
     assertEquals("a", Optional.of("a").or("default"));
   }
@@ -93,6 +95,7 @@
     assertEquals("default", Optional.absent().or("default"));
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testOr_supplier_present() {
     assertEquals("a", Optional.of("a").or(Suppliers.ofInstance("fallback")));
   }
@@ -111,11 +114,13 @@
     }
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testOr_nullSupplier_present() {
     Supplier<String> nullSupplier = Suppliers.ofInstance(null);
     assertEquals("a", Optional.of("a").or(nullSupplier));
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testOr_Optional_present() {
     assertEquals(Optional.of("a"), Optional.of("a").or(Optional.of("fallback")));
   }
@@ -124,6 +129,7 @@
     assertEquals(Optional.of("fallback"), Optional.absent().or(Optional.of("fallback")));
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testOrNull_present() {
     assertEquals("a", Optional.of("a").orNull());
   }
diff --git a/android/guava-tests/test/com/google/common/base/PreconditionsTest.java b/android/guava-tests/test/com/google/common/base/PreconditionsTest.java
index 072649f..1add44d 100644
--- a/android/guava-tests/test/com/google/common/base/PreconditionsTest.java
+++ b/android/guava-tests/test/com/google/common/base/PreconditionsTest.java
@@ -24,7 +24,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.testing.ArbitraryInstances;
-import com.google.common.testing.NullPointerTester;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -539,8 +538,22 @@
 
   @GwtIncompatible // NullPointerTester
   public void testNullPointers() {
-    NullPointerTester tester = new NullPointerTester();
-    tester.testAllPublicStaticMethods(Preconditions.class);
+    /*
+     * Don't bother testing: Preconditions defines a bunch of methods that accept a template (or
+     * even entire message) that simultaneously:
+     *
+     * - _shouldn't_ be null, so we don't annotate it with @Nullable
+     *
+     * - _can_ be null without causing a runtime failure (because we don't want the interesting
+     *   details of precondition failure to be hidden by an exception we throw about an unexpectedly
+     *   null _failure message_)
+     *
+     * That combination upsets NullPointerTester, which wants any call that passes null for a
+     * non-@Nullable parameter to trigger a NullPointerException.
+     *
+     * (We still define this empty method to keep PackageSanityTests from generating its own
+     * automated nullness tests, which would fail.)
+     */
   }
 
   private static final Object IGNORE_ME =
diff --git a/android/guava-tests/test/com/google/common/base/ToStringHelperTest.java b/android/guava-tests/test/com/google/common/base/ToStringHelperTest.java
index 3f1ef0f..db15f2e 100644
--- a/android/guava-tests/test/com/google/common/base/ToStringHelperTest.java
+++ b/android/guava-tests/test/com/google/common/base/ToStringHelperTest.java
@@ -116,15 +116,15 @@
   @GwtIncompatible // Class names are obfuscated in GWT
   public void testToStringHelper_moreThanNineAnonymousClasses() {
     // The nth anonymous class has a name ending like "Outer.$n"
-    Object o1 = new Object() {};
-    Object o2 = new Object() {};
-    Object o3 = new Object() {};
-    Object o4 = new Object() {};
-    Object o5 = new Object() {};
-    Object o6 = new Object() {};
-    Object o7 = new Object() {};
-    Object o8 = new Object() {};
-    Object o9 = new Object() {};
+    Object unused1 = new Object() {};
+    Object unused2 = new Object() {};
+    Object unused3 = new Object() {};
+    Object unused4 = new Object() {};
+    Object unused5 = new Object() {};
+    Object unused6 = new Object() {};
+    Object unused7 = new Object() {};
+    Object unused8 = new Object() {};
+    Object unused9 = new Object() {};
     Object o10 = new Object() {};
     String toTest = MoreObjects.toStringHelper(o10).toString();
     assertEquals("{}", toTest);
@@ -132,15 +132,15 @@
 
   public void testToStringHelperLenient_moreThanNineAnonymousClasses() {
     // The nth anonymous class has a name ending like "Outer.$n"
-    Object o1 = new Object() {};
-    Object o2 = new Object() {};
-    Object o3 = new Object() {};
-    Object o4 = new Object() {};
-    Object o5 = new Object() {};
-    Object o6 = new Object() {};
-    Object o7 = new Object() {};
-    Object o8 = new Object() {};
-    Object o9 = new Object() {};
+    Object unused1 = new Object() {};
+    Object unused2 = new Object() {};
+    Object unused3 = new Object() {};
+    Object unused4 = new Object() {};
+    Object unused5 = new Object() {};
+    Object unused6 = new Object() {};
+    Object unused7 = new Object() {};
+    Object unused8 = new Object() {};
+    Object unused9 = new Object() {};
     Object o10 = new Object() {};
     String toTest = MoreObjects.toStringHelper(o10).toString();
     assertTrue(toTest, toTest.matches(".*\\{\\}"));
@@ -357,7 +357,7 @@
   }
 
   @GwtIncompatible // Class names are obfuscated in GWT
-  public void testToStringOmitNullValues_oneValue() {
+  public void testToStringOmitEmptyValues_oneValue() {
     String toTest =
         MoreObjects.toStringHelper(new TestClass()).omitNullValues().addValue(null).toString();
     assertEquals("TestClass{}", toTest);
diff --git a/android/guava-tests/test/com/google/common/base/VerifyTest.java b/android/guava-tests/test/com/google/common/base/VerifyTest.java
index 03d2c2f..37c6efc 100644
--- a/android/guava-tests/test/com/google/common/base/VerifyTest.java
+++ b/android/guava-tests/test/com/google/common/base/VerifyTest.java
@@ -19,11 +19,12 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.GwtIncompatible;
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
 /** Unit test for {@link com.google.common.base.Verify}. */
-@GwtCompatible
+@GwtCompatible(emulated = true)
 public class VerifyTest extends TestCase {
   public void testVerify_simple_success() {
     verify(true);
@@ -92,6 +93,11 @@
     }
   }
 
+  @GwtIncompatible // NullPointerTester
+  public void testNullPointers() {
+    // Don't bother testing: Verify is like Preconditions. See the discussion on that class.
+  }
+
   private static final Object IGNORE_ME =
       new Object() {
         @Override
diff --git a/android/guava-tests/test/com/google/common/cache/CacheBuilderSpecTest.java b/android/guava-tests/test/com/google/common/cache/CacheBuilderSpecTest.java
index ba2e08e..09f2eb6 100644
--- a/android/guava-tests/test/com/google/common/cache/CacheBuilderSpecTest.java
+++ b/android/guava-tests/test/com/google/common/cache/CacheBuilderSpecTest.java
@@ -468,11 +468,13 @@
         .testEquals();
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testMaximumWeight_withWeigher() {
     CacheBuilder<Object, Object> builder = CacheBuilder.from(parse("maximumWeight=9000"));
     builder.weigher(constantWeigher(42)).build(CacheLoader.from(Suppliers.ofInstance(null)));
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testMaximumWeight_withoutWeigher() {
     CacheBuilder<Object, Object> builder = CacheBuilder.from(parse("maximumWeight=9000"));
     try {
@@ -482,11 +484,13 @@
     }
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testMaximumSize_withWeigher() {
     CacheBuilder<Object, Object> builder = CacheBuilder.from(parse("maximumSize=9000"));
     builder.weigher(constantWeigher(42)).build(CacheLoader.from(Suppliers.ofInstance(null)));
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testMaximumSize_withoutWeigher() {
     CacheBuilder<Object, Object> builder = CacheBuilder.from(parse("maximumSize=9000"));
     builder.build(CacheLoader.from(Suppliers.ofInstance(null)));
diff --git a/android/guava-tests/test/com/google/common/cache/CacheBuilderTest.java b/android/guava-tests/test/com/google/common/cache/CacheBuilderTest.java
index f97f0be..1a9faee 100644
--- a/android/guava-tests/test/com/google/common/cache/CacheBuilderTest.java
+++ b/android/guava-tests/test/com/google/common/cache/CacheBuilderTest.java
@@ -285,6 +285,7 @@
     }
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testTimeToLive_small() {
     CacheBuilder.newBuilder().expireAfterWrite(1, NANOSECONDS).build(identityLoader());
     // well, it didn't blow up.
@@ -310,6 +311,7 @@
     }
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testTimeToIdle_small() {
     CacheBuilder.newBuilder().expireAfterAccess(1, NANOSECONDS).build(identityLoader());
     // well, it didn't blow up.
@@ -326,6 +328,7 @@
     }
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testTimeToIdleAndToLive() {
     CacheBuilder.newBuilder()
         .expireAfterWrite(1, NANOSECONDS)
@@ -500,7 +503,7 @@
     final CountDownLatch tasksFinished = new CountDownLatch(nTasks);
     for (int i = 0; i < nTasks; i++) {
       final String s = "a" + i;
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError =
           threadPool.submit(
               new Runnable() {
@@ -595,7 +598,7 @@
 
     ExecutorService threadPool = Executors.newFixedThreadPool(nThreads);
     for (int i = 0; i < nTasks; i++) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError =
           threadPool.submit(
               new Runnable() {
diff --git a/android/guava-tests/test/com/google/common/cache/CacheLoaderTest.java b/android/guava-tests/test/com/google/common/cache/CacheLoaderTest.java
index 6147ff2..e078ddd 100644
--- a/android/guava-tests/test/com/google/common/cache/CacheLoaderTest.java
+++ b/android/guava-tests/test/com/google/common/cache/CacheLoaderTest.java
@@ -18,10 +18,10 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
+import com.google.common.collect.Queues;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-import java.util.LinkedList;
+import java.util.Deque;
 import java.util.Map;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
@@ -36,7 +36,7 @@
 public class CacheLoaderTest extends TestCase {
 
   private static class QueuingExecutor implements Executor {
-    private LinkedList<Runnable> tasks = Lists.newLinkedList();
+    private final Deque<Runnable> tasks = Queues.newArrayDeque();
 
     @Override
     public void execute(Runnable task) {
@@ -79,7 +79,7 @@
     assertEquals(0, loadAllCount.get());
 
     baseLoader.load(new Object());
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = baseLoader.reload(new Object(), new Object());
     baseLoader.loadAll(ImmutableList.of(new Object()));
     assertEquals(1, loadCount.get());
@@ -90,7 +90,7 @@
     CacheLoader<Object, Object> asyncReloader = CacheLoader.asyncReloading(baseLoader, executor);
 
     asyncReloader.load(new Object());
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError1 = asyncReloader.reload(new Object(), new Object());
     asyncReloader.loadAll(ImmutableList.of(new Object()));
     assertEquals(2, loadCount.get());
diff --git a/android/guava-tests/test/com/google/common/cache/CacheLoadingTest.java b/android/guava-tests/test/com/google/common/cache/CacheLoadingTest.java
index ba3e7e9..f5ea546 100644
--- a/android/guava-tests/test/com/google/common/cache/CacheLoadingTest.java
+++ b/android/guava-tests/test/com/google/common/cache/CacheLoadingTest.java
@@ -1766,6 +1766,7 @@
     assertEquals(0, removalListener.getCount());
   }
 
+
   public void testReloadAfterValueReclamation() throws InterruptedException, ExecutionException {
     CountingLoader countingLoader = new CountingLoader();
     LoadingCache<Object, Object> cache =
@@ -1940,6 +1941,7 @@
     }
   }
 
+
   public void testConcurrentLoading() throws InterruptedException {
     testConcurrentLoading(CacheBuilder.newBuilder());
   }
@@ -1952,6 +1954,7 @@
     testConcurrentLoadingCheckedException(builder);
   }
 
+
   public void testConcurrentExpirationLoading() throws InterruptedException {
     testConcurrentLoading(CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS));
   }
@@ -2181,6 +2184,7 @@
     return resultList;
   }
 
+
   public void testAsMapDuringLoading() throws InterruptedException, ExecutionException {
     final CountDownLatch getStartedSignal = new CountDownLatch(2);
     final CountDownLatch letGetFinishSignal = new CountDownLatch(1);
@@ -2239,6 +2243,7 @@
     assertEquals(refreshKey + suffix, map.get(refreshKey));
   }
 
+
   public void testInvalidateDuringLoading() throws InterruptedException, ExecutionException {
     // computation starts; invalidate() is called on the key being computed, computation finishes
     final CountDownLatch computationStarted = new CountDownLatch(2);
@@ -2295,6 +2300,7 @@
     assertEquals(2, cache.size());
   }
 
+
   public void testInvalidateAndReloadDuringLoading()
       throws InterruptedException, ExecutionException {
     // computation starts; clear() is called, computation finishes
@@ -2367,6 +2373,7 @@
     assertEquals(refreshKey + suffix, map.get(refreshKey));
   }
 
+
   public void testExpandDuringLoading() throws InterruptedException {
     final int count = 3;
     final AtomicInteger callCount = new AtomicInteger();
diff --git a/android/guava-tests/test/com/google/common/cache/EmptyCachesTest.java b/android/guava-tests/test/com/google/common/cache/EmptyCachesTest.java
index a56c280..a5e3a59 100644
--- a/android/guava-tests/test/com/google/common/cache/EmptyCachesTest.java
+++ b/android/guava-tests/test/com/google/common/cache/EmptyCachesTest.java
@@ -47,6 +47,7 @@
     }
   }
 
+
   public void testInvalidate_empty() {
     for (LoadingCache<Object, Object> cache : caches()) {
       cache.getUnchecked("a");
@@ -68,6 +69,7 @@
     }
   }
 
+
   public void testEquals_null() {
     for (LoadingCache<Object, Object> cache : caches()) {
       assertFalse(cache.equals(null));
@@ -137,6 +139,7 @@
     }
   }
 
+
   public void testKeySet_clear() {
     for (LoadingCache<Object, Object> cache : caches()) {
       warmUp(cache, 0, 100);
@@ -211,6 +214,7 @@
     }
   }
 
+
   public void testValues_clear() {
     for (LoadingCache<Object, Object> cache : caches()) {
       warmUp(cache, 0, 100);
@@ -285,6 +289,7 @@
     }
   }
 
+
   public void testEntrySet_clear() {
     for (LoadingCache<Object, Object> cache : caches()) {
       warmUp(cache, 0, 100);
diff --git a/android/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java b/android/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java
index c5681d2..d78db2d 100644
--- a/android/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java
+++ b/android/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java
@@ -90,7 +90,7 @@
 
   public void testSize() {
     when(mock.size()).thenReturn(0L);
-    forward.size();
+    long unused = forward.size();
   }
 
   public void testStats() {
diff --git a/android/guava-tests/test/com/google/common/cache/LocalCacheTest.java b/android/guava-tests/test/com/google/common/cache/LocalCacheTest.java
index 667ea93..3c4529c 100644
--- a/android/guava-tests/test/com/google/common/cache/LocalCacheTest.java
+++ b/android/guava-tests/test/com/google/common/cache/LocalCacheTest.java
@@ -97,6 +97,7 @@
     }
   }
 
+
   public static Test suite() {
     TestSuite suite = new TestSuite();
     suite.addTestSuite(LocalCacheTest.class);
@@ -700,6 +701,7 @@
     assertEquals(1, map.size());
   }
 
+
   public void testCopyEntry_computing() {
     final CountDownLatch startSignal = new CountDownLatch(1);
     final CountDownLatch computingSignal = new CountDownLatch(1);
@@ -801,6 +803,7 @@
     checkLogged(e);
   }
 
+
   public void testRemovalListener_replaced_computing() {
     final CountDownLatch startSignal = new CountDownLatch(1);
     final CountDownLatch computingSignal = new CountDownLatch(1);
diff --git a/android/guava-tests/test/com/google/common/cache/LocalLoadingCacheTest.java b/android/guava-tests/test/com/google/common/cache/LocalLoadingCacheTest.java
index 6b73bdc..8ba9dbc 100644
--- a/android/guava-tests/test/com/google/common/cache/LocalLoadingCacheTest.java
+++ b/android/guava-tests/test/com/google/common/cache/LocalLoadingCacheTest.java
@@ -157,7 +157,7 @@
     assertThat(map).containsEntry(three, one);
     assertThat(map).containsEntry(one, two);
 
-    // TODO(cgruber): Confirm with fry@ that this is a reasonable substitute.
+    // TODO(user): Confirm with fry@ that this is a reasonable substitute.
     // Set<Entry<Object, Object>> entries = map.entrySet();
     // assertThat(entries).containsExactly(
     //    Maps.immutableEntry(three, one), Maps.immutableEntry(one, two));
@@ -293,6 +293,7 @@
     assertFalse(segment.recencyQueue.isEmpty());
   }
 
+
   public void testRecursiveComputation() throws InterruptedException {
     final AtomicReference<LoadingCache<Integer, String>> cacheRef = new AtomicReference<>();
     CacheLoader<Integer, String> recursiveLoader =
diff --git a/android/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java b/android/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java
index 1e71b63..b02b8ac 100644
--- a/android/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java
+++ b/android/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java
@@ -187,6 +187,7 @@
     }
   }
 
+
   public void testKeySet_populated() {
     for (LoadingCache<Object, Object> cache : caches()) {
       Set<Object> keys = cache.asMap().keySet();
@@ -237,6 +238,7 @@
     }
   }
 
+
   public void testEntrySet_populated() {
     for (LoadingCache<Object, Object> cache : caches()) {
       Set<Entry<Object, Object>> entries = cache.asMap().entrySet();
diff --git a/android/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java b/android/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
index 4cb9d1b..3592210 100644
--- a/android/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
+++ b/android/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
@@ -137,6 +137,7 @@
     }
   }
 
+
   @GwtIncompatible // weak references
   public void testFreesNextReference() {
     Iterator<Object> itr =
diff --git a/android/guava-tests/test/com/google/common/collect/DiscreteDomainTest.java b/android/guava-tests/test/com/google/common/collect/DiscreteDomainTest.java
index 5de3f8d..b9e15fd 100644
--- a/android/guava-tests/test/com/google/common/collect/DiscreteDomainTest.java
+++ b/android/guava-tests/test/com/google/common/collect/DiscreteDomainTest.java
@@ -87,4 +87,48 @@
     } catch (IllegalArgumentException expected) {
     }
   }
+
+  public void testCustomOffsetExceptions() {
+    try {
+      new MyIntegerDomain().offset(0, -1);
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+    try {
+      new MyIntegerDomain().offset(Integer.MAX_VALUE, 1);
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  private static final class MyIntegerDomain extends DiscreteDomain<Integer> {
+    static final DiscreteDomain<Integer> DELEGATE = DiscreteDomain.integers();
+
+    @Override
+    public Integer next(Integer value) {
+      return DELEGATE.next(value);
+    }
+
+    @Override
+    public Integer previous(Integer value) {
+      return DELEGATE.previous(value);
+    }
+
+    // Do *not* override offset() to delegate: We want to test the default implementation.
+
+    @Override
+    public long distance(Integer start, Integer end) {
+      return DELEGATE.distance(start, end);
+    }
+
+    @Override
+    public Integer minValue() {
+      return DELEGATE.minValue();
+    }
+
+    @Override
+    public Integer maxValue() {
+      return DELEGATE.maxValue();
+    }
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
index cb23f3e..e0dd1ef 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
@@ -32,6 +32,7 @@
 import com.google.common.collect.testing.google.BiMapInverseTester;
 import com.google.common.collect.testing.google.BiMapTestSuiteBuilder;
 import com.google.common.testing.SerializableTester;
+import java.util.AbstractMap;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -395,6 +396,136 @@
           "four",
           5,
           "five");
+      assertMapEquals(
+          ImmutableBiMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6);
+      assertMapEquals(
+          ImmutableBiMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7);
+      assertMapEquals(
+          ImmutableBiMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8);
+      assertMapEquals(
+          ImmutableBiMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8,
+          "nine",
+          9);
+      assertMapEquals(
+          ImmutableBiMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9,
+              "ten", 10),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8,
+          "nine",
+          9,
+          "ten",
+          10);
     }
 
     public void testOfNullKey() {
@@ -434,6 +565,30 @@
       }
     }
 
+    public void testOfEntries() {
+      assertMapEquals(
+          ImmutableBiMap.ofEntries(entry("one", 1), entry("two", 2)), "one", 1, "two", 2);
+    }
+
+    public void testOfEntriesNull() {
+      Entry<Integer, Integer> nullKey = entry(null, 23);
+      try {
+        ImmutableBiMap.ofEntries(nullKey);
+        fail();
+      } catch (NullPointerException expected) {
+      }
+      Entry<Integer, Integer> nullValue = entry(23, null);
+      try {
+        ImmutableBiMap.ofEntries(nullValue);
+        fail();
+      } catch (NullPointerException expected) {
+      }
+    }
+
+    private static <T> Entry<T, T> entry(T key, T value) {
+      return new AbstractMap.SimpleImmutableEntry<>(key, value);
+    }
+
     public void testCopyOfEmptyMap() {
       ImmutableBiMap<String, Integer> copy =
           ImmutableBiMap.copyOf(Collections.<String, Integer>emptyMap());
@@ -506,6 +661,30 @@
         assertThat(expected.getMessage()).contains("1");
       }
     }
+
+    // TODO(b/172823566): Use mainline testToImmutableBiMap once CollectorTester is usable to java7.
+    public void testToImmutableBiMap_java7_combine() {
+      ImmutableBiMap.Builder<String, Integer> zis =
+          ImmutableBiMap.<String, Integer>builder().put("one", 1);
+      ImmutableBiMap.Builder<String, Integer> zat =
+          ImmutableBiMap.<String, Integer>builder().put("two", 2).put("three", 3);
+      ImmutableBiMap<String, Integer> biMap = zis.combine(zat).build();
+      assertMapEquals(biMap, "one", 1, "two", 2, "three", 3);
+    }
+
+    // TODO(b/172823566): Use mainline testToImmutableBiMap once CollectorTester is usable to java7.
+    public void testToImmutableBiMap_exceptionOnDuplicateKey_java7_combine() {
+      ImmutableBiMap.Builder<String, Integer> zis =
+          ImmutableBiMap.<String, Integer>builder().put("one", 1).put("two", 2);
+      ImmutableBiMap.Builder<String, Integer> zat =
+          ImmutableBiMap.<String, Integer>builder().put("two", 22).put("three", 3);
+      try {
+        zis.combine(zat).build();
+        fail("Expected IllegalArgumentException");
+      } catch (IllegalArgumentException expected) {
+        // expected
+      }
+    }
   }
 
   public static class BiMapSpecificTests extends TestCase {
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableListMultimapTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableListMultimapTest.java
index f073163..1260740 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableListMultimapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableListMultimapTest.java
@@ -29,6 +29,7 @@
 import com.google.common.collect.testing.google.TestStringListMultimapGenerator;
 import com.google.common.collect.testing.google.UnmodifiableCollectionTests;
 import com.google.common.testing.EqualsTester;
+import com.google.common.testing.NullPointerTester;
 import com.google.common.testing.SerializableTester;
 import java.util.Arrays;
 import java.util.Collection;
@@ -387,6 +388,20 @@
     }
   }
 
+  // TODO(b/172823566): Use mainline testToImmutableListMultimap once CollectorTester is usable.
+  public void testToImmutableListMultimap_java7_combine() {
+    ImmutableListMultimap.Builder<String, Integer> zis =
+        ImmutableListMultimap.<String, Integer>builder().put("a", 1).put("b", 2);
+    ImmutableListMultimap.Builder<String, Integer> zat =
+        ImmutableListMultimap.<String, Integer>builder().put("a", 3).put("c", 4);
+    ImmutableListMultimap<String, Integer> multimap = zis.combine(zat).build();
+    assertThat(multimap.keySet()).containsExactly("a", "b", "c").inOrder();
+    assertThat(multimap.values()).containsExactly(1, 3, 2, 4).inOrder();
+    assertThat(multimap.get("a")).containsExactly(1, 3).inOrder();
+    assertThat(multimap.get("b")).containsExactly(2);
+    assertThat(multimap.get("c")).containsExactly(4);
+  }
+
   public void testEmptyMultimapReads() {
     Multimap<String, Integer> multimap = ImmutableListMultimap.of();
     assertFalse(multimap.containsKey("foo"));
@@ -557,4 +572,13 @@
     Multimap<String, Integer> multimap = ImmutableListMultimap.of();
     assertSame(multimap, SerializableTester.reserialize(multimap));
   }
+
+  @GwtIncompatible // reflection
+  public void testNulls() throws Exception {
+    NullPointerTester tester = new NullPointerTester();
+    tester.testAllPublicStaticMethods(ImmutableListMultimap.class);
+    tester.ignore(ImmutableListMultimap.class.getMethod("get", Object.class));
+    tester.testAllPublicInstanceMethods(ImmutableListMultimap.of());
+    tester.testAllPublicInstanceMethods(ImmutableListMultimap.of("a", 1));
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableListTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableListTest.java
index 1688bad..52ed7fa 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableListTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableListTest.java
@@ -459,6 +459,14 @@
       } catch (NullPointerException expected) {
       }
     }
+
+    // TODO(b/172823566): Use mainline testToImmutableList once CollectorTester is usable to java7.
+    public void testToImmutableList_java7_combine() {
+      ImmutableList.Builder<String> zis = ImmutableList.<String>builder().add("a", "b");
+      ImmutableList.Builder<String> zat = ImmutableList.<String>builder().add("c", "d");
+      ImmutableList<String> list = zis.combine(zat).build();
+      assertEquals(asList("a", "b", "c", "d"), list);
+    }
   }
 
   @GwtIncompatible // reflection
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableMapTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
index 2cf43ef..f4da971 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.testing.SerializableTester.reserialize;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -49,6 +50,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
+import java.util.AbstractMap;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -590,6 +592,136 @@
           4,
           "five",
           5);
+      assertMapEquals(
+          ImmutableMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6);
+      assertMapEquals(
+          ImmutableMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7);
+      assertMapEquals(
+          ImmutableMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8);
+      assertMapEquals(
+          ImmutableMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8,
+          "nine",
+          9);
+      assertMapEquals(
+          ImmutableMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9,
+              "ten", 10),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8,
+          "nine",
+          9,
+          "ten",
+          10);
     }
 
     public void testOfNullKey() {
@@ -652,6 +784,29 @@
       assertSame(copy, ImmutableMap.copyOf(copy));
     }
 
+    // TODO(b/172823566): Use mainline testToImmutableMap once CollectorTester is usable to java7.
+    public void testToImmutableMap_java7_combine() {
+      ImmutableMap.Builder<String, Integer> zis =
+          ImmutableMap.<String, Integer>builder().put("one", 1);
+      ImmutableMap.Builder<String, Integer> zat =
+          ImmutableMap.<String, Integer>builder().put("two", 2).put("three", 3);
+      assertMapEquals(zis.combine(zat).build(), "one", 1, "two", 2, "three", 3);
+    }
+
+    // TODO(b/172823566): Use mainline testToImmutableMap once CollectorTester is usable to java7.
+    public void testToImmutableMap_exceptionOnDuplicateKey_java7_combine() {
+      ImmutableMap.Builder<String, Integer> zis =
+          ImmutableMap.<String, Integer>builder().put("one", 1).put("two", 2);
+      ImmutableMap.Builder<String, Integer> zat =
+          ImmutableMap.<String, Integer>builder().put("two", 22).put("three", 3);
+      try {
+        zis.combine(zat).build();
+        fail("Expected IllegalArgumentException");
+      } catch (IllegalArgumentException expected) {
+        // expected
+      }
+    }
+
     public static void hashtableTestHelper(ImmutableList<Integer> sizes) {
       for (int size : sizes) {
         Builder<Integer, Integer> builder = ImmutableMap.builderWithExpectedSize(size);
@@ -826,15 +981,84 @@
 
   public void testEquals() {
     new EqualsTester()
-        .addEqualityGroup(ImmutableMap.of(), ImmutableMap.builder().build())
-        .addEqualityGroup(ImmutableMap.of(1, 1), ImmutableMap.builder().put(1, 1).build())
-        .addEqualityGroup(ImmutableMap.of(1, 1, 2, 2))
-        .addEqualityGroup(ImmutableMap.of(1, 1, 2, 2, 3, 3))
-        .addEqualityGroup(ImmutableMap.of(1, 4, 2, 2, 3, 3))
-        .addEqualityGroup(ImmutableMap.of(1, 1, 2, 4, 3, 3))
-        .addEqualityGroup(ImmutableMap.of(1, 1, 2, 2, 3, 4))
-        .addEqualityGroup(ImmutableMap.of(1, 2, 2, 3, 3, 1))
-        .addEqualityGroup(ImmutableMap.of(1, 1, 2, 2, 3, 3, 4, 4))
+        .addEqualityGroup(
+            ImmutableMap.of(), ImmutableMap.builder().build(), ImmutableMap.ofEntries(), map())
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1),
+            ImmutableMap.builder().put(1, 1).build(),
+            ImmutableMap.ofEntries(entry(1, 1)),
+            map(1, 1))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 2),
+            ImmutableMap.builder().put(1, 1).put(2, 2).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 2)),
+            map(1, 1, 2, 2))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 2, 3, 3),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3)),
+            map(1, 1, 2, 2, 3, 3))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 4, 2, 2, 3, 3),
+            ImmutableMap.builder().put(1, 4).put(2, 2).put(3, 3).build(),
+            ImmutableMap.ofEntries(entry(1, 4), entry(2, 2), entry(3, 3)),
+            map(1, 4, 2, 2, 3, 3))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 4, 3, 3),
+            ImmutableMap.builder().put(1, 1).put(2, 4).put(3, 3).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 4), entry(3, 3)),
+            map(1, 1, 2, 4, 3, 3))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 2, 3, 4),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 4).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 4)),
+            map(1, 1, 2, 2, 3, 4))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 2, 2, 3, 3, 1),
+            ImmutableMap.builder().put(1, 2).put(2, 3).put(3, 1).build(),
+            ImmutableMap.ofEntries(entry(1, 2), entry(2, 3), entry(3, 1)),
+            map(1, 2, 2, 3, 3, 1))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 2, 3, 3, 4, 4),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3), entry(4, 4)),
+            map(1, 1, 2, 2, 3, 3, 4, 4))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 2, 3, 3, 4, 4, 5, 5),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).put(5, 5).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3), entry(4, 4), entry(5, 5)),
+            map(1, 1, 2, 2, 3, 3, 4, 4, 5, 5))
         .testEquals();
   }
+
+  public void testOfEntriesNull() {
+    Entry<Integer, Integer> nullKey = entry(null, 23);
+    try {
+      ImmutableMap.ofEntries(nullKey);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+    Entry<Integer, Integer> nullValue = entry(23, null);
+    try {
+      ImmutableMap.ofEntries(nullValue);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+  }
+
+  private static <T> Map<T, T> map(T... keysAndValues) {
+    assertThat(keysAndValues.length % 2).isEqualTo(0);
+    LinkedHashMap<T, T> map = new LinkedHashMap<>();
+    for (int i = 0; i < keysAndValues.length; i += 2) {
+      T key = keysAndValues[i];
+      T value = keysAndValues[i + 1];
+      T old = map.put(key, value);
+      assertWithMessage("Key %s set to %s and %s", key, value, old).that(old).isNull();
+    }
+    return map;
+  }
+
+  private static <T> Entry<T, T> entry(T key, T value) {
+    return new AbstractMap.SimpleImmutableEntry<>(key, value);
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableMultimapTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableMultimapTest.java
index 5263258..ac09593 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableMultimapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableMultimapTest.java
@@ -17,11 +17,13 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.GwtIncompatible;
 import com.google.common.collect.ImmutableMultimap.Builder;
 import com.google.common.collect.testing.SampleElements;
 import com.google.common.collect.testing.SampleElements.Unhashables;
 import com.google.common.collect.testing.UnhashableObject;
 import com.google.common.testing.EqualsTester;
+import com.google.common.testing.NullPointerTester;
 import java.util.Arrays;
 import java.util.Map.Entry;
 import junit.framework.TestCase;
@@ -124,4 +126,13 @@
             ImmutableMultimap.of(1, "a", 2, "b"), ImmutableMultimap.of(2, "b", 1, "a"))
         .testEquals();
   }
+
+  @GwtIncompatible // reflection
+  public void testNulls() throws Exception {
+    NullPointerTester tester = new NullPointerTester();
+    tester.testAllPublicStaticMethods(ImmutableMultimap.class);
+    tester.ignore(ImmutableListMultimap.class.getMethod("get", Object.class));
+    tester.testAllPublicInstanceMethods(ImmutableMultimap.of());
+    tester.testAllPublicInstanceMethods(ImmutableMultimap.of("a", 1));
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableRangeMapTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableRangeMapTest.java
index 9de4309..59f3a1b 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableRangeMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableRangeMapTest.java
@@ -15,6 +15,7 @@
 package com.google.common.collect;
 
 import static com.google.common.collect.BoundType.OPEN;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.testing.SerializableTester;
@@ -207,6 +208,7 @@
     }
   }
 
+
   public void testSubRangeMap() {
     for (Range<Integer> range1 : RANGES) {
       for (Range<Integer> range2 : RANGES) {
@@ -254,4 +256,21 @@
 
     SerializableTester.reserializeAndAssert(nonEmptyRangeMap);
   }
+
+  // TODO(b/172823566): Use mainline testToImmutableRangeMap once CollectorTester is usable to java7
+  public void testToImmutableRangeMap() {
+    Range<Integer> rangeOne = Range.closedOpen(1, 5);
+    Range<Integer> rangeTwo = Range.openClosed(6, 7);
+
+    ImmutableRangeMap.Builder<Integer, Integer> zis =
+        ImmutableRangeMap.<Integer, Integer>builder().put(rangeOne, 1);
+    ImmutableRangeMap.Builder<Integer, Integer> zat =
+        ImmutableRangeMap.<Integer, Integer>builder().put(rangeTwo, 6);
+
+    ImmutableRangeMap<Integer, Integer> rangeMap = zis.combine(zat).build();
+
+    assertThat(rangeMap.asMapOfRanges().entrySet())
+        .containsExactly(Maps.immutableEntry(rangeOne, 1), Maps.immutableEntry(rangeTwo, 6))
+        .inOrder();
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java
index fcb315c..5ca1f58 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableRangeSetTest.java
@@ -590,4 +590,23 @@
       }
     }
   }
+
+  // TODO(b/172823566): Use mainline testToImmutableRangeSet once CollectorTester is usable to java7
+  public void testToImmutableRangeSet_java7_combine() {
+    Range<Integer> rangeOne = Range.closedOpen(1, 3);
+    Range<Integer> rangeTwo = Range.closedOpen(7, 9);
+    Range<Integer> rangeThree = Range.closedOpen(4, 5);
+    Range<Integer> rangeFour = Range.closedOpen(6, 7);
+
+    ImmutableRangeSet.Builder<Integer> zis =
+        ImmutableRangeSet.<Integer>builder().add(rangeOne).add(rangeTwo);
+    ImmutableRangeSet.Builder<Integer> zat =
+        ImmutableRangeSet.<Integer>builder().add(rangeThree).add(rangeFour);
+
+    ImmutableRangeSet<Integer> rangeSet = zis.combine(zat).build();
+
+    assertThat(rangeSet.asRanges())
+        .containsExactly(Range.closedOpen(1, 3), Range.closedOpen(4, 5), Range.closedOpen(6, 9))
+        .inOrder();
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableSetMultimapTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableSetMultimapTest.java
index a8f626b..33d4ec1 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableSetMultimapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableSetMultimapTest.java
@@ -29,6 +29,7 @@
 import com.google.common.collect.testing.google.TestStringSetMultimapGenerator;
 import com.google.common.collect.testing.google.UnmodifiableCollectionTests;
 import com.google.common.testing.EqualsTester;
+import com.google.common.testing.NullPointerTester;
 import com.google.common.testing.SerializableTester;
 import java.util.Arrays;
 import java.util.Collection;
@@ -400,6 +401,20 @@
     }
   }
 
+  // TODO(b/172823566): Use mainline testToImmutableSetMultimap once CollectorTester is usable.
+  public void testToImmutableSetMultimap_java7_combine() {
+    ImmutableSetMultimap.Builder<String, Integer> zis =
+        ImmutableSetMultimap.<String, Integer>builder().put("a", 1).put("b", 2);
+    ImmutableSetMultimap.Builder<String, Integer> zat =
+        ImmutableSetMultimap.<String, Integer>builder().put("a", 3).put("c", 4);
+    ImmutableSetMultimap<String, Integer> multimap = zis.combine(zat).build();
+    assertThat(multimap.keySet()).containsExactly("a", "b", "c").inOrder();
+    assertThat(multimap.values()).containsExactly(1, 3, 2, 4).inOrder();
+    assertThat(multimap.get("a")).containsExactly(1, 3).inOrder();
+    assertThat(multimap.get("b")).containsExactly(2);
+    assertThat(multimap.get("c")).containsExactly(4);
+  }
+
   public void testEmptyMultimapReads() {
     Multimap<String, Integer> multimap = ImmutableSetMultimap.of();
     assertFalse(multimap.containsKey("foo"));
@@ -578,4 +593,13 @@
         .put("foo", 3)
         .build();
   }
+
+  @GwtIncompatible // reflection
+  public void testNulls() throws Exception {
+    NullPointerTester tester = new NullPointerTester();
+    tester.testAllPublicStaticMethods(ImmutableSetMultimap.class);
+    tester.ignore(ImmutableSetMultimap.class.getMethod("get", Object.class));
+    tester.testAllPublicInstanceMethods(ImmutableSetMultimap.of());
+    tester.testAllPublicInstanceMethods(ImmutableSetMultimap.of("a", 1));
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableSetTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableSetTest.java
index 6dc6f22..2ddd1ee 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableSetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableSetTest.java
@@ -321,6 +321,14 @@
     assertNotSame(sortedSet, copy);
   }
 
+  // TODO(b/172823566): Use mainline testToImmutableSet once CollectorTester is usable to java7.
+  public void testToImmutableSet_java7() {
+    ImmutableSet.Builder<String> zis = ImmutableSet.<String>builder().add("a", "b", "a");
+    ImmutableSet.Builder<String> zat = ImmutableSet.<String>builder().add("c", "b", "d", "c");
+    ImmutableSet<String> set = zis.combine(zat).build();
+    assertThat(set).containsExactly("a", "b", "c", "d").inOrder();
+  }
+
   @GwtIncompatible // GWT is single threaded
   public void testCopyOf_threadSafe() {
     verifyThreadSafe();
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
index 4e3e1de..850a8e7 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
@@ -314,6 +314,7 @@
       assertMapEquals(map, "five", 5, "four", 4, "one", 1, "three", 3, "two", 2);
     }
 
+    @SuppressWarnings("DoNotCall")
     public void testBuilder_orderEntriesByValueFails() {
       ImmutableSortedMap.Builder<String, Integer> builder = ImmutableSortedMap.naturalOrder();
       try {
@@ -481,6 +482,136 @@
           3,
           "two",
           2);
+      assertMapEquals(
+          ImmutableSortedMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6),
+          "five",
+          5,
+          "four",
+          4,
+          "one",
+          1,
+          "six",
+          6,
+          "three",
+          3,
+          "two",
+          2);
+      assertMapEquals(
+          ImmutableSortedMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7),
+          "five",
+          5,
+          "four",
+          4,
+          "one",
+          1,
+          "seven",
+          7,
+          "six",
+          6,
+          "three",
+          3,
+          "two",
+          2);
+      assertMapEquals(
+          ImmutableSortedMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8),
+          "eight",
+          8,
+          "five",
+          5,
+          "four",
+          4,
+          "one",
+          1,
+          "seven",
+          7,
+          "six",
+          6,
+          "three",
+          3,
+          "two",
+          2);
+      assertMapEquals(
+          ImmutableSortedMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9),
+          "eight",
+          8,
+          "five",
+          5,
+          "four",
+          4,
+          "nine",
+          9,
+          "one",
+          1,
+          "seven",
+          7,
+          "six",
+          6,
+          "three",
+          3,
+          "two",
+          2);
+      assertMapEquals(
+          ImmutableSortedMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9,
+              "ten", 10),
+          "eight",
+          8,
+          "five",
+          5,
+          "four",
+          4,
+          "nine",
+          9,
+          "one",
+          1,
+          "seven",
+          7,
+          "six",
+          6,
+          "ten",
+          10,
+          "three",
+          3,
+          "two",
+          2);
     }
 
     public void testOfNullKey() {
@@ -667,6 +798,31 @@
       assertMapEquals(map, "two", 2, "three", 3, "one", 1, "four", 4, "five", 5);
       assertSame(comparator, map.comparator());
     }
+
+    // TODO(b/172823566): Use mainline testToImmutableSortedMap once CollectorTester is usable.
+    public void testToImmutableSortedMap_java7_combine() {
+      ImmutableSortedMap.Builder<String, Integer> zis =
+          ImmutableSortedMap.<String, Integer>naturalOrder().put("one", 1).put("four", 4);
+      ImmutableSortedMap.Builder<String, Integer> zat =
+          ImmutableSortedMap.<String, Integer>naturalOrder().put("two", 2).put("three", 3);
+      ImmutableSortedMap<String, Integer> sortedMap = zis.combine(zat).build();
+      assertMapEquals(sortedMap, "four", 4, "one", 1, "three", 3, "two", 2);
+    }
+
+    // TODO(b/172823566): Use mainline testToImmutableSortedMap once CollectorTester is usable.
+    public void testToImmutableSortedMap_exceptionOnDuplicateKey_java7_combine() {
+      ImmutableSortedMap.Builder<String, Integer> zis =
+          ImmutableSortedMap.<String, Integer>naturalOrder().put("one", 1).put("two", 2);
+      ImmutableSortedMap.Builder<String, Integer> zat =
+          ImmutableSortedMap.<String, Integer>naturalOrder().put("two", 22).put("three", 3);
+      try {
+        ImmutableSortedMap.Builder<String, Integer> combined = zis.combine(zat);
+        combined.build();
+        fail("Expected IllegalArgumentException");
+      } catch (IllegalArgumentException expected) {
+        // expected
+      }
+    }
   }
 
   public void testNullGet() {
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java
index cf2f5aa..ea0e3a8 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java
@@ -708,6 +708,30 @@
     assertSame(STRING_LENGTH, set.comparator());
   }
 
+  // TODO(b/172823566): Use mainline testToImmutableSortedSet once CollectorTester is usable.
+  public void testToImmutableSortedSet_java7() {
+    // Note that a Collector should generally enforce consistent comparator between builders
+    ImmutableSortedSet.Builder<String> zis =
+        ImmutableSortedSet.<String>naturalOrder().add("c", "b", "c");
+    ImmutableSortedSet.Builder<String> zat =
+        ImmutableSortedSet.<String>naturalOrder().add("a", "b", "d", "c");
+    ImmutableSortedSet<String> sortedSet = zis.combine(zat).build();
+    assertThat(sortedSet).containsExactly("a", "b", "c", "d").inOrder();
+  }
+
+  // TODO(b/172823566): Use mainline testToImmutableSortedSet_customComparator once CollectorTester
+  //  is usable to java7.
+  public void testToImmutableSortedSet_customComparator_java7() {
+    // Note that a Collector should generally enforce consistent comparator between builders.
+    // So no tests for non-matching comparator shenanigans.
+    ImmutableSortedSet.Builder<String> zis =
+        ImmutableSortedSet.<String>orderedBy(STRING_LENGTH).add("ccc", "bb", "ccc");
+    ImmutableSortedSet.Builder<String> zat =
+        ImmutableSortedSet.<String>orderedBy(STRING_LENGTH).add("a", "bb", "dddd", "ccc");
+    ImmutableSortedSet<String> sortedSet = zis.combine(zat).build();
+    assertThat(sortedSet).containsExactly("a", "bb", "ccc", "dddd").inOrder();
+  }
+
   public void testEquals_bothDefaultOrdering() {
     SortedSet<String> set = of("a", "b", "c");
     assertEquals(set, Sets.newTreeSet(asList("a", "b", "c")));
@@ -891,7 +915,7 @@
     assertTrue(Iterables.elementsEqual(LegacyComparable.VALUES_BACKWARD, set));
   }
 
-  @SuppressWarnings({"deprecation", "static-access"})
+  @SuppressWarnings({"deprecation", "static-access", "DoNotCall"})
   public void testBuilderMethod() {
     try {
       ImmutableSortedSet.builder();
diff --git a/android/guava-tests/test/com/google/common/collect/ImmutableTableTest.java b/android/guava-tests/test/com/google/common/collect/ImmutableTableTest.java
index 9789f72..9bdc99c 100644
--- a/android/guava-tests/test/com/google/common/collect/ImmutableTableTest.java
+++ b/android/guava-tests/test/com/google/common/collect/ImmutableTableTest.java
@@ -38,6 +38,25 @@
     return builder.build();
   }
 
+  // TODO(b/172823566): Use mainline testToImmutableMap once CollectorTester is usable to java7.
+  public void testToImmutableTable_java7_combine() {
+    ImmutableTable.Builder<String, String, Integer> zis =
+        ImmutableTable.<String, String, Integer>builder().put("one", "uno", 1).put("two", "dos", 2);
+    ImmutableTable.Builder<String, String, Integer> zat =
+        ImmutableTable.<String, String, Integer>builder()
+            .put("one", "eins", 1)
+            .put("two", "twei", 2);
+    ImmutableTable<String, String, Integer> table = zis.combine(zat).build();
+    ImmutableTable<String, String, Integer> expected =
+        ImmutableTable.<String, String, Integer>builder()
+            .put("one", "uno", 1)
+            .put("two", "dos", 2)
+            .put("one", "eins", 1)
+            .put("two", "twei", 2)
+            .build();
+    assertThat(table).isEqualTo(expected);
+  }
+
   public void testBuilder() {
     ImmutableTable.Builder<Character, Integer, String> builder = new ImmutableTable.Builder<>();
     assertEquals(ImmutableTable.of(), builder.build());
diff --git a/android/guava-tests/test/com/google/common/collect/InternersTest.java b/android/guava-tests/test/com/google/common/collect/InternersTest.java
index 08bdc53..cfa14b8 100644
--- a/android/guava-tests/test/com/google/common/collect/InternersTest.java
+++ b/android/guava-tests/test/com/google/common/collect/InternersTest.java
@@ -84,6 +84,7 @@
     assertEquals(concurrencyLevel, internerImpl.map.concurrencyLevel);
   }
 
+
   public void testWeak_afterGC() throws InterruptedException {
     Integer canonical = new Integer(5);
     Integer not = new Integer(5);
diff --git a/android/guava-tests/test/com/google/common/collect/LinkedListMultimapTest.java b/android/guava-tests/test/com/google/common/collect/LinkedListMultimapTest.java
index d57d5c0..b0d48f0 100644
--- a/android/guava-tests/test/com/google/common/collect/LinkedListMultimapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/LinkedListMultimapTest.java
@@ -35,6 +35,7 @@
 import com.google.common.collect.testing.google.ListMultimapTestSuiteBuilder;
 import com.google.common.collect.testing.google.TestStringListMultimapGenerator;
 import com.google.common.testing.EqualsTester;
+import com.google.common.testing.NullPointerTester;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -496,4 +497,13 @@
             LinkedListMultimap.create(), LinkedListMultimap.create(), LinkedListMultimap.create(1))
         .testEquals();
   }
+
+  @GwtIncompatible // reflection
+  public void testNulls() throws Exception {
+    NullPointerTester tester = new NullPointerTester();
+    tester.testAllPublicStaticMethods(LinkedListMultimap.class);
+    tester.ignore(LinkedListMultimap.class.getMethod("get", Object.class));
+    tester.ignore(LinkedListMultimap.class.getMethod("removeAll", Object.class));
+    tester.testAllPublicInstanceMethods(LinkedListMultimap.create());
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/QueuesTest.java b/android/guava-tests/test/com/google/common/collect/QueuesTest.java
index 66d99fe..819700e 100644
--- a/android/guava-tests/test/com/google/common/collect/QueuesTest.java
+++ b/android/guava-tests/test/com/google/common/collect/QueuesTest.java
@@ -101,15 +101,15 @@
 
   private void testMultipleProducers(BlockingQueue<Object> q) throws InterruptedException {
     for (boolean interruptibly : new boolean[] {true, false}) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError = threadPool.submit(new Producer(q, 20));
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError1 = threadPool.submit(new Producer(q, 20));
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError2 = threadPool.submit(new Producer(q, 20));
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError3 = threadPool.submit(new Producer(q, 20));
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError4 = threadPool.submit(new Producer(q, 20));
 
       List<Object> buf = newArrayList();
@@ -182,7 +182,7 @@
   }
 
   private void testNegativeMaxElements(BlockingQueue<Object> q) throws InterruptedException {
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = threadPool.submit(new Producer(q, 1));
 
     List<Object> buf = newArrayList();
@@ -201,7 +201,7 @@
   }
 
   private void testDrain_throws(BlockingQueue<Object> q) {
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = threadPool.submit(new Interrupter(currentThread()));
     try {
       Queues.drain(q, ImmutableList.of(), 100, MAX_VALUE, NANOSECONDS);
@@ -218,7 +218,7 @@
 
   private void testDrainUninterruptibly_doesNotThrow(final BlockingQueue<Object> q) {
     final Thread mainThread = currentThread();
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError =
         threadPool.submit(
             new Callable<Void>() {
@@ -275,7 +275,7 @@
     }
 
     // but does the wait actually occurs?
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = threadPool.submit(new Interrupter(currentThread()));
     try {
       // if waiting works, this should get stuck
@@ -291,7 +291,7 @@
     assertEquals(0, Queues.drainUninterruptibly(q, ImmutableList.of(), 0, 10, MILLISECONDS));
 
     // but does the wait actually occurs?
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = threadPool.submit(new Interrupter(currentThread()));
 
     Stopwatch timer = Stopwatch.createStarted();
diff --git a/android/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java b/android/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java
index 0a11b27..1df6aa1 100644
--- a/android/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java
@@ -254,6 +254,7 @@
     private static final long serialVersionUID = 0;
   }
 
+  @SuppressWarnings("CheckReturnValue")
   public void testHoldsLockOnAllOperations() {
     create().element();
     create().offer("foo");
@@ -263,8 +264,8 @@
     create().add("foo");
     create().addAll(ImmutableList.of("foo"));
     create().clear();
-    boolean unused = create().contains("foo");
-    boolean unused2 = create().containsAll(ImmutableList.of("foo"));
+    create().contains("foo");
+    create().containsAll(ImmutableList.of("foo"));
     create().equals(new ArrayDeque<>(ImmutableList.of("foo")));
     create().hashCode();
     create().isEmpty();
diff --git a/android/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java b/android/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
index 34d1c6f..b07802a 100644
--- a/android/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
@@ -159,11 +159,11 @@
    */
 
   public void testSize() {
-    create().size();
+    int unused = create().size();
   }
 
   public void testIsEmpty() {
-    create().isEmpty();
+    boolean unused = create().isEmpty();
   }
 
   public void testRemove() {
diff --git a/android/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java b/android/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java
index 70ff774..f7b04fe 100644
--- a/android/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java
+++ b/android/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java
@@ -152,6 +152,7 @@
     private static final long serialVersionUID = 0;
   }
 
+  @SuppressWarnings("CheckReturnValue")
   public void testHoldsLockOnAllOperations() {
     create().element();
     create().offer("foo");
@@ -161,8 +162,8 @@
     create().add("foo");
     create().addAll(ImmutableList.of("foo"));
     create().clear();
-    boolean unused = create().contains("foo");
-    boolean unused2 = create().containsAll(ImmutableList.of("foo"));
+    create().contains("foo");
+    create().containsAll(ImmutableList.of("foo"));
     create().equals(new ArrayDeque<>(ImmutableList.of("foo")));
     create().hashCode();
     create().isEmpty();
diff --git a/android/guava-tests/test/com/google/common/collect/TopKSelectorTest.java b/android/guava-tests/test/com/google/common/collect/TopKSelectorTest.java
index e21f817..2cebdc3 100644
--- a/android/guava-tests/test/com/google/common/collect/TopKSelectorTest.java
+++ b/android/guava-tests/test/com/google/common/collect/TopKSelectorTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.annotations.GwtCompatible;
 import com.google.common.math.IntMath;
 import com.google.common.primitives.Ints;
 import java.math.RoundingMode;
@@ -31,6 +32,7 @@
  *
  * @author Louis Wasserman
  */
+@GwtCompatible
 public class TopKSelectorTest extends TestCase {
 
   public void testNegativeK() {
@@ -119,4 +121,13 @@
     assertThat(top.topK()).containsExactlyElementsIn(Collections.nCopies(k, 0));
     assertThat(compareCalls[0]).isAtMost(10L * n * IntMath.log2(k, RoundingMode.CEILING));
   }
+
+  public void testExceedMaxIteration() {
+    /*
+     * Bug #5692 occurred when TopKSelector called Arrays.sort incorrectly.
+     */
+    TopKSelector<Integer> top = TopKSelector.least(7);
+    top.offerAll(Ints.asList(5, 7, 6, 2, 4, 3, 1, 0, 0, 0, 0, 0, 0, 0));
+    assertThat(top.topK()).isEqualTo(Ints.asList(0, 0, 0, 0, 0, 0, 0));
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java b/android/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
index d82633a..db68b89 100644
--- a/android/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
+++ b/android/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
@@ -539,6 +539,7 @@
         rangeMap.asMapOfRanges());
   }
 
+
   public void testSubRangeMapExhaustive() {
     for (Range<Integer> range1 : RANGES) {
       for (Range<Integer> range2 : RANGES) {
diff --git a/android/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java b/android/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java
index 498a1a1..b33ab2d 100644
--- a/android/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java
+++ b/android/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java
@@ -271,6 +271,7 @@
     return expected;
   }
 
+
   public void testSubRangeSet() {
     for (Range<Integer> range1 : QUERY_RANGES) {
       for (Range<Integer> range2 : QUERY_RANGES) {
@@ -309,6 +310,7 @@
     }
   }
 
+
   public void testSubRangeSetOfComplement() {
     for (Range<Integer> range1 : QUERY_RANGES) {
       for (Range<Integer> range2 : QUERY_RANGES) {
@@ -324,6 +326,7 @@
     }
   }
 
+
   public void testComplementOfSubRangeSet() {
     for (Range<Integer> range1 : QUERY_RANGES) {
       for (Range<Integer> range2 : QUERY_RANGES) {
diff --git a/android/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java b/android/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
index e386252..776e4bf 100644
--- a/android/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
+++ b/android/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
@@ -785,6 +785,7 @@
     assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
   }
 
+
   @Test
   public void concurrentIteration() throws Exception {
     addEdge(1, 2, "foo");
diff --git a/android/guava-tests/test/com/google/common/graph/MapCacheTest.java b/android/guava-tests/test/com/google/common/graph/MapCacheTest.java
index f66b19b..f04f010 100644
--- a/android/guava-tests/test/com/google/common/graph/MapCacheTest.java
+++ b/android/guava-tests/test/com/google/common/graph/MapCacheTest.java
@@ -90,25 +90,4 @@
     assertThat(mapCache.remove(fooReference2)).isEqualTo("bar");
     assertThat(mapCache.get(fooReference1)).isNull();
   }
-
-  @Test
-  public void testHandleNulls() {
-    mapCache.put("foo", "bar");
-    mapCache.put("non-null key", null);
-    mapCache.put(null, "non-null value");
-
-    assertThat(mapCache.get("foo")).isEqualTo("bar");
-    assertThat(mapCache.get("non-null key")).isNull();
-    assertThat(mapCache.get(null)).isEqualTo("non-null value");
-
-    assertThat(mapCache.containsKey("foo")).isTrue();
-    assertThat(mapCache.containsKey("bar")).isFalse();
-    assertThat(mapCache.containsKey("non-null key")).isTrue();
-    assertThat(mapCache.containsKey(null)).isTrue();
-
-    // Test again - in reverse order.
-    assertThat(mapCache.get(null)).isEqualTo("non-null value");
-    assertThat(mapCache.get("non-null key")).isNull();
-    assertThat(mapCache.get("foo")).isEqualTo("bar");
-  }
 }
diff --git a/android/guava-tests/test/com/google/common/graph/ValueGraphTest.java b/android/guava-tests/test/com/google/common/graph/ValueGraphTest.java
index a3f4814..b17c91d 100644
--- a/android/guava-tests/test/com/google/common/graph/ValueGraphTest.java
+++ b/android/guava-tests/test/com/google/common/graph/ValueGraphTest.java
@@ -380,6 +380,7 @@
         .inOrder();
   }
 
+
   @Test
   public void concurrentIteration() throws Exception {
     graph = ValueGraphBuilder.directed().build();
diff --git a/android/guava-tests/test/com/google/common/hash/BloomFilterTest.java b/android/guava-tests/test/com/google/common/hash/BloomFilterTest.java
index 4d64f98..f69b578 100644
--- a/android/guava-tests/test/com/google/common/hash/BloomFilterTest.java
+++ b/android/guava-tests/test/com/google/common/hash/BloomFilterTest.java
@@ -519,6 +519,7 @@
     assertEquals(BloomFilterStrategies.MURMUR128_MITZ_64, BloomFilterStrategies.values()[1]);
   }
 
+
   public void testNoRaceConditions() throws Exception {
     final BloomFilter<Integer> bloomFilter =
         BloomFilter.create(Funnels.integerFunnel(), 15_000_000, 0.01);
diff --git a/android/guava-tests/test/com/google/common/hash/Crc32cHashFunctionTest.java b/android/guava-tests/test/com/google/common/hash/Crc32cHashFunctionTest.java
index 4619cec..3bea975 100644
--- a/android/guava-tests/test/com/google/common/hash/Crc32cHashFunctionTest.java
+++ b/android/guava-tests/test/com/google/common/hash/Crc32cHashFunctionTest.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Charsets.UTF_8;
 
 import java.util.Arrays;
+import java.util.Random;
 import junit.framework.TestCase;
 
 /**
@@ -26,14 +27,22 @@
  * @author Kurt Alfred Kluever
  */
 public class Crc32cHashFunctionTest extends TestCase {
+  public void testEmpty() {
+    assertCrc(0, new byte[0]);
+  }
 
   public void testZeros() {
     // Test 32 byte array of 0x00.
     byte[] zeros = new byte[32];
-    Arrays.fill(zeros, (byte) 0x00);
     assertCrc(0x8a9136aa, zeros);
   }
 
+  public void testZeros100() {
+    // Test 100 byte array of 0x00.
+    byte[] zeros = new byte[100];
+    assertCrc(0x07cb9ff6, zeros);
+  }
+
   public void testFull() {
     // Test 32 byte array of 0xFF.
     byte[] fulls = new byte[32];
@@ -41,6 +50,13 @@
     assertCrc(0x62a8ab43, fulls);
   }
 
+  public void testFull100() {
+    // Test 100 byte array of 0xFF.
+    byte[] fulls = new byte[100];
+    Arrays.fill(fulls, (byte) 0xFF);
+    assertCrc(0xbc753add, fulls);
+  }
+
   public void testAscending() {
     // Test 32 byte arrays of ascending.
     byte[] ascending = new byte[32];
@@ -59,6 +75,15 @@
     assertCrc(0x113fdb5c, descending);
   }
 
+  public void testDescending100() {
+    // Test 100 byte arrays of descending.
+    byte[] descending = new byte[100];
+    for (int i = 0; i < 100; i++) {
+      descending[i] = (byte) (99 - i);
+    }
+    assertCrc(0xd022db97, descending);
+  }
+
   public void testScsiReadCommand() {
     // Test SCSI read command.
     byte[] scsiReadCommand =
@@ -87,6 +112,23 @@
     assertCrc(0xBFE92A83, "23456789".getBytes(UTF_8));
   }
 
+  public void testAgainstSimplerImplementation() {
+    Random r = new Random(1234567);
+    for (int length = 0; length < 1000; length++) {
+      byte[] bytes = new byte[length];
+      r.nextBytes(bytes);
+      assertCrc(referenceCrc(bytes), bytes);
+    }
+  }
+
+  private static int referenceCrc(byte[] bytes) {
+    int crc = ~0;
+    for (byte b : bytes) {
+      crc = (crc >>> 8) ^ Crc32cHashFunction.Crc32cHasher.BYTE_TABLE[(crc ^ b) & 0xFF];
+    }
+    return ~crc;
+  }
+
   /**
    * Verifies that the crc of an array of byte data matches the expected value.
    *
@@ -95,7 +137,15 @@
    */
   private static void assertCrc(int expectedCrc, byte[] data) {
     int actualCrc = Hashing.crc32c().hashBytes(data).asInt();
-    assertEquals(expectedCrc, actualCrc);
+    assertEquals(
+        String.format("expected: %08x, actual: %08x", expectedCrc, actualCrc),
+        expectedCrc,
+        actualCrc);
+    int actualCrcHasher = Hashing.crc32c().newHasher().putBytes(data).hash().asInt();
+    assertEquals(
+        String.format("expected: %08x, actual: %08x", expectedCrc, actualCrc),
+        expectedCrc,
+        actualCrcHasher);
   }
 
   // From RFC 3720, Section 12.1, the polynomial generator is 0x11EDC6F41.
@@ -105,7 +155,7 @@
   private static final int CRC32C_GENERATOR = 0x1EDC6F41; // 0x11EDC6F41
   private static final int CRC32C_GENERATOR_FLIPPED = Integer.reverse(CRC32C_GENERATOR);
 
-  public void testCrc32cLookupTable() {
+  public void testCrc32cByteTable() {
     // See Hacker's Delight 2nd Edition, Figure 14-7.
     int[] expected = new int[256];
     for (int i = 0; i < expected.length; i++) {
@@ -117,9 +167,47 @@
       expected[i] = crc;
     }
 
-    int[] actual = Crc32cHashFunction.Crc32cHasher.CRC_TABLE;
+    int[] actual = Crc32cHashFunction.Crc32cHasher.BYTE_TABLE;
     assertTrue(
         "Expected: \n" + Arrays.toString(expected) + "\nActual:\n" + Arrays.toString(actual),
         Arrays.equals(expected, actual));
   }
+
+  static int advanceOneBit(int next) {
+    if ((next & 1) != 0) {
+      return (next >>> 1) ^ CRC32C_GENERATOR_FLIPPED;
+    } else {
+      return next >>> 1;
+    }
+  }
+
+  public void testCrc32cStrideTable() {
+    int next = CRC32C_GENERATOR_FLIPPED;
+    for (int i = 0; i < 12; i++) { // for 3 ints = 12 bytes in between each stride window
+      next = (next >>> 8) ^ Crc32cHashFunction.Crc32cHasher.BYTE_TABLE[next & 0xFF];
+    }
+    int[][] expected = new int[4][256];
+    for (int b = 0; b < 4; ++b) {
+      for (int bit = 128; bit != 0; bit >>= 1) {
+        expected[b][bit] = next;
+        next = advanceOneBit(next);
+      }
+    }
+    for (int b = 0; b < 4; ++b) {
+      expected[b][0] = 0;
+      for (int bit = 2; bit < 256; bit <<= 1) {
+        for (int i = bit + 1; i < (bit << 1); i++) {
+          expected[b][i] = expected[b][bit] ^ expected[b][i ^ bit];
+        }
+      }
+    }
+
+    int[][] actual = Crc32cHashFunction.Crc32cHasher.STRIDE_TABLE;
+    assertTrue(
+        "Expected: \n"
+            + Arrays.deepToString(expected)
+            + "\nActual:\n"
+            + Arrays.deepToString(actual),
+        Arrays.deepEquals(expected, actual));
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/hash/HashFunctionEnum.java b/android/guava-tests/test/com/google/common/hash/HashFunctionEnum.java
index c055063..3471747 100644
--- a/android/guava-tests/test/com/google/common/hash/HashFunctionEnum.java
+++ b/android/guava-tests/test/com/google/common/hash/HashFunctionEnum.java
@@ -16,6 +16,7 @@
 
 package com.google.common.hash;
 
+
 /**
  * An enum that contains all of the known hash functions.
  *
@@ -31,6 +32,7 @@
   MD5(Hashing.md5()),
   MURMUR3_128(Hashing.murmur3_128()),
   MURMUR3_32(Hashing.murmur3_32()),
+  MURMUR3_32_FIXED(Hashing.murmur3_32_fixed()),
   SHA1(Hashing.sha1()),
   SHA256(Hashing.sha256()),
   SHA384(Hashing.sha384()),
diff --git a/android/guava-tests/test/com/google/common/hash/HashTestUtils.java b/android/guava-tests/test/com/google/common/hash/HashTestUtils.java
index 8dfbdb0..9e9944b 100644
--- a/android/guava-tests/test/com/google/common/hash/HashTestUtils.java
+++ b/android/guava-tests/test/com/google/common/hash/HashTestUtils.java
@@ -195,8 +195,8 @@
         int limit = pos + random.nextInt(value.length - pos + 1);
         for (PrimitiveSink sink : sinks) {
           ByteBuffer buffer = ByteBuffer.wrap(value);
-          buffer.position(pos);
-          buffer.limit(limit);
+          Java8Compatibility.position(buffer, pos);
+          Java8Compatibility.limit(buffer, limit);
           sink.putBytes(buffer);
           assertEquals(limit, buffer.limit());
           assertEquals(limit, buffer.position());
diff --git a/android/guava-tests/test/com/google/common/hash/HashingTest.java b/android/guava-tests/test/com/google/common/hash/HashingTest.java
index dc50299..bc3db34 100644
--- a/android/guava-tests/test/com/google/common/hash/HashingTest.java
+++ b/android/guava-tests/test/com/google/common/hash/HashingTest.java
@@ -146,7 +146,7 @@
   // goodFastHash(128) uses Murmur3_128. Use the same epsilon bounds.
   public void testGoodFastHash128() {
     HashTestUtils.check2BitAvalanche(Hashing.goodFastHash(128), 250, 0.20);
-    HashTestUtils.checkAvalanche(Hashing.goodFastHash(128), 250, 0.17);
+    HashTestUtils.checkAvalanche(Hashing.goodFastHash(128), 500, 0.17);
     HashTestUtils.checkNo2BitCharacteristics(Hashing.goodFastHash(128));
     HashTestUtils.checkNoFunnels(Hashing.goodFastHash(128));
     HashTestUtils.assertInvariants(Hashing.goodFastHash(128));
@@ -155,7 +155,7 @@
   // goodFastHash(256) uses Murmur3_128. Use the same epsilon bounds.
   public void testGoodFastHash256() {
     HashTestUtils.check2BitAvalanche(Hashing.goodFastHash(256), 250, 0.20);
-    HashTestUtils.checkAvalanche(Hashing.goodFastHash(256), 250, 0.17);
+    HashTestUtils.checkAvalanche(Hashing.goodFastHash(256), 500, 0.17);
     HashTestUtils.checkNo2BitCharacteristics(Hashing.goodFastHash(256));
     HashTestUtils.checkNoFunnels(Hashing.goodFastHash(256));
     HashTestUtils.assertInvariants(Hashing.goodFastHash(256));
@@ -432,6 +432,9 @@
           .put(Hashing.murmur3_32(), EMPTY_STRING, "00000000")
           .put(Hashing.murmur3_32(), TQBFJOTLD, "23f74f2e")
           .put(Hashing.murmur3_32(), TQBFJOTLDP, "fc8bc4d5")
+          .put(Hashing.murmur3_32_fixed(), EMPTY_STRING, "00000000")
+          .put(Hashing.murmur3_32_fixed(), TQBFJOTLD, "23f74f2e")
+          .put(Hashing.murmur3_32_fixed(), TQBFJOTLDP, "fc8bc4d5")
           .put(Hashing.sha1(), EMPTY_STRING, "da39a3ee5e6b4b0d3255bfef95601890afd80709")
           .put(Hashing.sha1(), TQBFJOTLD, "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12")
           .put(Hashing.sha1(), TQBFJOTLDP, "408d94384216f890ff7a0c3528e8bed1e0b01621")
diff --git a/android/guava-tests/test/com/google/common/hash/Murmur3Hash32Test.java b/android/guava-tests/test/com/google/common/hash/Murmur3Hash32Test.java
index de86e4b..181b2a7 100644
--- a/android/guava-tests/test/com/google/common/hash/Murmur3Hash32Test.java
+++ b/android/guava-tests/test/com/google/common/hash/Murmur3Hash32Test.java
@@ -17,9 +17,11 @@
 package com.google.common.hash;
 
 import static com.google.common.hash.Hashing.murmur3_32;
+import static com.google.common.hash.Hashing.murmur3_32_fixed;
 
 import com.google.common.base.Charsets;
 import com.google.common.hash.HashTestUtils.HashFn;
+import java.nio.charset.Charset;
 import java.util.Random;
 import junit.framework.TestCase;
 
@@ -51,16 +53,53 @@
         -528633700, murmur3_32().hashUnencodedChars("The quick brown fox jumps over the lazy dog"));
   }
 
-  public void testKnownUtf8StringInputs() {
-    assertHash(0, murmur3_32().hashString("", Charsets.UTF_8));
-    assertHash(0xcfbda5d1, murmur3_32().hashString("k", Charsets.UTF_8));
-    assertHash(0xa167dbf3, murmur3_32().hashString("hell", Charsets.UTF_8));
-    assertHash(0x248bfa47, murmur3_32().hashString("hello", Charsets.UTF_8));
-    assertHash(0x3d41b97c, murmur3_32().hashString("http://www.google.com/", Charsets.UTF_8));
-    assertHash(
-        0x2e4ff723,
-        murmur3_32().hashString("The quick brown fox jumps over the lazy dog", Charsets.UTF_8));
-    assertHash(0xfc5ba834, murmur3_32().hashString("毎月1日,毎週月曜日", Charsets.UTF_8));
+  @SuppressWarnings("deprecation")
+  public void testKnownEncodedStringInputs() {
+    assertStringHash(0, "", Charsets.UTF_8);
+    assertStringHash(0xcfbda5d1, "k", Charsets.UTF_8);
+    assertStringHash(0xa167dbf3, "hell", Charsets.UTF_8);
+    assertStringHash(0x248bfa47, "hello", Charsets.UTF_8);
+    assertStringHash(0x3d41b97c, "http://www.google.com/", Charsets.UTF_8);
+    assertStringHash(0x2e4ff723, "The quick brown fox jumps over the lazy dog", Charsets.UTF_8);
+    assertStringHash(0xb5a4be05, "ABCDefGHI\u0799", Charsets.UTF_8);
+    assertStringHash(0xfc5ba834, "毎月1日,毎週月曜日", Charsets.UTF_8);
+    assertStringHash(0x8a5c3699, "surrogate pair: \uD83D\uDCB0", Charsets.UTF_8);
+
+    assertStringHash(0, "", Charsets.UTF_16LE);
+    assertStringHash(0x288418e4, "k", Charsets.UTF_16LE);
+    assertStringHash(0x5a0cb7c3, "hell", Charsets.UTF_16LE);
+    assertStringHash(0xd7c31989, "hello", Charsets.UTF_16LE);
+    assertStringHash(0x73564d8c, "http://www.google.com/", Charsets.UTF_16LE);
+    assertStringHash(0xe07db09c, "The quick brown fox jumps over the lazy dog", Charsets.UTF_16LE);
+    assertStringHash(0xfefa3e76, "ABCDefGHI\u0799", Charsets.UTF_16LE);
+    assertStringHash(0x6a7be132, "毎月1日,毎週月曜日", Charsets.UTF_16LE);
+    assertStringHash(0x5a2d41c7, "surrogate pair: \uD83D\uDCB0", Charsets.UTF_16LE);
+  }
+
+  @SuppressWarnings("deprecation")
+  private void assertStringHash(int expected, String string, Charset charset) {
+    if (allBmp(string)) {
+      assertHash(expected, murmur3_32().hashString(string, charset));
+    }
+    assertHash(expected, murmur3_32_fixed().hashString(string, charset));
+    assertHash(expected, murmur3_32().newHasher().putString(string, charset).hash());
+    assertHash(expected, murmur3_32_fixed().newHasher().putString(string, charset).hash());
+    assertHash(expected, murmur3_32().hashBytes(string.getBytes(charset)));
+    assertHash(expected, murmur3_32_fixed().hashBytes(string.getBytes(charset)));
+    assertHash(expected, murmur3_32().newHasher().putBytes(string.getBytes(charset)).hash());
+    assertHash(expected, murmur3_32_fixed().newHasher().putBytes(string.getBytes(charset)).hash());
+  }
+
+  private boolean allBmp(String string) {
+    // Ordinarily we'd use something like i += Character.charCount(string.codePointAt(i)) here. But
+    // we can get away with i++ because the whole point of this method is to return false if we find
+    // a code point that doesn't fit in a char.
+    for (int i = 0; i < string.length(); i++) {
+      if (string.codePointAt(i) > 0xffff) {
+        return false;
+      }
+    }
+    return true;
   }
 
   @SuppressWarnings("deprecation")
@@ -71,7 +110,7 @@
   }
 
   @SuppressWarnings("deprecation")
-  public void testStringInputsUtf8() {
+  public void testEncodedStringInputs() {
     Random rng = new Random(0);
     for (int z = 0; z < 100; z++) {
       String str;
@@ -88,9 +127,16 @@
         builder.appendCodePoint(codePoints[i]);
       }
       str = builder.toString();
+      HashCode hashUtf8 = murmur3_32().hashBytes(str.getBytes(Charsets.UTF_8));
       assertEquals(
-          murmur3_32().hashBytes(str.getBytes(Charsets.UTF_8)),
-          murmur3_32().hashString(str, Charsets.UTF_8));
+          hashUtf8, murmur3_32().newHasher().putBytes(str.getBytes(Charsets.UTF_8)).hash());
+      assertEquals(hashUtf8, murmur3_32().hashString(str, Charsets.UTF_8));
+      assertEquals(hashUtf8, murmur3_32().newHasher().putString(str, Charsets.UTF_8).hash());
+      HashCode hashUtf16 = murmur3_32().hashBytes(str.getBytes(Charsets.UTF_16));
+      assertEquals(
+          hashUtf16, murmur3_32().newHasher().putBytes(str.getBytes(Charsets.UTF_16)).hash());
+      assertEquals(hashUtf16, murmur3_32().hashString(str, Charsets.UTF_16));
+      assertEquals(hashUtf16, murmur3_32().newHasher().putString(str, Charsets.UTF_16).hash());
     }
   }
 
@@ -138,8 +184,12 @@
     assertEquals(
         murmur3_32().hashBytes(str.getBytes(Charsets.UTF_8)),
         murmur3_32().hashString(str, Charsets.UTF_8));
+    assertEquals(
+        murmur3_32_fixed().hashBytes(str.getBytes(Charsets.UTF_8)),
+        murmur3_32().hashString(str, Charsets.UTF_8));
   }
 
+  @SuppressWarnings("deprecation")
   public void testInvalidUnicodeHasherPutString() {
     String str =
         new String(
@@ -147,5 +197,8 @@
     assertEquals(
         murmur3_32().hashBytes(str.getBytes(Charsets.UTF_8)),
         murmur3_32().newHasher().putString(str, Charsets.UTF_8).hash());
+    assertEquals(
+        murmur3_32_fixed().hashBytes(str.getBytes(Charsets.UTF_8)),
+        murmur3_32_fixed().newHasher().putString(str, Charsets.UTF_8).hash());
   }
 }
diff --git a/android/guava-tests/test/com/google/common/html/HtmlEscapersTest.java b/android/guava-tests/test/com/google/common/html/HtmlEscapersTest.java
old mode 100755
new mode 100644
diff --git a/android/guava-tests/test/com/google/common/io/ByteSourceTest.java b/android/guava-tests/test/com/google/common/io/ByteSourceTest.java
index f0ba829..3cf6cca 100644
--- a/android/guava-tests/test/com/google/common/io/ByteSourceTest.java
+++ b/android/guava-tests/test/com/google/common/io/ByteSourceTest.java
@@ -30,6 +30,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.hash.Hashing;
+import com.google.common.io.Closer.LoggingSuppressor;
 import com.google.common.primitives.UnsignedBytes;
 import com.google.common.testing.TestLogHandler;
 import java.io.ByteArrayOutputStream;
@@ -395,7 +396,7 @@
       ImmutableSet.of(BROKEN_CLOSE_SINK, BROKEN_OPEN_SINK, BROKEN_WRITE_SINK);
 
   public void testCopyExceptions() {
-    if (!Closer.SuppressingSuppressor.isAvailable()) {
+    if (Closer.create().suppressor instanceof LoggingSuppressor) {
       // test that exceptions are logged
 
       TestLogHandler logHandler = new TestLogHandler();
diff --git a/android/guava-tests/test/com/google/common/io/ByteSourceTester.java b/android/guava-tests/test/com/google/common/io/ByteSourceTester.java
index 490f1e6..7585412 100644
--- a/android/guava-tests/test/com/google/common/io/ByteSourceTester.java
+++ b/android/guava-tests/test/com/google/common/io/ByteSourceTester.java
@@ -38,7 +38,7 @@
 /**
  * A generator of {@code TestSuite} instances for testing {@code ByteSource} implementations.
  * Generates tests of a all methods on a {@code ByteSource} given various inputs the source is
- * expected to contain as well as as sub-suites for testing the {@code CharSource} view and {@code
+ * expected to contain as well as sub-suites for testing the {@code CharSource} view and {@code
  * slice()} views in the same way.
  *
  * @author Colin Decker
diff --git a/android/guava-tests/test/com/google/common/io/ByteStreamsTest.java b/android/guava-tests/test/com/google/common/io/ByteStreamsTest.java
index f715303..3ae2c25 100644
--- a/android/guava-tests/test/com/google/common/io/ByteStreamsTest.java
+++ b/android/guava-tests/test/com/google/common/io/ByteStreamsTest.java
@@ -51,6 +51,7 @@
     assertThat(out.toByteArray()).isEqualTo(expected);
   }
 
+
   public void testCopyFileChannel() throws IOException {
     final int chunkSize = 14407; // Random prime, unlikely to match any internal chunk size
     ByteArrayOutputStream out = new ByteArrayOutputStream();
diff --git a/android/guava-tests/test/com/google/common/io/CharSequenceReaderTest.java b/android/guava-tests/test/com/google/common/io/CharSequenceReaderTest.java
index 12bc17e..dbe94fc 100644
--- a/android/guava-tests/test/com/google/common/io/CharSequenceReaderTest.java
+++ b/android/guava-tests/test/com/google/common/io/CharSequenceReaderTest.java
@@ -211,7 +211,7 @@
     reader = new CharSequenceReader(charSequence);
     CharBuffer buf2 = CharBuffer.allocate(expected.length());
     assertEquals(expected.length() == 0 ? -1 : expected.length(), reader.read(buf2));
-    buf2.flip();
+    Java8Compatibility.flip(buf2);
     assertEquals(expected, buf2.toString());
     assertFullyRead(reader);
 
@@ -220,9 +220,9 @@
     buf2 = CharBuffer.allocate(5);
     builder = new StringBuilder();
     while (reader.read(buf2) != -1) {
-      buf2.flip();
+      Java8Compatibility.flip(buf2);
       builder.append(buf2);
-      buf2.clear();
+      Java8Compatibility.clear(buf2);
     }
     assertEquals(expected, builder.toString());
     assertFullyRead(reader);
diff --git a/android/guava-tests/test/com/google/common/io/CharSourceTest.java b/android/guava-tests/test/com/google/common/io/CharSourceTest.java
index a103490..6cc210b 100644
--- a/android/guava-tests/test/com/google/common/io/CharSourceTest.java
+++ b/android/guava-tests/test/com/google/common/io/CharSourceTest.java
@@ -25,6 +25,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.io.Closer.LoggingSuppressor;
 import com.google.common.testing.TestLogHandler;
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -258,7 +259,7 @@
       ImmutableSet.of(BROKEN_CLOSE_SINK, BROKEN_OPEN_SINK, BROKEN_WRITE_SINK);
 
   public void testCopyExceptions() {
-    if (!Closer.SuppressingSuppressor.isAvailable()) {
+    if (Closer.create().suppressor instanceof LoggingSuppressor) {
       // test that exceptions are logged
 
       TestLogHandler logHandler = new TestLogHandler();
diff --git a/android/guava-tests/test/com/google/common/io/CloserTest.java b/android/guava-tests/test/com/google/common/io/CloserTest.java
index b97a305..23037f2 100644
--- a/android/guava-tests/test/com/google/common/io/CloserTest.java
+++ b/android/guava-tests/test/com/google/common/io/CloserTest.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
+import com.google.common.io.Closer.LoggingSuppressor;
 import com.google.common.testing.TestLogHandler;
 import java.io.Closeable;
 import java.io.IOException;
@@ -311,13 +312,12 @@
   }
 
   public static void testSuppressingSuppressorIfPossible() throws IOException {
+    Closer closer = Closer.create();
     // can't test the JDK7 suppressor when not running on JDK7
-    if (!Closer.SuppressingSuppressor.isAvailable()) {
+    if (closer.suppressor instanceof LoggingSuppressor) {
       return;
     }
 
-    Closer closer = new Closer(new Closer.SuppressingSuppressor());
-
     IOException thrownException = new IOException();
     IOException c1Exception = new IOException();
     RuntimeException c2Exception = new RuntimeException();
diff --git a/android/guava-tests/test/com/google/common/io/FileBackedOutputStreamTest.java b/android/guava-tests/test/com/google/common/io/FileBackedOutputStreamTest.java
index 66558e9..6841a41 100644
--- a/android/guava-tests/test/com/google/common/io/FileBackedOutputStreamTest.java
+++ b/android/guava-tests/test/com/google/common/io/FileBackedOutputStreamTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.io;
 
+
 import com.google.common.testing.GcFinalization;
 import java.io.File;
 import java.io.IOException;
@@ -29,6 +30,7 @@
  */
 public class FileBackedOutputStreamTest extends IoTestCase {
 
+
   public void testThreshold() throws Exception {
     testThreshold(0, 100, true, false);
     testThreshold(10, 100, true, false);
@@ -76,6 +78,7 @@
     }
   }
 
+
   public void testFinalizeDeletesFile() throws Exception {
     byte[] data = newPreFilledByteArray(100);
     FileBackedOutputStream out = new FileBackedOutputStream(0, true);
@@ -99,6 +102,7 @@
         });
   }
 
+
   public void testThreshold_resetOnFinalize() throws Exception {
     testThreshold(0, 100, true, true);
     testThreshold(10, 100, true, true);
diff --git a/android/guava-tests/test/com/google/common/io/FilesTest.java b/android/guava-tests/test/com/google/common/io/FilesTest.java
index e987f60..8446da1 100644
--- a/android/guava-tests/test/com/google/common/io/FilesTest.java
+++ b/android/guava-tests/test/com/google/common/io/FilesTest.java
@@ -16,7 +16,6 @@
 
 package com.google.common.io;
 
-import static com.google.common.io.Files.touch;
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.base.Charsets;
@@ -196,7 +195,7 @@
     File temp2 = createTempFile();
     Files.write(ASCII, temp2, Charsets.UTF_8);
     Files.copy(temp1, temp2);
-    assertEquals(ASCII, Files.toString(temp1, Charsets.UTF_8));
+    assertEquals(ASCII, Files.toString(temp2, Charsets.UTF_8));
   }
 
   public void testEqual() throws IOException {
diff --git a/android/guava-tests/test/com/google/common/io/PatternFilenameFilterTest.java b/android/guava-tests/test/com/google/common/io/PatternFilenameFilterTest.java
index 77ace52..94ab1f0 100644
--- a/android/guava-tests/test/com/google/common/io/PatternFilenameFilterTest.java
+++ b/android/guava-tests/test/com/google/common/io/PatternFilenameFilterTest.java
@@ -16,6 +16,8 @@
 
 package com.google.common.io;
 
+import com.google.common.testing.NullPointerTester;
+import com.google.common.testing.NullPointerTester.Visibility;
 import java.io.File;
 import java.io.FilenameFilter;
 import java.util.regex.PatternSyntaxException;
@@ -46,4 +48,15 @@
     // Show that dir is ignored
     assertTrue(filter.accept(null, "a"));
   }
+
+  public void testNulls() throws Exception {
+    NullPointerTester tester = new NullPointerTester();
+
+    tester.testConstructors(PatternFilenameFilter.class, Visibility.PACKAGE);
+    tester.testStaticMethods(PatternFilenameFilter.class, Visibility.PACKAGE); // currently none
+
+    // The reason that we skip this method is discussed in a comment on the method.
+    tester.ignore(PatternFilenameFilter.class.getMethod("accept", File.class, String.class));
+    tester.testInstanceMethods(new PatternFilenameFilter(".*"), Visibility.PACKAGE);
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/io/SourceSinkFactories.java b/android/guava-tests/test/com/google/common/io/SourceSinkFactories.java
index 8bfa6e1..cf3fad4 100644
--- a/android/guava-tests/test/com/google/common/io/SourceSinkFactories.java
+++ b/android/guava-tests/test/com/google/common/io/SourceSinkFactories.java
@@ -407,9 +407,9 @@
       StringBuilder builder = new StringBuilder();
       CharBuffer buffer = CharBuffer.allocate(100);
       while (reader.read(buffer) != -1) {
-        buffer.flip();
+        Java8Compatibility.flip(buffer);
         builder.append(buffer);
-        buffer.clear();
+        Java8Compatibility.clear(buffer);
       }
       return builder.toString();
     }
diff --git a/android/guava-tests/test/com/google/common/math/BigIntegerMathTest.java b/android/guava-tests/test/com/google/common/math/BigIntegerMathTest.java
index 8a9b4fc..170261b 100644
--- a/android/guava-tests/test/com/google/common/math/BigIntegerMathTest.java
+++ b/android/guava-tests/test/com/google/common/math/BigIntegerMathTest.java
@@ -441,7 +441,7 @@
   @GwtIncompatible // TODO
   @AndroidIncompatible // slow
   public void testDivNonZeroExact() {
-    boolean isAndroid = System.getProperties().getProperty("java.runtime.name").contains("Android");
+    boolean isAndroid = System.getProperty("java.runtime.name").contains("Android");
     for (BigInteger p : NONZERO_BIGINTEGER_CANDIDATES) {
       for (BigInteger q : NONZERO_BIGINTEGER_CANDIDATES) {
         if (isAndroid && p.equals(BAD_FOR_ANDROID_P) && q.equals(BAD_FOR_ANDROID_Q)) {
diff --git a/android/guava-tests/test/com/google/common/math/LongMathTest.java b/android/guava-tests/test/com/google/common/math/LongMathTest.java
index 2284668..40c2ac9 100644
--- a/android/guava-tests/test/com/google/common/math/LongMathTest.java
+++ b/android/guava-tests/test/com/google/common/math/LongMathTest.java
@@ -747,6 +747,7 @@
     }
   }
 
+
   @GwtIncompatible // Slow
   public void testBinomial_exhaustiveNotOverflowing() {
     // Tests all of the inputs to LongMath.binomial that won't cause it to overflow, that weren't
@@ -783,6 +784,7 @@
     }
   }
 
+
   @GwtIncompatible // far too slow
   public void testSqrtOfPerfectSquareAsDoubleIsPerfect() {
     // This takes just over a minute on my machine.
diff --git a/android/guava-tests/test/com/google/common/math/MathPreconditionsTest.java b/android/guava-tests/test/com/google/common/math/MathPreconditionsTest.java
index 69719e0..5dbe017 100644
--- a/android/guava-tests/test/com/google/common/math/MathPreconditionsTest.java
+++ b/android/guava-tests/test/com/google/common/math/MathPreconditionsTest.java
@@ -289,4 +289,15 @@
       assertThat(expected).hasMessageThat().contains("testCheckNoOverflow_failure(0, 0)");
     }
   }
+
+  public void testNulls() {
+    /*
+     * Don't bother testing. All non-primitive parameters are used only to construct error messages.
+     * We never want to pass null for them, so we haven't annotated them to say that null is
+     * allowed. But at the same time, it seems wasteful to bother inserting the checkNotNull calls
+     * that NullPointerTester wants.
+     *
+     * (This empty method disables the automatic null testing provided by PackageSanityTests.)
+     */
+  }
 }
diff --git a/android/guava-tests/test/com/google/common/math/TestPlatform.java b/android/guava-tests/test/com/google/common/math/TestPlatform.java
index 95df331..03eb2ec 100644
--- a/android/guava-tests/test/com/google/common/math/TestPlatform.java
+++ b/android/guava-tests/test/com/google/common/math/TestPlatform.java
@@ -26,6 +26,6 @@
   }
 
   static boolean isAndroid() {
-    return System.getProperties().getProperty("java.runtime.name").contains("Android");
+    return System.getProperty("java.runtime.name").contains("Android");
   }
 }
diff --git a/android/guava-tests/test/com/google/common/net/HostAndPortTest.java b/android/guava-tests/test/com/google/common/net/HostAndPortTest.java
index 5e7eb2f..65e8096 100644
--- a/android/guava-tests/test/com/google/common/net/HostAndPortTest.java
+++ b/android/guava-tests/test/com/google/common/net/HostAndPortTest.java
@@ -59,6 +59,13 @@
     checkFromStringCase("[2001::2]:85", 77, "2001::2", 85, true);
   }
 
+  public void testFromStringNonAsciiDigits() {
+    // Same as testFromStringUnusedDefaultPort but with Gujarati digits for port numbers.
+    checkFromStringCase("gmail.com:૮1", 77, null, -1, false);
+    checkFromStringCase("192.0.2.2:૮૩", 77, null, -1, false);
+    checkFromStringCase("[2001::2]:૮૫", 77, null, -1, false);
+  }
+
   public void testFromStringBadPort() {
     // Out-of-range ports.
     checkFromStringCase("google.com:65536", 1, null, 99, false);
diff --git a/android/guava-tests/test/com/google/common/net/HttpHeadersTest.java b/android/guava-tests/test/com/google/common/net/HttpHeadersTest.java
index 9927e6b..5361b3f 100644
--- a/android/guava-tests/test/com/google/common/net/HttpHeadersTest.java
+++ b/android/guava-tests/test/com/google/common/net/HttpHeadersTest.java
@@ -50,8 +50,8 @@
             .build();
     ImmutableSet<String> uppercaseAcronyms =
         ImmutableSet.of(
-            "CH", "ID", "DNT", "DNS", "HTTP2", "IP", "MD5", "P3P", "TE", "UA", "UID", "URL", "WWW",
-            "XSS");
+            "CH", "ID", "DNT", "DNS", "ECT", "HTTP2", "IP", "MD5", "P3P", "RTT", "TE", "UA", "UID",
+            "URL", "WWW", "XSS");
     assertConstantNameMatchesString(HttpHeaders.class, specialCases, uppercaseAcronyms);
   }
 
diff --git a/android/guava-tests/test/com/google/common/net/InetAddressesTest.java b/android/guava-tests/test/com/google/common/net/InetAddressesTest.java
index ed3aa27..be77e7b 100644
--- a/android/guava-tests/test/com/google/common/net/InetAddressesTest.java
+++ b/android/guava-tests/test/com/google/common/net/InetAddressesTest.java
@@ -135,6 +135,20 @@
     assertTrue(InetAddresses.isInetAddress(ipStr));
   }
 
+  public void testForStringIPv4NonAsciiInput() throws UnknownHostException {
+    String ipStr = "૧૯૨.૧૬૮.૦.૧"; // 192.168.0.1 in Gujarati digits
+    // Shouldn't hit DNS, because it's an IP string literal.
+    InetAddress ipv4Addr;
+    try {
+      ipv4Addr = InetAddress.getByName(ipStr);
+    } catch (UnknownHostException e) {
+      // OK: this is probably Android, which is stricter.
+      return;
+    }
+    assertEquals(ipv4Addr, InetAddresses.forString(ipStr));
+    assertTrue(InetAddresses.isInetAddress(ipStr));
+  }
+
   public void testForStringIPv6Input() throws UnknownHostException {
     String ipStr = "3ffe::1";
     // Shouldn't hit DNS, because it's an IP string literal.
@@ -143,6 +157,20 @@
     assertTrue(InetAddresses.isInetAddress(ipStr));
   }
 
+  public void testForStringIPv6NonAsciiInput() throws UnknownHostException {
+    String ipStr = "૩ffe::૧"; // 3ffe::1 with Gujarati digits for 3 and 1
+    // Shouldn't hit DNS, because it's an IP string literal.
+    InetAddress ipv6Addr;
+    try {
+      ipv6Addr = InetAddress.getByName(ipStr);
+    } catch (UnknownHostException e) {
+      // OK: this is probably Android, which is stricter.
+      return;
+    }
+    assertEquals(ipv6Addr, InetAddresses.forString(ipStr));
+    assertTrue(InetAddresses.isInetAddress(ipStr));
+  }
+
   public void testForStringIPv6EightColons() throws UnknownHostException {
     ImmutableSet<String> eightColons =
         ImmutableSet.of("::7:6:5:4:3:2:1", "::7:6:5:4:3:2:0", "7:6:5:4:3:2:1::", "0:6:5:4:3:2:1::");
diff --git a/android/guava-tests/test/com/google/common/net/InternetDomainNameTest.java b/android/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
index 09602b7..7113fb4 100644
--- a/android/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
+++ b/android/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.net;
 
+
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Ascii;
diff --git a/android/guava-tests/test/com/google/common/net/MediaTypeTest.java b/android/guava-tests/test/com/google/common/net/MediaTypeTest.java
index cec3cdd..574db68 100644
--- a/android/guava-tests/test/com/google/common/net/MediaTypeTest.java
+++ b/android/guava-tests/test/com/google/common/net/MediaTypeTest.java
@@ -46,7 +46,6 @@
 import com.google.common.testing.NullPointerTester;
 import java.lang.reflect.Field;
 import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
 import java.nio.charset.UnsupportedCharsetException;
 import java.util.Arrays;
 import junit.framework.TestCase;
@@ -537,7 +536,7 @@
     try {
       mediaType.charset();
       fail();
-    } catch (IllegalCharsetNameException expected) {
+    } catch (IllegalArgumentException expected) {
     }
   }
 
diff --git a/android/guava-tests/test/com/google/common/primitives/UnsignedLongTest.java b/android/guava-tests/test/com/google/common/primitives/UnsignedLongTest.java
index dd2a8ab..cfa2862 100644
--- a/android/guava-tests/test/com/google/common/primitives/UnsignedLongTest.java
+++ b/android/guava-tests/test/com/google/common/primitives/UnsignedLongTest.java
@@ -36,13 +36,23 @@
   static {
     ImmutableSet.Builder<Long> testLongsBuilder = ImmutableSet.builder();
     ImmutableSet.Builder<BigInteger> testBigIntegersBuilder = ImmutableSet.builder();
+
+    // The values here look like 111...11101...010 in binary, where the initial 111...1110 takes
+    // up exactly as many bits as can be represented in the significand (24 for float, 53 for
+    // double). That final 0 should be rounded up to 1 because the remaining bits make that number
+    // slightly nearer.
+    long floatConversionTest = 0xfffffe8000000002L;
+    long doubleConversionTest = 0xfffffffffffff402L;
+
     for (long i = -3; i <= 3; i++) {
       testLongsBuilder
           .add(i)
           .add(Long.MAX_VALUE + i)
           .add(Long.MIN_VALUE + i)
           .add(Integer.MIN_VALUE + i)
-          .add(Integer.MAX_VALUE + i);
+          .add(Integer.MAX_VALUE + i)
+          .add(floatConversionTest + i)
+          .add(doubleConversionTest + i);
       BigInteger bigI = BigInteger.valueOf(i);
       testBigIntegersBuilder
           .add(bigI)
@@ -130,17 +140,26 @@
     }
   }
 
+  @AndroidIncompatible // b/28251030, re-enable when the fix is everywhere we run this test
   public void testFloatValue() {
     for (long value : TEST_LONGS) {
       UnsignedLong unsignedValue = UnsignedLong.fromLongBits(value);
-      assertEquals(unsignedValue.bigIntegerValue().floatValue(), unsignedValue.floatValue());
+      assertEquals(
+          "Float value of " + unsignedValue,
+          unsignedValue.bigIntegerValue().floatValue(),
+          unsignedValue.floatValue(),
+          0.0f);
     }
   }
 
   public void testDoubleValue() {
     for (long value : TEST_LONGS) {
       UnsignedLong unsignedValue = UnsignedLong.fromLongBits(value);
-      assertEquals(unsignedValue.bigIntegerValue().doubleValue(), unsignedValue.doubleValue());
+      assertEquals(
+          "Double value of " + unsignedValue,
+          unsignedValue.bigIntegerValue().doubleValue(),
+          unsignedValue.doubleValue(),
+          0.0);
     }
   }
 
diff --git a/android/guava-tests/test/com/google/common/reflect/ClassPathTest.java b/android/guava-tests/test/com/google/common/reflect/ClassPathTest.java
index 8bccae7..d199d1f 100644
--- a/android/guava-tests/test/com/google/common/reflect/ClassPathTest.java
+++ b/android/guava-tests/test/com/google/common/reflect/ClassPathTest.java
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package com.google.common.reflect;
 
 import static com.google.common.base.Charsets.US_ASCII;
@@ -23,6 +22,7 @@
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.io.Closer;
 import com.google.common.io.Files;
 import com.google.common.io.Resources;
@@ -42,10 +42,7 @@
 import java.net.URLClassLoader;
 import java.security.Permission;
 import java.security.PermissionCollection;
-import java.util.HashSet;
-import java.util.Set;
 import java.util.jar.Attributes;
-import java.util.jar.JarFile;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;
 import java.util.logging.Logger;
@@ -71,7 +68,7 @@
 
   @AndroidIncompatible // Android forbids null parent ClassLoader
   public void testClassPathEntries_emptyURLClassLoader_noParent() {
-    assertThat(ClassPath.Scanner.getClassPathEntries(new URLClassLoader(new URL[0], null)).keySet())
+    assertThat(ClassPath.getClassPathEntries(new URLClassLoader(new URL[0], null)).keySet())
         .isEmpty();
   }
 
@@ -80,7 +77,7 @@
     URL url1 = new URL("file:/a");
     URL url2 = new URL("file:/b");
     URLClassLoader classloader = new URLClassLoader(new URL[] {url1, url2}, null);
-    assertThat(ClassPath.Scanner.getClassPathEntries(classloader))
+    assertThat(ClassPath.getClassPathEntries(classloader))
         .containsExactly(new File("/a"), classloader, new File("/b"), classloader);
   }
 
@@ -90,7 +87,7 @@
     URL url2 = new URL("file:/b");
     URLClassLoader parent = new URLClassLoader(new URL[] {url1}, null);
     URLClassLoader child = new URLClassLoader(new URL[] {url2}, parent) {};
-    assertThat(ClassPath.Scanner.getClassPathEntries(child))
+    assertThat(ClassPath.getClassPathEntries(child))
         .containsExactly(new File("/a"), parent, new File("/b"), child)
         .inOrder();
   }
@@ -100,20 +97,19 @@
     URL url = new URL("file:/a");
     URLClassLoader parent = new URLClassLoader(new URL[] {url}, null);
     URLClassLoader child = new URLClassLoader(new URL[] {url}, parent) {};
-    assertThat(ClassPath.Scanner.getClassPathEntries(child))
-        .containsExactly(new File("/a"), parent);
+    assertThat(ClassPath.getClassPathEntries(child)).containsExactly(new File("/a"), parent);
   }
 
   @AndroidIncompatible // Android forbids null parent ClassLoader
   public void testClassPathEntries_notURLClassLoader_noParent() {
-    assertThat(ClassPath.Scanner.getClassPathEntries(new ClassLoader(null) {})).isEmpty();
+    assertThat(ClassPath.getClassPathEntries(new ClassLoader(null) {})).isEmpty();
   }
 
   @AndroidIncompatible // Android forbids null parent ClassLoader
   public void testClassPathEntries_notURLClassLoader_withParent() throws Exception {
     URL url = new URL("file:/a");
     URLClassLoader parent = new URLClassLoader(new URL[] {url}, null);
-    assertThat(ClassPath.Scanner.getClassPathEntries(new ClassLoader(parent) {}))
+    assertThat(ClassPath.getClassPathEntries(new ClassLoader(parent) {}))
         .containsExactly(new File("/a"), parent);
   }
 
@@ -123,7 +119,7 @@
     URL url2 = new URL("file:/b");
     URLClassLoader grandParent = new URLClassLoader(new URL[] {url1}, null);
     URLClassLoader parent = new URLClassLoader(new URL[] {url2}, grandParent);
-    assertThat(ClassPath.Scanner.getClassPathEntries(new ClassLoader(parent) {}))
+    assertThat(ClassPath.getClassPathEntries(new ClassLoader(parent) {}))
         .containsExactly(new File("/a"), grandParent, new File("/b"), parent);
   }
 
@@ -132,7 +128,7 @@
     URL url = new URL("file:/a");
     URLClassLoader grandParent = new URLClassLoader(new URL[] {url}, null);
     ClassLoader parent = new ClassLoader(grandParent) {};
-    assertThat(ClassPath.Scanner.getClassPathEntries(new ClassLoader(parent) {}))
+    assertThat(ClassPath.getClassPathEntries(new ClassLoader(parent) {}))
         .containsExactly(new File("/a"), grandParent);
   }
 
@@ -141,7 +137,7 @@
   public void testClassPathEntries_URLClassLoader_pathWithSpace() throws Exception {
     URL url = new URL("file:///c:/Documents and Settings/");
     URLClassLoader classloader = new URLClassLoader(new URL[] {url}, null);
-    assertThat(ClassPath.Scanner.getClassPathEntries(classloader))
+    assertThat(ClassPath.getClassPathEntries(classloader))
         .containsExactly(new File("/c:/Documents and Settings/"), classloader);
   }
 
@@ -150,7 +146,7 @@
   public void testClassPathEntries_URLClassLoader_pathWithEscapedSpace() throws Exception {
     URL url = new URL("file:///c:/Documents%20and%20Settings/");
     URLClassLoader classloader = new URLClassLoader(new URL[] {url}, null);
-    assertThat(ClassPath.Scanner.getClassPathEntries(classloader))
+    assertThat(ClassPath.getClassPathEntries(classloader))
         .containsExactly(new File("/c:/Documents and Settings/"), classloader);
   }
 
@@ -173,6 +169,7 @@
         .isEqualTo(new File("/C:\\\u20320 \u22909"));
   }
 
+
   @AndroidIncompatible // Android forbids null parent ClassLoader
   // https://github.com/google/guava/issues/2152
   public void testJarFileWithSpaces() throws Exception {
@@ -181,84 +178,83 @@
     assertThat(ClassPath.from(classloader).getTopLevelClasses()).isNotEmpty();
   }
 
+
   public void testScan_classPathCycle() throws IOException {
     File jarFile = File.createTempFile("with_circular_class_path", ".jar");
     try {
       writeSelfReferencingJarFile(jarFile, "test.txt");
-      ClassPath.DefaultScanner scanner = new ClassPath.DefaultScanner();
-      scanner.scan(jarFile, ClassPathTest.class.getClassLoader());
-      assertThat(scanner.getResources()).hasSize(1);
+      assertThat(
+              new ClassPath.LocationInfo(jarFile, ClassPathTest.class.getClassLoader())
+                  .scanResources())
+          .hasSize(1);
     } finally {
       jarFile.delete();
     }
   }
 
+
   public void testScanFromFile_fileNotExists() throws IOException {
     ClassLoader classLoader = ClassPathTest.class.getClassLoader();
-    ClassPath.DefaultScanner scanner = new ClassPath.DefaultScanner();
-    scanner.scan(new File("no/such/file/anywhere"), classLoader);
-    assertThat(scanner.getResources()).isEmpty();
+    assertThat(
+            new ClassPath.LocationInfo(new File("no/such/file/anywhere"), classLoader)
+                .scanResources())
+        .isEmpty();
   }
 
+
   public void testScanFromFile_notJarFile() throws IOException {
     ClassLoader classLoader = ClassPathTest.class.getClassLoader();
     File notJar = File.createTempFile("not_a_jar", "txt");
-    ClassPath.DefaultScanner scanner = new ClassPath.DefaultScanner();
     try {
-      scanner.scan(notJar, classLoader);
+      assertThat(new ClassPath.LocationInfo(notJar, classLoader).scanResources()).isEmpty();
     } finally {
       notJar.delete();
     }
-    assertThat(scanner.getResources()).isEmpty();
   }
 
   public void testGetClassPathEntry() throws MalformedURLException, URISyntaxException {
     assertEquals(
         new File("/usr/test/dep.jar").toURI(),
-        ClassPath.Scanner.getClassPathEntry(
-                new File("/home/build/outer.jar"), "file:/usr/test/dep.jar")
+        ClassPath.getClassPathEntry(new File("/home/build/outer.jar"), "file:/usr/test/dep.jar")
             .toURI());
     assertEquals(
         new File("/home/build/a.jar").toURI(),
-        ClassPath.Scanner.getClassPathEntry(new File("/home/build/outer.jar"), "a.jar").toURI());
+        ClassPath.getClassPathEntry(new File("/home/build/outer.jar"), "a.jar").toURI());
     assertEquals(
         new File("/home/build/x/y/z").toURI(),
-        ClassPath.Scanner.getClassPathEntry(new File("/home/build/outer.jar"), "x/y/z").toURI());
+        ClassPath.getClassPathEntry(new File("/home/build/outer.jar"), "x/y/z").toURI());
     assertEquals(
         new File("/home/build/x/y/z.jar").toURI(),
-        ClassPath.Scanner.getClassPathEntry(new File("/home/build/outer.jar"), "x/y/z.jar")
-            .toURI());
+        ClassPath.getClassPathEntry(new File("/home/build/outer.jar"), "x/y/z.jar").toURI());
     assertEquals(
         "/home/build/x y.jar",
-        ClassPath.Scanner.getClassPathEntry(new File("/home/build/outer.jar"), "x y.jar")
-            .getFile());
+        ClassPath.getClassPathEntry(new File("/home/build/outer.jar"), "x y.jar").getFile());
   }
 
   public void testGetClassPathFromManifest_nullManifest() {
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(new File("some.jar"), null)).isEmpty();
+    assertThat(ClassPath.getClassPathFromManifest(new File("some.jar"), null)).isEmpty();
   }
 
   public void testGetClassPathFromManifest_noClassPath() throws IOException {
     File jarFile = new File("base.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest(""))).isEmpty();
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest(""))).isEmpty();
   }
 
   public void testGetClassPathFromManifest_emptyClassPath() throws IOException {
     File jarFile = new File("base.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifestClasspath("")))
-        .isEmpty();
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifestClasspath(""))).isEmpty();
   }
 
   public void testGetClassPathFromManifest_badClassPath() throws IOException {
     File jarFile = new File("base.jar");
     Manifest manifest = manifestClasspath("nosuchscheme:an_invalid^path");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest)).isEmpty();
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest)).isEmpty();
   }
 
   public void testGetClassPathFromManifest_pathWithStrangeCharacter() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath("file:the^file.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/the^file.jar"));
   }
 
@@ -266,7 +262,7 @@
     File jarFile = new File("base/some.jar");
     // with/relative/directory is the Class-Path value in the mf file.
     Manifest manifest = manifestClasspath("with/relative/dir");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/with/relative/dir"));
   }
 
@@ -274,7 +270,7 @@
     File jarFile = new File("base/some.jar");
     // with/relative/directory is the Class-Path value in the mf file.
     Manifest manifest = manifestClasspath("with/relative.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/with/relative.jar"));
   }
 
@@ -282,28 +278,28 @@
     File jarFile = new File("base/some.jar");
     // with/relative/directory is the Class-Path value in the mf file.
     Manifest manifest = manifestClasspath("current.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/current.jar"));
   }
 
   public void testGetClassPathFromManifest_absoluteDirectory() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath("file:/with/absolute/dir");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("/with/absolute/dir"));
   }
 
   public void testGetClassPathFromManifest_absoluteJar() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath("file:/with/absolute.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("/with/absolute.jar"));
   }
 
   public void testGetClassPathFromManifest_multiplePaths() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath("file:/with/absolute.jar relative.jar  relative/dir");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(
             fullpath("/with/absolute.jar"),
             fullpath("base/relative.jar"),
@@ -314,14 +310,14 @@
   public void testGetClassPathFromManifest_leadingBlanks() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath(" relative.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/relative.jar"));
   }
 
   public void testGetClassPathFromManifest_trailingBlanks() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath("relative.jar ");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/relative.jar"));
   }
 
@@ -355,6 +351,7 @@
 
   // Test that ResourceInfo.urls() returns identical content to ClassLoader.getResources()
 
+
   public void testGetClassPathUrls() throws Exception {
     String oldPathSeparator = PATH_SEPARATOR.value();
     String oldClassPath = JAVA_CLASS_PATH.value();
@@ -368,7 +365,7 @@
                 "relative/path/to/class/root",
                 "/absolute/path/to/class/root"));
     try {
-      ImmutableList<URL> urls = ClassPath.Scanner.parseJavaClassPath();
+      ImmutableList<URL> urls = ClassPath.parseJavaClassPath();
 
       assertThat(urls.get(0).getProtocol()).isEqualTo("file");
       assertThat(urls.get(0).getAuthority()).isNull();
@@ -395,18 +392,50 @@
 
   private static class Nested {}
 
+
   public void testNulls() throws IOException {
     new NullPointerTester().testAllPublicStaticMethods(ClassPath.class);
     new NullPointerTester()
         .testAllPublicInstanceMethods(ClassPath.from(getClass().getClassLoader()));
   }
 
-  public void testResourceScanner() throws IOException {
-    ResourceScanner scanner = new ResourceScanner();
-    scanner.scan(ClassLoader.getSystemClassLoader());
-    assertThat(scanner.resources).contains("com/google/common/reflect/ClassPathTest.class");
+
+  public void testLocationsFrom_idempotentScan() throws IOException {
+    ImmutableSet<ClassPath.LocationInfo> locations =
+        ClassPath.locationsFrom(getClass().getClassLoader());
+    assertThat(locations).isNotEmpty();
+    for (ClassPath.LocationInfo location : locations) {
+      ImmutableSet<ResourceInfo> resources = location.scanResources();
+      assertThat(location.scanResources()).containsExactlyElementsIn(resources);
+    }
   }
 
+  public void testLocationsFrom_idempotentLocations() {
+    ImmutableSet<ClassPath.LocationInfo> locations =
+        ClassPath.locationsFrom(getClass().getClassLoader());
+    assertThat(ClassPath.locationsFrom(getClass().getClassLoader()))
+        .containsExactlyElementsIn(locations);
+  }
+
+  public void testLocationEquals() {
+    ClassLoader child = getClass().getClassLoader();
+    ClassLoader parent = child.getParent();
+    new EqualsTester()
+        .addEqualityGroup(
+            new ClassPath.LocationInfo(new File("foo.jar"), child),
+            new ClassPath.LocationInfo(new File("foo.jar"), child))
+        .addEqualityGroup(new ClassPath.LocationInfo(new File("foo.jar"), parent))
+        .addEqualityGroup(new ClassPath.LocationInfo(new File("foo"), child))
+        .testEquals();
+  }
+
+
+  public void testScanAllResources() throws IOException {
+    assertThat(scanResourceNames(ClassLoader.getSystemClassLoader()))
+        .contains("com/google/common/reflect/ClassPathTest.class");
+  }
+
+
   public void testExistsThrowsSecurityException() throws IOException, URISyntaxException {
     SecurityManager oldSecurityManager = System.getSecurityManager();
     try {
@@ -421,7 +450,7 @@
     // In Java 9, Logger may read the TZ database. Only disallow reading the class path URLs.
     final PermissionCollection readClassPathFiles =
         new FilePermission("", "read").newPermissionCollection();
-    for (URL url : ClassPath.Scanner.parseJavaClassPath()) {
+    for (URL url : ClassPath.parseJavaClassPath()) {
       if (url.getProtocol().equalsIgnoreCase("file")) {
         file = new File(url.toURI());
         readClassPathFiles.add(new FilePermission(file.getAbsolutePath(), "read"));
@@ -513,46 +542,30 @@
     return new File(new File(path).toURI());
   }
 
-  private static class ResourceScanner extends ClassPath.Scanner {
-    final Set<String> resources = new HashSet<>();
-
-    @Override
-    protected void scanResource(ResourceInfo resource) throws IOException {
-      resources.add(resource.getResourceName());
-    }
-  }
-
   private static URL makeJarUrlWithName(String name) throws IOException {
     File fullPath = new File(Files.createTempDir(), name);
-    File jarFile = JarFileFinder.pickAnyJarFile();
+    File jarFile = pickAnyJarFile();
     Files.copy(jarFile, fullPath);
     return fullPath.toURI().toURL();
   }
 
-  private static final class JarFileFinder extends ClassPath.Scanner {
-
-    private File found;
-
-    static File pickAnyJarFile() throws IOException {
-      JarFileFinder finder = new JarFileFinder();
-      try {
-        finder.scan(JarFileFinder.class.getClassLoader());
-        throw new IllegalStateException("No jar file found!");
-      } catch (StopScanningException expected) {
-        return finder.found;
+  private static File pickAnyJarFile() throws IOException {
+    for (ClassPath.LocationInfo location :
+        ClassPath.locationsFrom(ClassPathTest.class.getClassLoader())) {
+      if (!location.file().isDirectory() && location.file().exists()) {
+        return location.file();
       }
     }
+    throw new AssertionError("Failed to find a jar file");
+  }
 
-    @Override
-    void scanJarFile(ClassLoader classloader, JarFile file) throws IOException {
-      this.found = new File(file.getName());
-      throw new StopScanningException();
+  private static ImmutableSet<String> scanResourceNames(ClassLoader loader) throws IOException {
+    ImmutableSet.Builder<String> builder = ImmutableSet.builder();
+    for (ClassPath.LocationInfo location : ClassPath.locationsFrom(loader)) {
+      for (ResourceInfo resource : location.scanResources()) {
+        builder.add(resource.getResourceName());
+      }
     }
-
-    @Override
-    protected void scanResource(ResourceInfo resource) {}
-
-    // Special exception just to terminate the scanning when we get any jar file to use.
-    private static final class StopScanningException extends RuntimeException {}
+    return builder.build();
   }
 }
diff --git a/android/guava-tests/test/com/google/common/reflect/ElementTest.java b/android/guava-tests/test/com/google/common/reflect/ElementTest.java
deleted file mode 100644
index abe63ba..0000000
--- a/android/guava-tests/test/com/google/common/reflect/ElementTest.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright (C) 2012 The Guava Authors
- *
- * 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 com.google.common.reflect;
-
-import com.google.common.testing.EqualsTester;
-import com.google.common.testing.NullPointerTester;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.Constructor;
-import junit.framework.TestCase;
-
-/**
- * Unit tests of {@link Element}.
- *
- * @author Ben Yu
- */
-public class ElementTest extends TestCase {
-
-  public void testPrivateField() throws Exception {
-    Element element = A.field("privateField");
-    assertTrue(element.isPrivate());
-    assertFalse(element.isAbstract());
-    assertFalse(element.isPackagePrivate());
-    assertFalse(element.isProtected());
-    assertFalse(element.isPublic());
-    assertFalse(element.isFinal());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testPackagePrivateField() throws Exception {
-    Element element = A.field("packagePrivateField");
-    assertFalse(element.isPrivate());
-    assertTrue(element.isPackagePrivate());
-    assertFalse(element.isProtected());
-    assertFalse(element.isPublic());
-    assertFalse(element.isFinal());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testProtectedField() throws Exception {
-    Element element = A.field("protectedField");
-    assertFalse(element.isPrivate());
-    assertFalse(element.isPackagePrivate());
-    assertTrue(element.isProtected());
-    assertFalse(element.isPublic());
-    assertFalse(element.isFinal());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testPublicField() throws Exception {
-    Element element = A.field("publicField");
-    assertFalse(element.isPrivate());
-    assertFalse(element.isPackagePrivate());
-    assertFalse(element.isProtected());
-    assertTrue(element.isPublic());
-    assertFalse(element.isFinal());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testFinalField() throws Exception {
-    Element element = A.field("finalField");
-    assertTrue(element.isFinal());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testStaticField() throws Exception {
-    Element element = A.field("staticField");
-    assertTrue(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testVolatileField() throws Exception {
-    Element element = A.field("volatileField");
-    assertTrue(element.isVolatile());
-  }
-
-  public void testTransientField() throws Exception {
-    Element element = A.field("transientField");
-    assertTrue(element.isTransient());
-  }
-
-  public void testConstructor() throws Exception {
-    Element element = A.constructor();
-    assertTrue(element.isPublic());
-    assertFalse(element.isPackagePrivate());
-    assertFalse(element.isAbstract());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testAbstractMethod() throws Exception {
-    Element element = A.method("abstractMethod");
-    assertTrue(element.isPackagePrivate());
-    assertTrue(element.isAbstract());
-    assertFalse(element.isFinal());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testOverridableMethod() throws Exception {
-    Element element = A.method("overridableMethod");
-    assertTrue(element.isPackagePrivate());
-    assertFalse(element.isAbstract());
-    assertFalse(element.isFinal());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testPrivateMethod() throws Exception {
-    Element element = A.method("privateMethod");
-    assertFalse(element.isAbstract());
-    assertTrue(element.isPrivate());
-    assertFalse(element.isPackagePrivate());
-    assertFalse(element.isPublic());
-    assertFalse(element.isProtected());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testProtectedMethod() throws Exception {
-    Element element = A.method("protectedMethod");
-    assertFalse(element.isAbstract());
-    assertFalse(element.isPrivate());
-    assertFalse(element.isPackagePrivate());
-    assertFalse(element.isFinal());
-    assertFalse(element.isPublic());
-    assertTrue(element.isProtected());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testFinalMethod() throws Exception {
-    Element element = A.method("publicFinalMethod");
-    assertFalse(element.isAbstract());
-    assertFalse(element.isPrivate());
-    assertTrue(element.isFinal());
-    assertTrue(element.isPublic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testNativeMethod() throws Exception {
-    Element element = A.method("nativeMethod");
-    assertTrue(element.isNative());
-    assertTrue(element.isPackagePrivate());
-  }
-
-  public void testSynchronizedMethod() throws Exception {
-    Element element = A.method("synchronizedMethod");
-    assertTrue(element.isSynchronized());
-  }
-
-  public void testUnannotatedMethod() throws Exception {
-    Element element = A.method("notAnnotatedMethod");
-    assertFalse(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testEquals() throws Exception {
-    new EqualsTester()
-        .addEqualityGroup(A.field("privateField"), A.field("privateField"))
-        .addEqualityGroup(A.field("publicField"))
-        .addEqualityGroup(A.constructor(), A.constructor())
-        .addEqualityGroup(A.method("privateMethod"), A.method("privateMethod"))
-        .addEqualityGroup(A.method("publicFinalMethod"))
-        .testEquals();
-  }
-
-  public void testNulls() {
-    new NullPointerTester().testAllPublicStaticMethods(Element.class);
-  }
-
-  @Retention(RetentionPolicy.RUNTIME)
-  private @interface Tested {}
-
-  private abstract static class A {
-    @Tested private boolean privateField;
-    @Tested int packagePrivateField;
-    @Tested protected int protectedField;
-    @Tested public String publicField;
-    @Tested private static Iterable<String> staticField;
-    @Tested private final Object finalField;
-    private volatile char volatileField;
-    private transient long transientField;
-
-    @Tested
-    public A(Object finalField) {
-      this.finalField = finalField;
-    }
-
-    @Tested
-    abstract void abstractMethod();
-
-    @Tested
-    void overridableMethod() {}
-
-    @Tested
-    protected void protectedMethod() {}
-
-    @Tested
-    private void privateMethod() {}
-
-    @Tested
-    public final void publicFinalMethod() {}
-
-    void notAnnotatedMethod() {}
-
-    static Element field(String name) throws Exception {
-      Element element = new Element(A.class.getDeclaredField(name));
-      assertEquals(name, element.getName());
-      assertEquals(A.class, element.getDeclaringClass());
-      return element;
-    }
-
-    static Element constructor() throws Exception {
-      Constructor<?> constructor = A.class.getDeclaredConstructor(Object.class);
-      Element element = new Element(constructor);
-      assertEquals(constructor.getName(), element.getName());
-      assertEquals(A.class, element.getDeclaringClass());
-      return element;
-    }
-
-    static Element method(String name, Class<?>... parameterTypes) throws Exception {
-      Element element = new Element(A.class.getDeclaredMethod(name, parameterTypes));
-      assertEquals(name, element.getName());
-      assertEquals(A.class, element.getDeclaringClass());
-      return element;
-    }
-
-    native void nativeMethod();
-
-    synchronized void synchronizedMethod() {}
-  }
-}
diff --git a/android/guava-tests/test/com/google/common/reflect/InvokableTest.java b/android/guava-tests/test/com/google/common/reflect/InvokableTest.java
index 816aed3..f116ee2 100644
--- a/android/guava-tests/test/com/google/common/reflect/InvokableTest.java
+++ b/android/guava-tests/test/com/google/common/reflect/InvokableTest.java
@@ -19,13 +19,16 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.testing.EqualsTester;
 import com.google.common.testing.NullPointerTester;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.TypeVariable;
 import java.util.Collections;
@@ -39,6 +42,180 @@
  */
 @AndroidIncompatible // lots of failures, possibly some related to bad equals() implementations?
 public class InvokableTest extends TestCase {
+  // Historically Invokable inherited from java.lang.reflect.AccessibleObject. That's no longer the
+  // case, but we do check that its API still has the same public methods. We exclude some methods
+  // that were added in Java 9 and that people probably weren't calling via Invokable, namely
+  // `boolean canAccess(Object)`.
+  public void testApiCompatibleWithAccessibleObject() {
+    ImmutableSet<String> invokableMethods =
+        publicMethodSignatures(Invokable.class, ImmutableSet.<String>of());
+    ImmutableSet<String> accesibleObjectMethods =
+        publicMethodSignatures(AccessibleObject.class, ImmutableSet.of("canAccess"));
+    assertThat(invokableMethods).containsAtLeastElementsIn(accesibleObjectMethods);
+    Class<?> genericDeclaration;
+    try {
+      genericDeclaration = Class.forName("java.lang.reflect.GenericDeclaration");
+      ImmutableSet<String> genericDeclarationMethods =
+          publicMethodSignatures(genericDeclaration, ImmutableSet.<String>of());
+      assertThat(invokableMethods).containsAtLeastElementsIn(genericDeclarationMethods);
+    } catch (ClassNotFoundException e) {
+      // OK: we're on Java 7, which doesn't have this class
+    }
+  }
+
+  private static ImmutableSet<String> publicMethodSignatures(
+      Class<?> c, ImmutableSet<String> ignore) {
+    ImmutableSet.Builder<String> methods = ImmutableSet.builder();
+    for (Method method : c.getMethods()) {
+      if (Modifier.isStatic(method.getModifiers()) || ignore.contains(method.getName())) {
+        continue;
+      }
+      StringBuilder signature =
+          new StringBuilder()
+              .append(typeName(method.getReturnType()))
+              .append(" ")
+              .append(method.getName())
+              .append("(");
+      String sep = "";
+      for (Class<?> param : method.getParameterTypes()) {
+        signature.append(sep).append(typeName(param));
+        sep = ", ";
+      }
+      methods.add(signature.append(")").toString());
+    }
+    return methods.build();
+  }
+
+  private static String typeName(Class<?> type) {
+    return type.isArray() ? typeName(type.getComponentType()) + "[]" : type.getName();
+  }
+
+  public void testConstructor() throws Exception {
+    Invokable<A, A> invokable = A.constructor();
+    assertTrue(invokable.isPublic());
+    assertFalse(invokable.isPackagePrivate());
+    assertFalse(invokable.isAbstract());
+    assertFalse(invokable.isStatic());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testAbstractMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("abstractMethod");
+    assertTrue(invokable.isPackagePrivate());
+    assertTrue(invokable.isAbstract());
+    assertFalse(invokable.isFinal());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testOverridableMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("overridableMethod");
+    assertTrue(invokable.isPackagePrivate());
+    assertFalse(invokable.isAbstract());
+    assertFalse(invokable.isFinal());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testPrivateMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("privateMethod");
+    assertFalse(invokable.isAbstract());
+    assertTrue(invokable.isPrivate());
+    assertFalse(invokable.isPackagePrivate());
+    assertFalse(invokable.isPublic());
+    assertFalse(invokable.isProtected());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testProtectedMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("protectedMethod");
+    assertFalse(invokable.isAbstract());
+    assertFalse(invokable.isPrivate());
+    assertFalse(invokable.isPackagePrivate());
+    assertFalse(invokable.isFinal());
+    assertFalse(invokable.isPublic());
+    assertTrue(invokable.isProtected());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testFinalMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("publicFinalMethod");
+    assertFalse(invokable.isAbstract());
+    assertFalse(invokable.isPrivate());
+    assertTrue(invokable.isFinal());
+    assertTrue(invokable.isPublic());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testNativeMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("nativeMethod");
+    assertTrue(invokable.isNative());
+    assertTrue(invokable.isPackagePrivate());
+  }
+
+  public void testSynchronizedMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("synchronizedMethod");
+    assertTrue(invokable.isSynchronized());
+  }
+
+  public void testUnannotatedMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("notAnnotatedMethod");
+    assertFalse(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  private @interface Tested {}
+
+  private abstract static class A {
+    @Tested private boolean privateField;
+    @Tested int packagePrivateField;
+    @Tested protected int protectedField;
+    @Tested public String publicField;
+    @Tested private static Iterable<String> staticField;
+    @Tested private final Object finalField;
+    private volatile char volatileField;
+    private transient long transientField;
+
+    @Tested
+    public A(Object finalField) {
+      this.finalField = finalField;
+    }
+
+    @Tested
+    abstract void abstractMethod();
+
+    @Tested
+    void overridableMethod() {}
+
+    @Tested
+    protected void protectedMethod() {}
+
+    @Tested
+    private void privateMethod() {}
+
+    @Tested
+    public final void publicFinalMethod() {}
+
+    void notAnnotatedMethod() {}
+
+    static Invokable<A, A> constructor() throws Exception {
+      Constructor<A> constructor = A.class.getDeclaredConstructor(Object.class);
+      Invokable<A, A> invokable = Invokable.from(constructor);
+      assertEquals(constructor.getName(), invokable.getName());
+      assertEquals(A.class, invokable.getDeclaringClass());
+      return invokable;
+    }
+
+    static Invokable<?, Object> method(String name, Class<?>... parameterTypes) throws Exception {
+      Invokable<?, Object> invokable =
+          Invokable.from(A.class.getDeclaredMethod(name, parameterTypes));
+      assertEquals(name, invokable.getName());
+      assertEquals(A.class, invokable.getDeclaringClass());
+      return invokable;
+    }
+
+    native void nativeMethod();
+
+    synchronized void synchronizedMethod() {}
+  }
 
   public void testConstructor_returnType() throws Exception {
     assertEquals(Prepender.class, Prepender.constructor().getReturnType().getType());
@@ -74,7 +251,7 @@
   public void testConstructor_typeParameters() throws Exception {
     TypeVariable<?>[] variables = Prepender.constructor().getTypeParameters();
     assertThat(variables).hasLength(1);
-    assertEquals("A", variables[0].getName());
+    assertEquals("T", variables[0].getName());
   }
 
   public void testConstructor_parameters() throws Exception {
@@ -530,6 +707,9 @@
 
   public void testEquals() throws Exception {
     new EqualsTester()
+        .addEqualityGroup(A.constructor(), A.constructor())
+        .addEqualityGroup(A.method("privateMethod"), A.method("privateMethod"))
+        .addEqualityGroup(A.method("publicFinalMethod"))
         .addEqualityGroup(Prepender.constructor(), Prepender.constructor())
         .addEqualityGroup(Prepender.constructor(String.class, int.class))
         .addEqualityGroup(Prepender.method("privateMethod"), Prepender.method("privateMethod"))
@@ -562,7 +742,7 @@
     }
 
     // just for testing
-    private <A> Prepender() {
+    private <T> Prepender() {
       this(null, 0);
     }
 
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
index 9b3f0f8..557fc0b 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
@@ -68,6 +68,7 @@
         thrownByExecutionThread);
   }
 
+
   public void testServiceStartStop() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
     assertFalse(service.startUpCalled);
@@ -84,6 +85,7 @@
     executionThread.join();
   }
 
+
   public void testServiceStopIdempotence() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
 
@@ -100,6 +102,7 @@
     executionThread.join();
   }
 
+
   public void testServiceExitingOnItsOwn() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
     service.expectedShutdownState = Service.State.RUNNING;
@@ -170,6 +173,7 @@
     }
   }
 
+
   public void testServiceThrowOnStartUp() throws Exception {
     ThrowOnStartUpService service = new ThrowOnStartUpService();
     assertFalse(service.startUpCalled);
@@ -208,6 +212,7 @@
     }
   }
 
+
   public void testServiceThrowOnRun() throws Exception {
     ThrowOnRunService service = new ThrowOnRunService();
 
@@ -224,6 +229,7 @@
     assertEquals(Service.State.FAILED, service.state());
   }
 
+
   public void testServiceThrowOnRunAndThenAgainOnShutDown() throws Exception {
     ThrowOnRunService service = new ThrowOnRunService();
     service.throwOnShutDown = true;
@@ -265,6 +271,7 @@
     }
   }
 
+
   public void testServiceThrowOnShutDown() throws Exception {
     ThrowOnShutDown service = new ThrowOnShutDown();
 
@@ -324,6 +331,7 @@
     protected void run() throws Exception {}
   }
 
+
   public void testStopWhileStarting_runNotCalled() throws Exception {
     final CountDownLatch started = new CountDownLatch(1);
     FakeService service =
@@ -353,6 +361,7 @@
     assertEquals(0, service.shutdownCalled);
   }
 
+
   public void testDefaultService() throws InterruptedException {
     WaitOnRunService service = new WaitOnRunService();
     service.startAsync().awaitRunning();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureFallbackAtomicHelperTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureFallbackAtomicHelperTest.java
index 77d04ff..208cf24 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureFallbackAtomicHelperTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureFallbackAtomicHelperTest.java
@@ -107,7 +107,7 @@
 
   private void runTestMethod(ClassLoader classLoader) throws Exception {
     Class<?> test = classLoader.loadClass(AbstractFutureTest.class.getName());
-    test.getMethod(getName()).invoke(test.newInstance());
+    test.getMethod(getName()).invoke(test.getDeclaredConstructor().newInstance());
   }
 
   private void checkHelperVersion(ClassLoader classLoader, String expectedHelperClassName)
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
index 3c210ce..e55a31e 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
@@ -579,7 +579,7 @@
       final AbstractFuture<String> future = new AbstractFuture<String>() {};
       currentFuture.set(future);
       for (Callable<?> task : allTasks) {
-        @SuppressWarnings("unused") // go/futurereturn-lsc
+        @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
         Future<?> possiblyIgnoredError = executor.submit(task);
       }
       awaitUnchecked(barrier);
@@ -798,7 +798,7 @@
       final AbstractFuture<String> future = new AbstractFuture<String>() {};
       currentFuture.set(future);
       for (Callable<?> task : allTasks) {
-        @SuppressWarnings("unused") // go/futurereturn-lsc
+        @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
         Future<?> possiblyIgnoredError = executor.submit(task);
       }
       awaitUnchecked(barrier);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
index 16a4cd0..a2411ad 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
@@ -21,6 +21,7 @@
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
+import com.google.common.util.concurrent.AbstractScheduledService.Cancellable;
 import com.google.common.util.concurrent.AbstractScheduledService.Scheduler;
 import com.google.common.util.concurrent.Service.State;
 import com.google.common.util.concurrent.testing.TestingExecutors;
@@ -28,6 +29,7 @@
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.Delayed;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
@@ -388,7 +390,7 @@
 
     public void testFixedRateSchedule() {
       Scheduler schedule = Scheduler.newFixedRateSchedule(initialDelay, delay, unit);
-      Future<?> unused =
+      Cancellable unused =
           schedule.schedule(
               null,
               new ScheduledThreadPoolExecutor(1) {
@@ -396,7 +398,7 @@
                 public ScheduledFuture<?> scheduleAtFixedRate(
                     Runnable command, long initialDelay, long period, TimeUnit unit) {
                   assertSingleCallWithCorrectParameters(command, initialDelay, delay, unit);
-                  return null;
+                  return new ThrowingScheduledFuture<>();
                 }
               },
               testRunnable);
@@ -405,7 +407,7 @@
 
     public void testFixedDelaySchedule() {
       Scheduler schedule = newFixedDelaySchedule(initialDelay, delay, unit);
-      Future<?> unused =
+      Cancellable unused =
           schedule.schedule(
               null,
               new ScheduledThreadPoolExecutor(10) {
@@ -413,13 +415,32 @@
                 public ScheduledFuture<?> scheduleWithFixedDelay(
                     Runnable command, long initialDelay, long delay, TimeUnit unit) {
                   assertSingleCallWithCorrectParameters(command, initialDelay, delay, unit);
-                  return null;
+                  return new ThrowingScheduledFuture<>();
                 }
               },
               testRunnable);
       assertTrue(called);
     }
 
+    private static final class ThrowingScheduledFuture<V> extends ForwardingFuture<V>
+        implements ScheduledFuture<V> {
+      @Override
+      protected Future<V> delegate() {
+        throw new UnsupportedOperationException("test should not care about this");
+      }
+
+      @Override
+      public long getDelay(TimeUnit unit) {
+        throw new UnsupportedOperationException("test should not care about this");
+      }
+
+      @Override
+      public int compareTo(Delayed other) {
+        throw new UnsupportedOperationException("test should not care about this");
+      }
+    }
+
+
     public void testFixedDelayScheduleFarFuturePotentiallyOverflowingScheduleIsNeverReached()
         throws Exception {
       TestAbstractScheduledCustomService service =
@@ -440,6 +461,7 @@
       service.awaitTerminated();
     }
 
+
     public void testCustomSchedulerFarFuturePotentiallyOverflowingScheduleIsNeverReached()
         throws Exception {
       TestAbstractScheduledCustomService service =
@@ -475,6 +497,7 @@
       }
     }
 
+
     public void testCustomSchedule_startStop() throws Exception {
       final CyclicBarrier firstBarrier = new CyclicBarrier(2);
       final CyclicBarrier secondBarrier = new CyclicBarrier(2);
@@ -494,7 +517,7 @@
             }
           };
       TestCustomScheduler scheduler = new TestCustomScheduler();
-      Future<?> future = scheduler.schedule(null, Executors.newScheduledThreadPool(10), task);
+      Cancellable future = scheduler.schedule(null, Executors.newScheduledThreadPool(10), task);
       firstBarrier.await();
       assertEquals(1, scheduler.scheduleCounter.get());
       secondBarrier.await();
@@ -505,6 +528,7 @@
       future.cancel(false);
     }
 
+
     public void testCustomSchedulerServiceStop() throws Exception {
       TestAbstractScheduledCustomService service = new TestAbstractScheduledCustomService();
       service.startAsync().awaitRunning();
@@ -518,6 +542,7 @@
       assertEquals(1, service.numIterations.get());
     }
 
+
     public void testCustomScheduler_deadlock() throws InterruptedException, BrokenBarrierException {
       final CyclicBarrier inGetNextSchedule = new CyclicBarrier(2);
       // This will flakily deadlock, so run it multiple times to increase the flake likelihood
@@ -548,6 +573,7 @@
       }
     }
 
+
     public void testBig() throws Exception {
       TestAbstractScheduledCustomService service =
           new TestAbstractScheduledCustomService() {
@@ -607,6 +633,7 @@
       }
     }
 
+
     public void testCustomSchedulerFailure() throws Exception {
       TestFailingCustomScheduledService service = new TestFailingCustomScheduledService();
       service.startAsync().awaitRunning();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
index 5f42106..e3c22a8 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
@@ -330,6 +330,7 @@
     }
   }
 
+
   public void testAwaitTerminated() throws Exception {
     final NoOpService service = new NoOpService();
     Thread waiter =
@@ -347,6 +348,7 @@
     assertFalse(waiter.isAlive());
   }
 
+
   public void testAwaitTerminated_FailedService() throws Exception {
     final ManualSwitchedService service = new ManualSwitchedService();
     final AtomicReference<Throwable> exception = Atomics.newReference();
@@ -374,6 +376,7 @@
     assertThat(exception.get()).hasCauseThat().isEqualTo(EXCEPTION);
   }
 
+
   public void testThreadedServiceStartAndWaitStopAndWait() throws Throwable {
     ThreadedService service = new ThreadedService();
     RecordingListener listener = RecordingListener.record(service);
@@ -391,6 +394,7 @@
         listener.getStateHistory());
   }
 
+
   public void testThreadedServiceStopIdempotence() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -406,6 +410,7 @@
     throwIfSet(thrownByExecutionThread);
   }
 
+
   public void testThreadedServiceStopIdempotenceAfterWait() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -423,6 +428,7 @@
     throwIfSet(thrownByExecutionThread);
   }
 
+
   public void testThreadedServiceStopIdempotenceDoubleWait() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -655,6 +661,7 @@
     }
   }
 
+
   public void testAddListenerAfterFailureDoesntCauseDeadlock() throws InterruptedException {
     final StartFailingService service = new StartFailingService();
     service.startAsync();
@@ -674,6 +681,7 @@
     assertFalse(thread + " is deadlocked", thread.isAlive());
   }
 
+
   public void testListenerDoesntDeadlockOnStartAndWaitFromRunning() throws Exception {
     final NoOpThreadedService service = new NoOpThreadedService();
     service.addListener(
@@ -688,6 +696,7 @@
     service.stopAsync();
   }
 
+
   public void testListenerDoesntDeadlockOnStopAndWaitFromTerminated() throws Exception {
     final NoOpThreadedService service = new NoOpThreadedService();
     service.addListener(
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AggregateFutureStateFallbackAtomicHelperTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AggregateFutureStateFallbackAtomicHelperTest.java
index 761f7d7..fec9394 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AggregateFutureStateFallbackAtomicHelperTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AggregateFutureStateFallbackAtomicHelperTest.java
@@ -95,7 +95,7 @@
 
   private void runTestMethod(ClassLoader classLoader) throws Exception {
     Class<?> test = classLoader.loadClass(FuturesTest.class.getName());
-    Object testInstance = test.newInstance();
+    Object testInstance = test.getDeclaredConstructor().newInstance();
     test.getMethod("setUp").invoke(testInstance);
     test.getMethod(getName()).invoke(testInstance);
     test.getMethod("tearDown").invoke(testInstance);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
index 468ee38..fe68e00 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
@@ -13,6 +13,7 @@
 
 package com.google.common.util.concurrent;
 
+
 /** Unit test for {@link AtomicDouble}. */
 public class AtomicDoubleTest extends JSR166TestCase {
 
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java b/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
index d905dcd..4765825 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
@@ -47,7 +47,7 @@
 
     ExecutorService threadPool = Executors.newFixedThreadPool(nThreads);
     for (int i = 0; i < nTasks; i++) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError =
           threadPool.submit(
               new Runnable() {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
index 66c8d6d..f5f12db 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
@@ -38,6 +38,7 @@
 import com.google.common.reflect.Reflection;
 import com.google.common.truth.FailureStrategy;
 import com.google.common.truth.StandardSubjectBuilder;
+import com.google.common.util.concurrent.ClosingFuture.AsyncClosingCallable;
 import com.google.common.util.concurrent.ClosingFuture.AsyncClosingFunction;
 import com.google.common.util.concurrent.ClosingFuture.ClosingCallable;
 import com.google.common.util.concurrent.ClosingFuture.ClosingFunction;
@@ -267,6 +268,76 @@
     assertClosed(closeable1, closeable2);
   }
 
+  public void testSubmitAsync() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.submitAsync(
+            new AsyncClosingCallable<TestCloseable>() {
+              @Override
+              public ClosingFuture<TestCloseable> call(DeferredCloser closer) {
+                closer.eventuallyClose(closeable1, closingExecutor);
+                return ClosingFuture.submit(
+                    new ClosingCallable<TestCloseable>() {
+                      @Override
+                      public TestCloseable call(DeferredCloser deferredCloser) throws Exception {
+                        return closeable2;
+                      }
+                    },
+                    directExecutor());
+              }
+            },
+            executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+    assertStillOpen(closeable2);
+  }
+
+  public void testSubmitAsync_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.submitAsync(
+            waiter.waitFor(
+                new AsyncClosingCallable<TestCloseable>() {
+                  @Override
+                  public ClosingFuture<TestCloseable> call(DeferredCloser closer) throws Exception {
+                    awaitUninterruptibly(futureCancelled);
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return ClosingFuture.submit(
+                        new ClosingCallable<TestCloseable>() {
+                          @Override
+                          public TestCloseable call(DeferredCloser deferredCloser)
+                              throws Exception {
+                            deferredCloser.eventuallyClose(closeable3, closingExecutor);
+                            return closeable3;
+                          }
+                        },
+                        directExecutor());
+                  }
+                }),
+            executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testSubmitAsync_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.submitAsync(
+            new AsyncClosingCallable<Object>() {
+              @Override
+              public ClosingFuture<Object> call(DeferredCloser closer) throws Exception {
+                closer.eventuallyClose(closeable1, closingExecutor);
+                closer.eventuallyClose(closeable2, closingExecutor);
+                throw exception;
+              }
+            },
+            executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
   public void testStatusFuture() throws Exception {
     ClosingFuture<String> closingFuture =
         ClosingFuture.submit(
@@ -1837,6 +1908,10 @@
       return waitFor(closingCallable, ClosingCallable.class);
     }
 
+    <V> AsyncClosingCallable<V> waitFor(AsyncClosingCallable<V> asyncClosingCallable) {
+      return waitFor(asyncClosingCallable, AsyncClosingCallable.class);
+    }
+
     <T, U> ClosingFunction<T, U> waitFor(ClosingFunction<T, U> closingFunction) {
       return waitFor(closingFunction, ClosingFunction.class);
     }
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java b/android/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
index 5abe6ce..18e69b1 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.util.concurrent;
 
+
 import com.google.common.base.Joiner;
 import com.google.common.util.concurrent.CycleDetectingLockFactory.Policies;
 import com.google.common.util.concurrent.CycleDetectingLockFactory.Policy;
@@ -441,6 +442,7 @@
     lockD.lock();
   }
 
+
   public void testReentrantLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(lockA);
     thread.start();
@@ -452,6 +454,7 @@
     assertTrue(lockA.tryLock());
   }
 
+
   public void testReentrantWriteLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(writeLockA);
     thread.start();
@@ -465,6 +468,7 @@
     assertTrue(readLockA.tryLock());
   }
 
+
   public void testReentrantReadLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(readLockA);
     thread.start();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
index 34678ed..5bd3cf7 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
@@ -36,6 +36,7 @@
 
   private final ExecutionList list = new ExecutionList();
 
+
   public void testRunOnPopulatedList() throws Exception {
     Executor exec = Executors.newCachedThreadPool();
     CountDownLatch countDownLatch = new CountDownLatch(3);
@@ -66,6 +67,7 @@
     assertEquals(1, runCalled.get());
   }
 
+
   public void testExecute_idempotentConcurrently() throws InterruptedException {
     final CountDownLatch okayToRun = new CountDownLatch(1);
     final AtomicInteger runCalled = new AtomicInteger();
@@ -101,6 +103,7 @@
     assertEquals(1, runCalled.get());
   }
 
+
   public void testAddAfterRun() throws Exception {
     // Run the previous test
     testRunOnPopulatedList();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
index 687f226..1c03f5a 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
@@ -88,6 +88,7 @@
     assertThat(thirdCallable.called).isTrue();
   }
 
+
   public void testCancellationMultipleThreads() throws Exception {
     final BlockingCallable blockingCallable = new BlockingCallable();
     ListenableFuture<Void> unused = serializer.submit(blockingCallable, executor);
@@ -115,6 +116,7 @@
     assertThat(getDone(future2)).isFalse();
   }
 
+
   public void testSecondTaskWaitsForFirstEvenIfCancelled() throws Exception {
     final BlockingCallable blockingCallable = new BlockingCallable();
     ListenableFuture<Void> future1 = serializer.submit(blockingCallable, executor);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
index ab53f53..cc4751d 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
@@ -132,6 +132,7 @@
     assertThat(f.get()).isEqualTo(2);
   }
 
+
   @GwtIncompatible // withTimeout
   public void testWithTimeout() throws Exception {
     ScheduledExecutorService executor = newScheduledThreadPool(1);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ForwardingObjectTester.java b/android/guava-tests/test/com/google/common/util/concurrent/ForwardingObjectTester.java
index 021d96d..84b0426 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ForwardingObjectTester.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ForwardingObjectTester.java
@@ -61,7 +61,7 @@
             new Function<Object, T>() {
               @Override
               public T apply(Object delegate) {
-                T mock = mock(forwarderClass, CALLS_REAL_METHODS.get());
+                T mock = mock(forwarderClass, CALLS_REAL_METHODS);
                 try {
                   T stubber = doReturn(delegate).when(mock);
                   DELEGATE_METHOD.invoke(stubber);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java b/android/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
index 2ec1736..3bc69bd 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
@@ -353,6 +353,7 @@
 
   public static final class WillBeUnloadedException extends Exception {}
 
+
   public void testGetChecked_classUnloading() throws Exception {
     WeakReference<?> classUsedByGetChecked = doTestClassUnloading();
     GcFinalization.awaitClear(classUsedByGetChecked);
@@ -380,5 +381,8 @@
    * environment that forces Futures.getChecked to its fallback WeakSetValidator. One awful way of
    * doing so would be to derive a separate test library by using remove_from_jar to strip out
    * ClassValueValidator.
+   *
+   * Fortunately, we get pretty good coverage "by accident": We run all these tests against the
+   * *backport*, where ClassValueValidator is not present.
    */
 }
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java b/android/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
index 797ee48..fa3b14a 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
@@ -3375,11 +3375,13 @@
         : pseudoTimedGetUninterruptibly(future, 2500, MILLISECONDS);
   }
 
+
   @GwtIncompatible // threads
   public void testAllAsList_extensive() throws InterruptedException {
     runExtensiveMergerTest(Merger.allMerger);
   }
 
+
   @GwtIncompatible // threads
   public void testSuccessfulAsList_extensive() throws InterruptedException {
     runExtensiveMergerTest(Merger.successMerger);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java b/android/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
index 2499020..d0fcee2 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
@@ -131,6 +131,7 @@
     }
   }
 
+
   public void testFutureCancellableBeforeFunctionCompletion() throws Exception {
     // Set the result in a separate thread since this test runs the function
     // (which will block) in the same thread.
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java b/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
index f0727da..4d7a45f 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.util.concurrent;
 
+
 /**
  * Tests for {@link Monitor}'s interruptible methods.
  *
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java b/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
index 8f91bcc..afa7eae 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
@@ -17,12 +17,15 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import java.lang.reflect.Method;
 import java.nio.channels.spi.AbstractInterruptibleChannel;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.AbstractOwnableSynchronizer;
 import java.util.concurrent.locks.LockSupport;
 import junit.framework.TestCase;
 
+
 public final class InterruptibleTaskTest extends TestCase {
 
   // Regression test for a deadlock where a task could be stuck busy waiting for the task to
@@ -51,7 +54,10 @@
           }
 
           @Override
-          void afterRanInterruptibly(Void result, Throwable error) {}
+          void afterRanInterruptiblySuccess(Void result) {}
+
+          @Override
+          void afterRanInterruptiblyFailure(Throwable error) {}
         };
     Thread runner = new Thread(task);
     runner.start();
@@ -114,25 +120,38 @@
           }
 
           @Override
-          void afterRanInterruptibly(Void result, Throwable error) {}
+          void afterRanInterruptiblySuccess(Void result) {}
+
+          @Override
+          void afterRanInterruptiblyFailure(Throwable error) {}
         };
     Thread runner = new Thread(task, "runner");
     runner.start();
     isInterruptibleRegistered.await();
     // trigger the interrupt on another thread since it will block
-    new Thread("Interrupter") {
-      @Override
-      public void run() {
-        task.interruptTask();
-      }
-    }.start();
+    Thread interrupter =
+        new Thread("Interrupter") {
+          @Override
+          public void run() {
+            task.interruptTask();
+          }
+        };
+    interrupter.start();
     // this will happen once the interrupt has been set which means that
     // 1. the runner has been woken up
     // 2. the interrupter is stuck in the call the Thread.interrupt()
 
     // after some period of time the runner thread should become blocked on the task because it is
     // waiting for the slow interrupting thread to complete Thread.interrupt
-    awaitBlockedOn(runner, task);
+    awaitBlockedOnInstanceOf(runner, InterruptibleTask.Blocker.class);
+
+    Object blocker = LockSupport.getBlocker(runner);
+    assertThat(blocker).isInstanceOf(AbstractOwnableSynchronizer.class);
+    Method getExclusiveOwnerThread =
+        AbstractOwnableSynchronizer.class.getDeclaredMethod("getExclusiveOwnerThread");
+    getExclusiveOwnerThread.setAccessible(true);
+    Thread owner = (Thread) getExclusiveOwnerThread.invoke(blocker);
+    assertThat(owner).isSameInstanceAs(interrupter);
 
     slowChannel.exitClose.countDown(); // release the interrupter
 
@@ -142,8 +161,9 @@
   }
 
   // waits for the given thread to be blocked on the given object
-  private static void awaitBlockedOn(Thread t, Object blocker) throws InterruptedException {
-    while (!isThreadBlockedOn(t, blocker)) {
+  private static void awaitBlockedOnInstanceOf(Thread t, Class<?> blocker)
+      throws InterruptedException {
+    while (!isThreadBlockedOnInstanceOf(t, blocker)) {
       if (t.getState() == Thread.State.TERMINATED) {
         throw new RuntimeException("Thread " + t + " exited unexpectedly");
       }
@@ -151,8 +171,8 @@
     }
   }
 
-  private static boolean isThreadBlockedOn(Thread t, Object blocker) {
-    return t.getState() == Thread.State.WAITING && LockSupport.getBlocker(t) == blocker;
+  private static boolean isThreadBlockedOnInstanceOf(Thread t, Class<?> blocker) {
+    return t.getState() == Thread.State.WAITING && blocker.isInstance(LockSupport.getBlocker(t));
   }
 
   static final class SlowChannel extends AbstractInterruptibleChannel {
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/JSR166TestCase.java b/android/guava-tests/test/com/google/common/util/concurrent/JSR166TestCase.java
index 0822ae1..2f8e1b7 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/JSR166TestCase.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/JSR166TestCase.java
@@ -675,7 +675,7 @@
 
   /**
    * Returns the number of milliseconds since time given by startNanoTime, which must have been
-   * previously returned from a call to {@link System.nanoTime()}.
+   * previously returned from a call to {@link System#nanoTime()}.
    */
   long millisElapsedSince(long startNanoTime) {
     return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java b/android/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
index 741ff45..3bb819a 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
@@ -100,6 +100,7 @@
     assertTrue(listenableFuture.isDone());
   }
 
+
   public void testListenInPoolThreadUsesGivenExecutor() throws Exception {
     ExecutorService executorService =
         newCachedThreadPool(new ThreadFactoryBuilder().setDaemon(true).build());
@@ -124,6 +125,7 @@
     assertTrue(listenableFuture.isDone());
   }
 
+
   public void testListenInPoolThreadCustomExecutorInterrupted() throws Exception {
     final CountDownLatch submitSuccessful = new CountDownLatch(1);
     ExecutorService executorService =
@@ -233,6 +235,7 @@
     }
   }
 
+
   @SuppressWarnings("IsInstanceIncompatibleType") // intentional.
   public void testListenInPoolThreadRunsListenerAfterRuntimeException() throws Exception {
     RuntimeExceptionThrowingFuture<String> input = new RuntimeExceptionThrowingFuture<>();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
index fd51a73..8969a75 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
@@ -80,6 +80,7 @@
     super.tearDown();
   }
 
+
   public void testListenerDoesNotRunUntilTaskCompletes() throws Exception {
 
     // Test default state of not started.
@@ -105,6 +106,7 @@
     assertFalse(task.isCancelled());
   }
 
+
   public void testListenerCalledOnException() throws Exception {
     throwException = true;
 
@@ -140,6 +142,7 @@
     assertEquals(1, runLatch.getCount());
   }
 
+
   public void testListenerCalledOnCancelFromRunning() throws Exception {
     exec.execute(task);
     runLatch.await();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
index e0eb32e..5fd9b95 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
@@ -129,6 +129,7 @@
         logHandler.getStoredLogRecords().get(0).getMessage());
   }
 
+
   public void testEnqueueAndDispatch_multithreaded() throws InterruptedException {
     Object listener = new Object();
     ExecutorService service = Executors.newFixedThreadPool(4);
@@ -152,6 +153,7 @@
     }
   }
 
+
   public void testEnqueueAndDispatch_multithreaded_withThrowingRunnable()
       throws InterruptedException {
     Object listener = new Object();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java b/android/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
index 08c8f19..fe4e7f5 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
@@ -88,6 +88,7 @@
         public void run() {}
       };
 
+
   public void testDirectExecutorServiceServiceInThreadExecution() throws Exception {
     final ListeningExecutorService executor = newDirectExecutorService();
     final ThreadLocal<Integer> threadLocalCount =
@@ -167,6 +168,7 @@
     assertEquals(10, threadLocalCount.get().intValue());
   }
 
+
   public void testDirectExecutorServiceServiceTermination() throws Exception {
     final ExecutorService executor = newDirectExecutorService();
     final CyclicBarrier barrier = new CyclicBarrier(2);
@@ -352,6 +354,7 @@
     verify(delegate).execute(task);
   }
 
+
   public void testListeningDecorator_scheduleSuccess() throws Exception {
     final CountDownLatch completed = new CountDownLatch(1);
     ScheduledThreadPoolExecutor delegate =
@@ -377,6 +380,7 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
+
   public void testListeningDecorator_scheduleFailure() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     ListeningScheduledExecutorService service = listeningDecorator(delegate);
@@ -387,6 +391,7 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
+
   public void testListeningDecorator_schedulePeriodic() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     ListeningScheduledExecutorService service = listeningDecorator(delegate);
@@ -407,6 +412,7 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
+
   public void testListeningDecorator_cancelled() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     BlockingQueue<?> delegateQueue = delegate.getQueue();
@@ -560,6 +566,7 @@
     }
   }
 
+
   public void testAddDelayedShutdownHook_success() throws InterruptedException {
     TestApplication application = new TestApplication();
     ExecutorService service = mock(ExecutorService.class);
@@ -571,6 +578,7 @@
     shutdownFirst.verify(service).awaitTermination(2, TimeUnit.SECONDS);
   }
 
+
   public void testAddDelayedShutdownHook_interrupted() throws InterruptedException {
     TestApplication application = new TestApplication();
     ExecutorService service = mock(ExecutorService.class);
@@ -580,6 +588,7 @@
     verify(service).shutdown();
   }
 
+
   public void testGetExitingExecutorService_executorSetToUseDaemonThreads() {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor =
@@ -588,6 +597,7 @@
     assertTrue(executor.getThreadFactory().newThread(EMPTY_RUNNABLE).isDaemon());
   }
 
+
   public void testGetExitingExecutorService_executorDelegatesToOriginal() {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor = mock(ThreadPoolExecutor.class);
@@ -597,6 +607,7 @@
     verify(executor).execute(EMPTY_RUNNABLE);
   }
 
+
   public void testGetExitingExecutorService_shutdownHookRegistered() throws InterruptedException {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor = mock(ThreadPoolExecutor.class);
@@ -607,6 +618,7 @@
     verify(executor).shutdown();
   }
 
+
   public void testGetExitingScheduledExecutorService_executorSetToUseDaemonThreads() {
     TestApplication application = new TestApplication();
     ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
@@ -614,6 +626,7 @@
     assertTrue(executor.getThreadFactory().newThread(EMPTY_RUNNABLE).isDaemon());
   }
 
+
   public void testGetExitingScheduledExecutorService_executorDelegatesToOriginal() {
     TestApplication application = new TestApplication();
     ScheduledThreadPoolExecutor executor = mock(ScheduledThreadPoolExecutor.class);
@@ -623,6 +636,7 @@
     verify(executor).execute(EMPTY_RUNNABLE);
   }
 
+
   public void testGetScheduledExitingExecutorService_shutdownHookRegistered()
       throws InterruptedException {
     TestApplication application = new TestApplication();
@@ -655,6 +669,7 @@
     assertEquals(oldName, Thread.currentThread().getName());
   }
 
+
   public void testExecutors_nullCheck() throws Exception {
     new ClassSanityTester()
         .setDefault(RateLimiter.class, RateLimiter.create(1.0))
@@ -684,12 +699,14 @@
   /* Half of a 1-second timeout in nanoseconds */
   private static final long HALF_SECOND_NANOS = NANOSECONDS.convert(1L, SECONDS) / 2;
 
+
   public void testShutdownAndAwaitTermination_immediateShutdown() throws Exception {
     ExecutorService service = Executors.newSingleThreadExecutor();
     assertTrue(shutdownAndAwaitTermination(service, 1L, SECONDS));
     assertTrue(service.isTerminated());
   }
 
+
   public void testShutdownAndAwaitTermination_immediateShutdownInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS)).thenReturn(true);
@@ -699,6 +716,7 @@
     verify(service).awaitTermination(HALF_SECOND_NANOS, NANOSECONDS);
   }
 
+
   public void testShutdownAndAwaitTermination_forcedShutDownInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
@@ -711,6 +729,7 @@
     verify(service).shutdownNow();
   }
 
+
   public void testShutdownAndAwaitTermination_nonTerminationInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
@@ -722,6 +741,7 @@
     verify(service).shutdownNow();
   }
 
+
   public void testShutdownAndAwaitTermination_interruptedInternal() throws Exception {
     final ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java b/android/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
index ff9e311..20209e8 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
@@ -274,6 +274,7 @@
     assertEquals(1, numCalls.get());
   }
 
+
   public void testTaskThrowsError() throws Exception {
     class MyError extends Error {}
     final CyclicBarrier barrier = new CyclicBarrier(2);
@@ -312,6 +313,7 @@
     }
   }
 
+
   public void testRejectedExecutionThrownWithMultipleCalls() throws Exception {
     final CountDownLatch latch = new CountDownLatch(1);
     final SettableFuture<?> future = SettableFuture.create();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
index fbc238e..20ed3de 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
@@ -119,19 +119,19 @@
     }
   }
 
+
   public void testServiceStartupTimes() {
     Service a = new NoOpDelayedService(150);
     Service b = new NoOpDelayedService(353);
     ServiceManager serviceManager = new ServiceManager(asList(a, b));
     serviceManager.startAsync().awaitHealthy();
     ImmutableMap<Service, Long> startupTimes = serviceManager.startupTimes();
-    assertEquals(2, startupTimes.size());
-    // TODO(kak): Use assertThat(startupTimes.get(a)).isAtLeast(150);
-    assertTrue(startupTimes.get(a) >= 150);
-    // TODO(kak): Use assertThat(startupTimes.get(b)).isAtLeast(353);
-    assertTrue(startupTimes.get(b) >= 353);
+    assertThat(startupTimes).hasSize(2);
+    assertThat(startupTimes.get(a)).isAtLeast(150);
+    assertThat(startupTimes.get(b)).isAtLeast(353);
   }
 
+
   public void testServiceStartupTimes_selfStartingServices() {
     // This tests to ensure that:
     // 1. service times are accurate when the service is started by the manager
@@ -157,9 +157,8 @@
     ServiceManager serviceManager = new ServiceManager(asList(a, b));
     serviceManager.startAsync().awaitHealthy();
     ImmutableMap<Service, Long> startupTimes = serviceManager.startupTimes();
-    assertEquals(2, startupTimes.size());
-    // TODO(kak): Use assertThat(startupTimes.get(a)).isAtLeast(150);
-    assertTrue(startupTimes.get(a) >= 150);
+    assertThat(startupTimes).hasSize(2);
+    assertThat(startupTimes.get(a)).isAtLeast(150);
     // Service b startup takes at least 353 millis, but starting the timer is delayed by at least
     // 150 milliseconds. so in a perfect world the timing would be 353-150=203ms, but since either
     // of our sleep calls can be arbitrarily delayed we should just assert that there is a time
@@ -167,6 +166,7 @@
     assertThat(startupTimes.get(b)).isNotNull();
   }
 
+
   public void testServiceStartStop() {
     Service a = new NoOpService();
     Service b = new NoOpService();
@@ -188,6 +188,7 @@
     assertTrue(listener.failedServices.isEmpty());
   }
 
+
   public void testFailStart() throws Exception {
     Service a = new NoOpService();
     Service b = new FailStartService();
@@ -215,6 +216,7 @@
     assertTrue(listener.stoppedCalled);
   }
 
+
   public void testFailRun() throws Exception {
     Service a = new NoOpService();
     Service b = new FailRunService();
@@ -237,6 +239,7 @@
     assertTrue(listener.stoppedCalled);
   }
 
+
   public void testFailStop() throws Exception {
     Service a = new NoOpService();
     Service b = new FailStopService();
@@ -265,6 +268,7 @@
     assertThat(toString).contains("FailStartService");
   }
 
+
   public void testTimeouts() throws Exception {
     Service a = new NoOpDelayedService(50);
     ServiceManager manager = new ServiceManager(asList(a));
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
index 105e8de..9b8b88f 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
@@ -51,16 +51,19 @@
     }
   }
 
+
   public void testSetValue() throws Exception {
     assertTrue(future.set("value"));
     tester.testCompletedFuture("value");
   }
 
+
   public void testSetFailure() throws Exception {
     assertTrue(future.setException(new Exception("failure")));
     tester.testFailedFuture("failure");
   }
 
+
   public void testSetFailureNull() throws Exception {
     try {
       future.setException(null);
@@ -72,6 +75,7 @@
     tester.testFailedFuture("failure");
   }
 
+
   public void testCancel() throws Exception {
     assertTrue(future.cancel(true));
     tester.testCancelledFuture();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/StripedTest.java b/android/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
index 9832c30..fa9d87f 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
@@ -129,6 +129,7 @@
     assertTrue(Striped.lazyWeakLock(256).size() == 256);
   }
 
+
   public void testWeakImplementations() {
     for (Striped<?> striped : weakImplementations()) {
       WeakReference<Object> weakRef = new WeakReference<>(striped.get(new Object()));
@@ -136,6 +137,7 @@
     }
   }
 
+
   public void testWeakReadWrite() {
     Striped<ReadWriteLock> striped = Striped.lazyWeakReadWriteLock(1000);
     Object key = new Object();
@@ -148,6 +150,7 @@
     readLock.unlock();
   }
 
+
   public void testStrongImplementations() {
     for (Striped<?> striped : strongImplementations()) {
       WeakReference<Object> weakRef = new WeakReference<>(striped.get(new Object()));
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java b/android/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
index a3a7b8e..7684b96 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
@@ -56,6 +56,7 @@
     builder = new ThreadFactoryBuilder();
   }
 
+
   public void testThreadFactoryBuilder_defaults() throws InterruptedException {
     ThreadFactory threadFactory = builder.build();
     Thread thread = threadFactory.newThread(monitoredRunnable);
@@ -92,6 +93,7 @@
     assertThat(thread.getName()).matches("^pool-\\d+-thread-" + threadId + "$");
   }
 
+
   public void testNameFormatWithPercentS_custom() {
     String format = "super-duper-thread-%s";
     ThreadFactory factory = builder.setNameFormat(format).build();
@@ -100,6 +102,7 @@
     }
   }
 
+
   public void testNameFormatWithPercentD_custom() {
     String format = "super-duper-thread-%d";
     ThreadFactory factory = builder.setNameFormat(format).build();
@@ -108,18 +111,21 @@
     }
   }
 
+
   public void testDaemon_false() {
     ThreadFactory factory = builder.setDaemon(false).build();
     Thread thread = factory.newThread(monitoredRunnable);
     assertFalse(thread.isDaemon());
   }
 
+
   public void testDaemon_true() {
     ThreadFactory factory = builder.setDaemon(true).build();
     Thread thread = factory.newThread(monitoredRunnable);
     assertTrue(thread.isDaemon());
   }
 
+
   public void testPriority_custom() {
     for (int i = Thread.MIN_PRIORITY; i <= Thread.MAX_PRIORITY; i++) {
       ThreadFactory factory = builder.setPriority(i).build();
@@ -144,6 +150,7 @@
     }
   }
 
+
   public void testUncaughtExceptionHandler_custom() {
     assertEquals(
         UNCAUGHT_EXCEPTION_HANDLER,
@@ -154,6 +161,7 @@
             .getUncaughtExceptionHandler());
   }
 
+
   public void testBuildMutateBuild() {
     ThreadFactory factory1 = builder.setPriority(1).build();
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
@@ -169,6 +177,7 @@
     unused = builder.build(); // this is *also* allowed
   }
 
+
   public void testBuildMutate() {
     ThreadFactory factory1 = builder.setPriority(1).build();
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
@@ -177,6 +186,7 @@
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
   }
 
+
   public void testThreadFactory() throws InterruptedException {
     final String THREAD_NAME = "ludicrous speed";
     final int THREAD_PRIORITY = 1;
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/TrustedInputFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/TrustedInputFutureTest.java
index d452f96..1f2ecca 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/TrustedInputFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/TrustedInputFutureTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.util.concurrent;
 
+
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.util.concurrent.AbstractFuture.TrustedFuture;
 
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
index 47507cd..0d24266 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
@@ -116,6 +116,7 @@
     assertTrue(sleeper.completed);
   }
 
+
   public void testMakeUninterruptible_timeoutPreservedThroughInterruption()
       throws ExecutionException {
 
@@ -154,26 +155,32 @@
     }
   }
 
+
   public void testMakeUninterruptible_untimed_uninterrupted() throws Exception {
     runUntimedInterruptsTest(0);
   }
 
+
   public void testMakeUninterruptible_untimed_interrupted() throws Exception {
     runUntimedInterruptsTest(1);
   }
 
+
   public void testMakeUninterruptible_untimed_multiplyInterrupted() throws Exception {
     runUntimedInterruptsTest(38);
   }
 
+
   public void testMakeUninterruptible_timed_uninterrupted() throws Exception {
     runTimedInterruptsTest(0);
   }
 
+
   public void testMakeUninterruptible_timed_interrupted() throws Exception {
     runTimedInterruptsTest(1);
   }
 
+
   public void testMakeUninterruptible_timed_multiplyInterrupted() throws Exception {
     runTimedInterruptsTest(38);
   }
@@ -228,6 +235,7 @@
     }
   }
 
+
   public void testMakeUninterruptible_timedGetZeroTimeoutAttempted()
       throws TimeoutException, ExecutionException {
     SettableFuture<String> future = SettableFuture.create();
@@ -240,6 +248,7 @@
     assertEquals(RESULT, getUninterruptibly(future, 0, SECONDS));
   }
 
+
   public void testMakeUninterruptible_timedGetNegativeTimeoutAttempted()
       throws TimeoutException, ExecutionException {
     SettableFuture<String> future = SettableFuture.create();
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
index 30ce22d..59bf808 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.util.concurrent;
 
+
 /**
  * Tests for {@link Monitor}'s uninterruptible methods.
  *
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/UntrustedInputFutureTest.java b/android/guava-tests/test/com/google/common/util/concurrent/UntrustedInputFutureTest.java
index 2d071b5..a6241d2 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/UntrustedInputFutureTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/UntrustedInputFutureTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.util.concurrent;
 
+
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.util.concurrent.AbstractFuture.TrustedFuture;
 
diff --git a/android/guava-tests/test/com/google/common/util/concurrent/WrappingScheduledExecutorServiceTest.java b/android/guava-tests/test/com/google/common/util/concurrent/WrappingScheduledExecutorServiceTest.java
index 6a8adfe..8d0183e 100644
--- a/android/guava-tests/test/com/google/common/util/concurrent/WrappingScheduledExecutorServiceTest.java
+++ b/android/guava-tests/test/com/google/common/util/concurrent/WrappingScheduledExecutorServiceTest.java
@@ -46,11 +46,11 @@
     MockExecutor mock = new MockExecutor();
     TestExecutor testExecutor = new TestExecutor(mock);
 
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = testExecutor.schedule(DO_NOTHING, 10, TimeUnit.MINUTES);
     mock.assertLastMethodCalled("scheduleRunnable", 10, TimeUnit.MINUTES);
 
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError1 =
         testExecutor.schedule(Executors.callable(DO_NOTHING), 5, TimeUnit.SECONDS);
     mock.assertLastMethodCalled("scheduleCallable", 5, TimeUnit.SECONDS);
@@ -59,12 +59,12 @@
   public void testSchedule_repeating() {
     MockExecutor mock = new MockExecutor();
     TestExecutor testExecutor = new TestExecutor(mock);
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError =
         testExecutor.scheduleWithFixedDelay(DO_NOTHING, 100, 10, TimeUnit.MINUTES);
     mock.assertLastMethodCalled("scheduleWithFixedDelay", 100, 10, TimeUnit.MINUTES);
 
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError1 =
         testExecutor.scheduleAtFixedRate(DO_NOTHING, 3, 7, TimeUnit.SECONDS);
     mock.assertLastMethodCalled("scheduleAtFixedRate", 3, 7, TimeUnit.SECONDS);
diff --git a/android/guava-tests/test/com/google/common/xml/XmlEscapersTest.java b/android/guava-tests/test/com/google/common/xml/XmlEscapersTest.java
old mode 100755
new mode 100644
diff --git a/android/guava/pom.xml b/android/guava/pom.xml
index 92db217..e9154c7 100644
--- a/android/guava/pom.xml
+++ b/android/guava/pom.xml
@@ -5,14 +5,15 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>30.0-android</version>
+    <version>31.0.1-android</version>
   </parent>
   <artifactId>guava</artifactId>
   <packaging>bundle</packaging>
   <name>Guava: Google Core Libraries for Java</name>
+  <url>https://github.com/google/guava</url>
   <description>
     Guava is a suite of core and expanded libraries that include
-    utility classes, google's collections, io classes, and much
+    utility classes, Google's collections, I/O classes, and
     much more.
   </description>
   <dependencies>
@@ -32,6 +33,10 @@
     </dependency>
     <dependency>
       <groupId>org.checkerframework</groupId>
+      <artifactId>checker-qual</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.checkerframework</groupId>
       <artifactId>checker-compat-qual</artifactId>
     </dependency>
     <dependency>
@@ -115,6 +120,12 @@
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>animal-sniffer-maven-plugin</artifactId>
+        <configuration>
+          <ignores>
+            <!-- Allow requireNonNull: Android desugaring rewrites it (so it's safe for us to use), and it's useful for null checks. Note that this line allows *all* methods from java.util.Objects. That's the best that we can do with the configuration options that Animal Sniffer offers. -->
+            <ignore>java.util.Objects</ignore>
+          </ignores>
+        </configuration>
       </plugin>
       <plugin>
         <artifactId>maven-javadoc-plugin</artifactId>
diff --git a/android/guava/src/com/google/common/annotations/Beta.java b/android/guava/src/com/google/common/annotations/Beta.java
old mode 100755
new mode 100644
index 47dafe8..f71dc94
--- a/android/guava/src/com/google/common/annotations/Beta.java
+++ b/android/guava/src/com/google/common/annotations/Beta.java
@@ -31,7 +31,6 @@
  * work during upgrades. However it is generally inadvisable for <i>libraries</i> (which get
  * included on users' CLASSPATHs, outside the library developers' control) to do so.
  *
- *
  * @author Kevin Bourrillion
  */
 @Retention(RetentionPolicy.CLASS)
diff --git a/android/guava/src/com/google/common/annotations/GwtCompatible.java b/android/guava/src/com/google/common/annotations/GwtCompatible.java
old mode 100755
new mode 100644
index 1391728..4bf6efb
--- a/android/guava/src/com/google/common/annotations/GwtCompatible.java
+++ b/android/guava/src/com/google/common/annotations/GwtCompatible.java
@@ -54,7 +54,6 @@
  *
  * <p>Note that a {@code GwtCompatible} type may have some {@link GwtIncompatible} methods.
  *
- *
  * @author Charles Fry
  * @author Hayward Chan
  */
diff --git a/android/guava/src/com/google/common/annotations/GwtIncompatible.java b/android/guava/src/com/google/common/annotations/GwtIncompatible.java
old mode 100755
new mode 100644
diff --git a/android/guava/src/com/google/common/annotations/VisibleForTesting.java b/android/guava/src/com/google/common/annotations/VisibleForTesting.java
old mode 100755
new mode 100644
diff --git a/android/guava/src/com/google/common/annotations/package-info.java b/android/guava/src/com/google/common/annotations/package-info.java
old mode 100755
new mode 100644
diff --git a/android/guava/src/com/google/common/base/Absent.java b/android/guava/src/com/google/common/base/Absent.java
index 86aec05..f96136b 100644
--- a/android/guava/src/com/google/common/base/Absent.java
+++ b/android/guava/src/com/google/common/base/Absent.java
@@ -19,10 +19,11 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Collections;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /** Implementation of an {@link Optional} not containing a reference. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class Absent<T> extends Optional<T> {
   static final Absent<Object> INSTANCE = new Absent<>();
 
@@ -61,7 +62,7 @@
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public T orNull() {
     return null;
   }
@@ -78,7 +79,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this;
   }
 
diff --git a/android/guava/src/com/google/common/base/AbstractIterator.java b/android/guava/src/com/google/common/base/AbstractIterator.java
index f6f521e..bb0a1d3 100644
--- a/android/guava/src/com/google/common/base/AbstractIterator.java
+++ b/android/guava/src/com/google/common/base/AbstractIterator.java
@@ -14,20 +14,23 @@
 
 package com.google.common.base;
 
+import static com.google.common.base.NullnessCasts.uncheckedCastNullableTToT;
 import static com.google.common.base.Preconditions.checkState;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Note this class is a copy of {@link com.google.common.collect.AbstractIterator} (for dependency
  * reasons).
  */
 @GwtCompatible
-abstract class AbstractIterator<T> implements Iterator<T> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractIterator<T extends @Nullable Object> implements Iterator<T> {
   private State state = State.NOT_READY;
 
   protected AbstractIterator() {}
@@ -39,12 +42,13 @@
     FAILED,
   }
 
-  @NullableDecl private T next;
+  @CheckForNull private T next;
 
+  @CheckForNull
   protected abstract T computeNext();
 
   @CanIgnoreReturnValue
-  @NullableDecl
+  @CheckForNull
   protected final T endOfData() {
     state = State.DONE;
     return null;
@@ -74,12 +78,14 @@
   }
 
   @Override
+  @ParametricNullness
   public final T next() {
     if (!hasNext()) {
       throw new NoSuchElementException();
     }
     state = State.NOT_READY;
-    T result = next;
+    // Safe because hasNext() ensures that tryToComputeNext() has put a T into `next`.
+    T result = uncheckedCastNullableTToT(next);
     next = null;
     return result;
   }
diff --git a/android/guava/src/com/google/common/base/Ascii.java b/android/guava/src/com/google/common/base/Ascii.java
index 0a8ec50..0c651bb 100644
--- a/android/guava/src/com/google/common/base/Ascii.java
+++ b/android/guava/src/com/google/common/base/Ascii.java
@@ -37,6 +37,7 @@
  * @since 7.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Ascii {
 
   private Ascii() {}
@@ -439,7 +440,7 @@
   }
 
   /**
-   * If the argument is an {@linkplain #isUpperCase(char) uppercase ASCII character} returns the
+   * If the argument is an {@linkplain #isUpperCase(char) uppercase ASCII character}, returns the
    * lowercase equivalent. Otherwise returns the argument.
    */
   public static char toLowerCase(char c) {
@@ -487,7 +488,7 @@
   }
 
   /**
-   * If the argument is a {@linkplain #isLowerCase(char) lowercase ASCII character} returns the
+   * If the argument is a {@linkplain #isLowerCase(char) lowercase ASCII character}, returns the
    * uppercase equivalent. Otherwise returns the argument.
    */
   public static char toUpperCase(char c) {
@@ -542,7 +543,6 @@
    *   <li>it is safe to use non-ASCII characters in the truncation indicator
    * </ul>
    *
-   *
    * @throws IllegalArgumentException if {@code maxLength} is less than the length of {@code
    *     truncationIndicator}
    * @since 16.0
diff --git a/android/guava/src/com/google/common/base/CaseFormat.java b/android/guava/src/com/google/common/base/CaseFormat.java
index 5e24bc9..7b393eb 100644
--- a/android/guava/src/com/google/common/base/CaseFormat.java
+++ b/android/guava/src/com/google/common/base/CaseFormat.java
@@ -15,10 +15,11 @@
 package com.google.common.base;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Utility class for converting between various ASCII case formats. Behavior is undefined for
@@ -28,6 +29,7 @@
  * @since 1.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public enum CaseFormat {
   /** Hyphenated variable naming convention, e.g., "lower-hyphen". */
   LOWER_HYPHEN(CharMatcher.is('-'), "-") {
@@ -138,14 +140,14 @@
         out = new StringBuilder(s.length() + 4 * format.wordSeparator.length());
         out.append(format.normalizeFirstWord(s.substring(i, j)));
       } else {
-        out.append(format.normalizeWord(s.substring(i, j)));
+        requireNonNull(out).append(format.normalizeWord(s.substring(i, j)));
       }
       out.append(format.wordSeparator);
       i = j + wordSeparator.length();
     }
     return (i == 0)
         ? format.normalizeFirstWord(s)
-        : out.append(format.normalizeWord(s.substring(i))).toString();
+        : requireNonNull(out).append(format.normalizeWord(s.substring(i))).toString();
   }
 
   /**
@@ -179,7 +181,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof StringConverter) {
         StringConverter that = (StringConverter) object;
         return sourceFormat.equals(that.sourceFormat) && targetFormat.equals(that.targetFormat);
diff --git a/android/guava/src/com/google/common/base/CharMatcher.java b/android/guava/src/com/google/common/base/CharMatcher.java
index e17db17..7941883 100644
--- a/android/guava/src/com/google/common/base/CharMatcher.java
+++ b/android/guava/src/com/google/common/base/CharMatcher.java
@@ -61,6 +61,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public abstract class CharMatcher implements Predicate<Character> {
   /*
    *           N777777777NO
diff --git a/android/guava/src/com/google/common/base/Charsets.java b/android/guava/src/com/google/common/base/Charsets.java
index 2c9563d..7aebea8 100644
--- a/android/guava/src/com/google/common/base/Charsets.java
+++ b/android/guava/src/com/google/common/base/Charsets.java
@@ -31,6 +31,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Charsets {
   private Charsets() {}
 
diff --git a/android/guava/src/com/google/common/base/CommonMatcher.java b/android/guava/src/com/google/common/base/CommonMatcher.java
index 6d14c6b..d63b46b 100644
--- a/android/guava/src/com/google/common/base/CommonMatcher.java
+++ b/android/guava/src/com/google/common/base/CommonMatcher.java
@@ -22,6 +22,7 @@
  * javadoc for details.
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 abstract class CommonMatcher {
   public abstract boolean matches();
 
diff --git a/android/guava/src/com/google/common/base/CommonPattern.java b/android/guava/src/com/google/common/base/CommonPattern.java
index 6be5b01..c425d52 100644
--- a/android/guava/src/com/google/common/base/CommonPattern.java
+++ b/android/guava/src/com/google/common/base/CommonPattern.java
@@ -22,6 +22,7 @@
  * javadoc for details.
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 abstract class CommonPattern {
   public abstract CommonMatcher matcher(CharSequence t);
 
diff --git a/android/guava/src/com/google/common/base/Converter.java b/android/guava/src/com/google/common/base/Converter.java
index 82c0057..208a032 100644
--- a/android/guava/src/com/google/common/base/Converter.java
+++ b/android/guava/src/com/google/common/base/Converter.java
@@ -14,6 +14,7 @@
 
 package com.google.common.base;
 
+import static com.google.common.base.NullnessCasts.uncheckedCastNullableTToT;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtCompatible;
@@ -23,7 +24,7 @@
 import com.google.j2objc.annotations.RetainedWith;
 import java.io.Serializable;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A function from {@code A} to {@code B} with an associated <i>reverse</i> function from {@code B}
@@ -55,7 +56,6 @@
  * behavior for all converters; implementations of {@link #doForward} and {@link #doBackward} are
  * guaranteed to never be passed {@code null}, and must never return {@code null}.
  *
- *
  * <h3>Common ways to use</h3>
  *
  * <p>Getting a converter:
@@ -114,11 +114,36 @@
  * @since 16.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
+/*
+ * 1. The type parameter is <T> rather than <T extends @Nullable> so that we can use T in the
+ * doForward and doBackward methods to indicate that the parameter cannot be null. (We also take
+ * advantage of that for convertAll, as discussed on that method.)
+ *
+ * 2. The supertype of this class could be `Function<@Nullable A, @Nullable B>`, since
+ * Converter.apply (like Converter.convert) is capable of accepting null inputs. However, a
+ * supertype of `Function<A, B>` turns out to be massively more useful to callers in practice: They
+ * want their output to be non-null in operations like `stream.map(myConverter)`, and we can
+ * guarantee that as long as we also require the input type to be non-null[*] (which is a
+ * requirement that existing callers already fulfill).
+ *
+ * Disclaimer: Part of the reason that callers are so well adapted to `Function<A, B>` may be that
+ * that is how the signature looked even prior to this comment! So naturally any change can break
+ * existing users, but it can't *fix* existing users because any users who needed
+ * `Function<@Nullable A, @Nullable B>` already had to find a workaround. Still, there is a *ton* of
+ * fallout from trying to switch. I would be shocked if the switch would offer benefits to anywhere
+ * near enough users to justify the costs.
+ *
+ * Fortunately, if anyone does want to use a Converter as a `Function<@Nullable A, @Nullable B>`,
+ * it's easy to get one: `converter::convert`.
+ *
+ * [*] In annotating this class, we're ignoring LegacyConverter.
+ */
 public abstract class Converter<A, B> implements Function<A, B> {
   private final boolean handleNullAutomatically;
 
   // We lazily cache the reverse view to avoid allocating on every call to reverse().
-  @LazyInit @RetainedWith @NullableDecl private transient Converter<B, A> reverse;
+  @LazyInit @RetainedWith @CheckForNull private transient Converter<B, A> reverse;
 
   /** Constructor for use by subclasses. */
   protected Converter() {
@@ -165,31 +190,67 @@
    * @return the converted value; is null <i>if and only if</i> {@code a} is null
    */
   @CanIgnoreReturnValue
-  @NullableDecl
-  public final B convert(@NullableDecl A a) {
+  @CheckForNull
+  public final B convert(@CheckForNull A a) {
     return correctedDoForward(a);
   }
 
-  @NullableDecl
-  B correctedDoForward(@NullableDecl A a) {
+  @CheckForNull
+  B correctedDoForward(@CheckForNull A a) {
     if (handleNullAutomatically) {
       // TODO(kevinb): we shouldn't be checking for a null result at runtime. Assert?
       return a == null ? null : checkNotNull(doForward(a));
     } else {
-      return doForward(a);
+      return unsafeDoForward(a);
     }
   }
 
-  @NullableDecl
-  A correctedDoBackward(@NullableDecl B b) {
+  @CheckForNull
+  A correctedDoBackward(@CheckForNull B b) {
     if (handleNullAutomatically) {
       // TODO(kevinb): we shouldn't be checking for a null result at runtime. Assert?
       return b == null ? null : checkNotNull(doBackward(b));
     } else {
-      return doBackward(b);
+      return unsafeDoBackward(b);
     }
   }
 
+  /*
+   * LegacyConverter violates the contract of Converter by allowing its doForward and doBackward
+   * methods to accept null. We could avoid having unchecked casts in Converter.java itself if we
+   * could perform a cast to LegacyConverter, but we can't because it's an internal-only class.
+   *
+   * TODO(cpovirk): So make it part of the open-source build, albeit package-private there?
+   *
+   * So we use uncheckedCastNullableTToT here. This is a weird usage of that method: The method is
+   * documented as being for use with type parameters that have parametric nullness. But Converter's
+   * type parameters do not. Still, we use it here so that we can suppress a warning at a smaller
+   * level than the whole method but without performing a runtime null check. That way, we can still
+   * pass null inputs to LegacyConverter, and it can violate the contract of Converter.
+   *
+   * TODO(cpovirk): Could this be simplified if we modified implementations of LegacyConverter to
+   * override methods (probably called "unsafeDoForward" and "unsafeDoBackward") with the same
+   * signatures as the methods below, rather than overriding the same doForward and doBackward
+   * methods as implementations of normal converters do?
+   *
+   * But no matter what we do, it's worth remembering that the resulting code is going to be unsound
+   * in the presence of LegacyConverter, at least in the case of users who view the converter as a
+   * Function<A, B> or who call convertAll (and for any checkers that apply @PolyNull-like semantics
+   * to Converter.convert). So maybe we don't want to think too hard about how to prevent our
+   * checkers from issuing errors related to LegacyConverter, since it turns out that
+   * LegacyConverter does violate the assumptions we make elsewhere.
+   */
+
+  @CheckForNull
+  private B unsafeDoForward(@CheckForNull A a) {
+    return doForward(uncheckedCastNullableTToT(a));
+  }
+
+  @CheckForNull
+  private A unsafeDoBackward(@CheckForNull B b) {
+    return doBackward(uncheckedCastNullableTToT(b));
+  }
+
   /**
    * Returns an iterable that applies {@code convert} to each element of {@code fromIterable}. The
    * conversion is done lazily.
@@ -199,6 +260,16 @@
    * element.
    */
   @CanIgnoreReturnValue
+  /*
+   * Just as Converter could implement `Function<@Nullable A, @Nullable B>` instead of `Function<A,
+   * B>`, convertAll could accept and return iterables with nullable element types. In both cases,
+   * we've chosen to instead use a signature that benefits existing users -- and is still safe.
+   *
+   * For convertAll, I haven't looked as closely at *how* much existing users benefit, so we should
+   * keep an eye out for problems that new users encounter. Note also that convertAll could support
+   * both use cases by using @PolyNull. (By contrast, we can't use @PolyNull for our superinterface
+   * (`implements Function<@PolyNull A, @PolyNull B>`), at least as far as I know.)
+   */
   public Iterable<B> convertAll(final Iterable<? extends A> fromIterable) {
     checkNotNull(fromIterable, "fromIterable");
     return new Iterable<B>() {
@@ -213,6 +284,8 @@
           }
 
           @Override
+          @SuppressWarnings("nullness") // See code comments on convertAll and Converter.apply.
+          @CheckForNull
           public B next() {
             return convert(fromIterator.next());
           }
@@ -266,14 +339,14 @@
     }
 
     @Override
-    @NullableDecl
-    A correctedDoForward(@NullableDecl B b) {
+    @CheckForNull
+    A correctedDoForward(@CheckForNull B b) {
       return original.correctedDoBackward(b);
     }
 
     @Override
-    @NullableDecl
-    B correctedDoBackward(@NullableDecl A a) {
+    @CheckForNull
+    B correctedDoBackward(@CheckForNull A a) {
       return original.correctedDoForward(a);
     }
 
@@ -283,7 +356,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof ReverseConverter) {
         ReverseConverter<?, ?> that = (ReverseConverter<?, ?>) object;
         return this.original.equals(that.original);
@@ -348,19 +421,19 @@
     }
 
     @Override
-    @NullableDecl
-    C correctedDoForward(@NullableDecl A a) {
+    @CheckForNull
+    C correctedDoForward(@CheckForNull A a) {
       return second.correctedDoForward(first.correctedDoForward(a));
     }
 
     @Override
-    @NullableDecl
-    A correctedDoBackward(@NullableDecl C c) {
+    @CheckForNull
+    A correctedDoBackward(@CheckForNull C c) {
       return first.correctedDoBackward(second.correctedDoBackward(c));
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof ConverterComposition) {
         ConverterComposition<?, ?, ?> that = (ConverterComposition<?, ?, ?>) object;
         return this.first.equals(that.first) && this.second.equals(that.second);
@@ -387,8 +460,39 @@
   @Deprecated
   @Override
   @CanIgnoreReturnValue
-  @NullableDecl
-  public final B apply(@NullableDecl A a) {
+  /*
+   * Even though we implement `Function<A, B>` instead of `Function<@Nullable A, @Nullable B>` (as
+   * discussed in a code comment at the top of the class), we declare our override of Function.apply
+   * to accept and return null. This requires a suppression, but it's safe:
+   *
+   * - Callers who use Converter as a Function<A, B> will neither pass null nor have it returned to
+   *   them. (Or, if they're not using nullness checking, they might be able to pass null and thus
+   *   have null returned to them. But our signature isn't making their existing nullness type error
+   *   any worse.)
+   * - In the relatively unlikely event that anyone calls Converter.apply directly, that caller is
+   *   allowed to pass null but is also forced to deal with a potentially null return.
+   * - Perhaps more important than actual *callers* of this method are various tools that look at
+   *   bytecode. Notably, NullPointerTester expects a method to throw NPE when passed null unless it
+   *   is annotated in a way that identifies its parameter type as potentially including null. (And
+   *   this method does not throw NPE -- nor do we want to enact a dangerous change to make it begin
+   *   doing so.) We can even imagine tools that rewrite bytecode to insert null checks before and
+   *   after calling methods with allegedly non-nullable parameters[*]. If we didn't annotate the
+   *   parameter and return type here, then anyone who used such a tool (and managed to pass null to
+   *   this method, presumably because that user doesn't run a normal nullness checker) could see
+   *   NullPointerException.
+   *
+   * [*] Granted, such tools could conceivably be smart enough to recognize that the apply() method
+   * on a a Function<Foo, Bar> should never allow null inputs and never produce null outputs even if
+   * this specific subclass claims otherwise. Such tools might still produce NPE for calls to this
+   * method. And that is one reason that we should be nervous about "lying" by extending Function<A,
+   * B> in the first place. But for now, we're giving it a try, since extending Function<@Nullable
+   * A, @Nullable B> will cause issues *today*, whereas extending Function<A, B> causes problems in
+   * various hypothetical futures. (Plus, a tool that were that smart would likely already introduce
+   * problems with LegacyConverter.)
+   */
+  @SuppressWarnings("nullness")
+  @CheckForNull
+  public final B apply(@CheckForNull A a) {
     return convert(a);
   }
 
@@ -404,7 +508,7 @@
    * interchangeable.
    */
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return super.equals(object);
   }
 
@@ -453,7 +557,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof FunctionBasedConverter) {
         FunctionBasedConverter<?, ?> that = (FunctionBasedConverter<?, ?>) object;
         return this.forwardFunction.equals(that.forwardFunction)
diff --git a/android/guava/src/com/google/common/base/Defaults.java b/android/guava/src/com/google/common/base/Defaults.java
index 00adbde..5d12343 100644
--- a/android/guava/src/com/google/common/base/Defaults.java
+++ b/android/guava/src/com/google/common/base/Defaults.java
@@ -17,7 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides default values for all Java types, as defined by the JLS.
@@ -26,11 +26,12 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Defaults {
   private Defaults() {}
 
-  private static final Double DOUBLE_DEFAULT = Double.valueOf(0d);
-  private static final Float FLOAT_DEFAULT = Float.valueOf(0f);
+  private static final Double DOUBLE_DEFAULT = 0d;
+  private static final Float FLOAT_DEFAULT = 0f;
 
   /**
    * Returns the default value of {@code type} as defined by JLS --- {@code 0} for numbers, {@code
@@ -38,27 +39,28 @@
    * {@code void}, {@code null} is returned.
    */
   @SuppressWarnings("unchecked")
-  @NullableDecl
+  @CheckForNull
   public static <T> T defaultValue(Class<T> type) {
     checkNotNull(type);
-    if (type == boolean.class) {
-      return (T) Boolean.FALSE;
-    } else if (type == char.class) {
-      return (T) Character.valueOf('\0');
-    } else if (type == byte.class) {
-      return (T) Byte.valueOf((byte) 0);
-    } else if (type == short.class) {
-      return (T) Short.valueOf((short) 0);
-    } else if (type == int.class) {
-      return (T) Integer.valueOf(0);
-    } else if (type == long.class) {
-      return (T) Long.valueOf(0L);
-    } else if (type == float.class) {
-      return (T) FLOAT_DEFAULT;
-    } else if (type == double.class) {
-      return (T) DOUBLE_DEFAULT;
-    } else {
-      return null;
+    if (type.isPrimitive()) {
+      if (type == boolean.class) {
+        return (T) Boolean.FALSE;
+      } else if (type == char.class) {
+        return (T) Character.valueOf('\0');
+      } else if (type == byte.class) {
+        return (T) Byte.valueOf((byte) 0);
+      } else if (type == short.class) {
+        return (T) Short.valueOf((short) 0);
+      } else if (type == int.class) {
+        return (T) Integer.valueOf(0);
+      } else if (type == long.class) {
+        return (T) Long.valueOf(0L);
+      } else if (type == float.class) {
+        return (T) FLOAT_DEFAULT;
+      } else if (type == double.class) {
+        return (T) DOUBLE_DEFAULT;
+      }
     }
+    return null;
   }
 }
diff --git a/android/guava/src/com/google/common/base/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/base/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..890e3a3
--- /dev/null
+++ b/android/guava/src/com/google/common/base/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.base;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/base/Enums.java b/android/guava/src/com/google/common/base/Enums.java
index 247fa6e..449b7e3 100644
--- a/android/guava/src/com/google/common/base/Enums.java
+++ b/android/guava/src/com/google/common/base/Enums.java
@@ -25,7 +25,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.WeakHashMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Utility methods for working with {@link Enum} instances.
@@ -34,6 +34,7 @@
  * @since 9.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Enums {
 
   private Enums() {}
@@ -128,7 +129,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof StringConverter) {
         StringConverter<?> that = (StringConverter<?>) object;
         return this.enumClass.equals(that.enumClass);
diff --git a/android/guava/src/com/google/common/base/Equivalence.java b/android/guava/src/com/google/common/base/Equivalence.java
index 4364448..0ce901f 100644
--- a/android/guava/src/com/google/common/base/Equivalence.java
+++ b/android/guava/src/com/google/common/base/Equivalence.java
@@ -19,7 +19,8 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.ForOverride;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A strategy for determining whether two instances are considered equivalent, and for computing
@@ -38,6 +39,11 @@
  *     source-compatible</a> since 4.0)
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
+/*
+ * The type parameter is <T> rather than <T extends @Nullable> so that we can use T in the
+ * doEquivalent and doHash methods to indicate that the parameter cannot be null.
+ */
 public abstract class Equivalence<T> {
   /** Constructor for use by subclasses. */
   protected Equivalence() {}
@@ -59,7 +65,7 @@
    * <p>Note that all calls to {@code equivalent(x, y)} are expected to return the same result as
    * long as neither {@code x} nor {@code y} is modified.
    */
-  public final boolean equivalent(@NullableDecl T a, @NullableDecl T b) {
+  public final boolean equivalent(@CheckForNull T a, @CheckForNull T b) {
     if (a == b) {
       return true;
     }
@@ -70,8 +76,6 @@
   }
 
   /**
-   * This method should not be called except by {@link #equivalent}. When {@link #equivalent} calls
-   * this method, {@code a} and {@code b} are guaranteed to be distinct, non-null instances.
    *
    * @since 10.0 (previously, subclasses would override equivalent())
    */
@@ -95,7 +99,7 @@
    *   <li>{@code hash(null)} is {@code 0}.
    * </ul>
    */
-  public final int hash(@NullableDecl T t) {
+  public final int hash(@CheckForNull T t) {
     if (t == null) {
       return 0;
     }
@@ -137,7 +141,7 @@
    *
    * @since 10.0
    */
-  public final <F> Equivalence<F> onResultOf(Function<F, ? extends T> function) {
+  public final <F> Equivalence<F> onResultOf(Function<? super F, ? extends @Nullable T> function) {
     return new FunctionalEquivalence<>(function, this);
   }
 
@@ -148,7 +152,7 @@
    *
    * @since 10.0
    */
-  public final <S extends T> Wrapper<S> wrap(@NullableDecl S reference) {
+  public final <S extends @Nullable T> Wrapper<S> wrap(@ParametricNullness S reference) {
     return new Wrapper<S>(this, reference);
   }
 
@@ -172,17 +176,17 @@
    *
    * @since 10.0
    */
-  public static final class Wrapper<T> implements Serializable {
+  public static final class Wrapper<T extends @Nullable Object> implements Serializable {
     private final Equivalence<? super T> equivalence;
-    @NullableDecl private final T reference;
+    @ParametricNullness private final T reference;
 
-    private Wrapper(Equivalence<? super T> equivalence, @NullableDecl T reference) {
+    private Wrapper(Equivalence<? super T> equivalence, @ParametricNullness T reference) {
       this.equivalence = checkNotNull(equivalence);
       this.reference = reference;
     }
 
     /** Returns the (possibly null) reference wrapped by this instance. */
-    @NullableDecl
+    @ParametricNullness
     public T get() {
       return reference;
     }
@@ -193,7 +197,7 @@
      * equivalence.
      */
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj == this) {
         return true;
       }
@@ -243,10 +247,10 @@
    * @since 10.0
    */
   @GwtCompatible(serializable = true)
-  public final <S extends T> Equivalence<Iterable<S>> pairwise() {
+  public final <S extends @Nullable T> Equivalence<Iterable<S>> pairwise() {
     // Ideally, the returned equivalence would support Iterable<? extends T>. However,
     // the need for this is so rare that it's not worth making callers deal with the ugly wildcard.
-    return new PairwiseEquivalence<S>(this);
+    return new PairwiseEquivalence<>(this);
   }
 
   /**
@@ -255,27 +259,28 @@
    *
    * @since 10.0
    */
-  public final Predicate<T> equivalentTo(@NullableDecl T target) {
+  public final Predicate<@Nullable T> equivalentTo(@CheckForNull T target) {
     return new EquivalentToPredicate<T>(this, target);
   }
 
-  private static final class EquivalentToPredicate<T> implements Predicate<T>, Serializable {
+  private static final class EquivalentToPredicate<T>
+      implements Predicate<@Nullable T>, Serializable {
 
     private final Equivalence<T> equivalence;
-    @NullableDecl private final T target;
+    @CheckForNull private final T target;
 
-    EquivalentToPredicate(Equivalence<T> equivalence, @NullableDecl T target) {
+    EquivalentToPredicate(Equivalence<T> equivalence, @CheckForNull T target) {
       this.equivalence = checkNotNull(equivalence);
       this.target = target;
     }
 
     @Override
-    public boolean apply(@NullableDecl T input) {
+    public boolean apply(@CheckForNull T input) {
       return equivalence.equivalent(input, target);
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (this == obj) {
         return true;
       }
diff --git a/android/guava/src/com/google/common/base/ExtraObjectsMethodsForWeb.java b/android/guava/src/com/google/common/base/ExtraObjectsMethodsForWeb.java
index 21cca2c..6770755 100644
--- a/android/guava/src/com/google/common/base/ExtraObjectsMethodsForWeb.java
+++ b/android/guava/src/com/google/common/base/ExtraObjectsMethodsForWeb.java
@@ -21,4 +21,5 @@
  * version.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ExtraObjectsMethodsForWeb {}
diff --git a/android/guava/src/com/google/common/base/FinalizablePhantomReference.java b/android/guava/src/com/google/common/base/FinalizablePhantomReference.java
index f920575..4f93996 100644
--- a/android/guava/src/com/google/common/base/FinalizablePhantomReference.java
+++ b/android/guava/src/com/google/common/base/FinalizablePhantomReference.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.lang.ref.PhantomReference;
 import java.lang.ref.ReferenceQueue;
+import javax.annotation.CheckForNull;
 
 /**
  * Phantom reference with a {@code finalizeReferent()} method which a background thread invokes
@@ -29,6 +30,7 @@
  * @since 2.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class FinalizablePhantomReference<T> extends PhantomReference<T>
     implements FinalizableReference {
   /**
@@ -37,7 +39,7 @@
    * @param referent to phantom reference
    * @param queue that should finalize the referent
    */
-  protected FinalizablePhantomReference(T referent, FinalizableReferenceQueue queue) {
+  protected FinalizablePhantomReference(@CheckForNull T referent, FinalizableReferenceQueue queue) {
     super(referent, queue.queue);
     queue.cleanUp();
   }
diff --git a/android/guava/src/com/google/common/base/FinalizableReference.java b/android/guava/src/com/google/common/base/FinalizableReference.java
index 848e7ee..73753c9 100644
--- a/android/guava/src/com/google/common/base/FinalizableReference.java
+++ b/android/guava/src/com/google/common/base/FinalizableReference.java
@@ -26,6 +26,7 @@
  */
 @DoNotMock("Use an instance of one of the Finalizable*Reference classes")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface FinalizableReference {
   /**
    * Invoked on a background thread after the referent has been garbage collected unless security
diff --git a/android/guava/src/com/google/common/base/FinalizableReferenceQueue.java b/android/guava/src/com/google/common/base/FinalizableReferenceQueue.java
index 40dfd46..5ce1d31 100644
--- a/android/guava/src/com/google/common/base/FinalizableReferenceQueue.java
+++ b/android/guava/src/com/google/common/base/FinalizableReferenceQueue.java
@@ -27,7 +27,7 @@
 import java.net.URLClassLoader;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A reference queue with an associated background thread that dequeues references and invokes
@@ -37,7 +37,7 @@
  * finalized. If this object is garbage collected earlier, the backing thread will not invoke {@code
  * finalizeReferent()} on the remaining references.
  *
- * <p>As an example of how this is used, imagine you have a class {@code MyServer} that creates a a
+ * <p>As an example of how this is used, imagine you have a class {@code MyServer} that creates a
  * {@link java.net.ServerSocket ServerSocket}, and you would like to ensure that the {@code
  * ServerSocket} is closed even if the {@code MyServer} object is garbage-collected without calling
  * its {@code close} method. You <em>could</em> use a finalizer to accomplish this, but that has a
@@ -89,6 +89,7 @@
  * @since 2.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public class FinalizableReferenceQueue implements Closeable {
   /*
    * The Finalizer thread keeps a phantom reference to this object. When the client (for example, a
@@ -228,7 +229,7 @@
      *
      * @throws SecurityException if we don't have the appropriate privileges
      */
-    @NullableDecl
+    @CheckForNull
     Class<?> loadFinalizer();
   }
 
@@ -242,7 +243,7 @@
     @VisibleForTesting static boolean disabled;
 
     @Override
-    @NullableDecl
+    @CheckForNull
     public Class<?> loadFinalizer() {
       if (disabled) {
         return null;
@@ -280,7 +281,7 @@
             + "issue, or move Guava to your system class path.";
 
     @Override
-    @NullableDecl
+    @CheckForNull
     public Class<?> loadFinalizer() {
       try {
         /*
diff --git a/android/guava/src/com/google/common/base/FinalizableSoftReference.java b/android/guava/src/com/google/common/base/FinalizableSoftReference.java
index 45ecc65..c0e9b6b 100644
--- a/android/guava/src/com/google/common/base/FinalizableSoftReference.java
+++ b/android/guava/src/com/google/common/base/FinalizableSoftReference.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.lang.ref.ReferenceQueue;
 import java.lang.ref.SoftReference;
+import javax.annotation.CheckForNull;
 
 /**
  * Soft reference with a {@code finalizeReferent()} method which a background thread invokes after
@@ -27,6 +28,7 @@
  * @since 2.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class FinalizableSoftReference<T> extends SoftReference<T>
     implements FinalizableReference {
   /**
@@ -35,7 +37,7 @@
    * @param referent to softly reference
    * @param queue that should finalize the referent
    */
-  protected FinalizableSoftReference(T referent, FinalizableReferenceQueue queue) {
+  protected FinalizableSoftReference(@CheckForNull T referent, FinalizableReferenceQueue queue) {
     super(referent, queue.queue);
     queue.cleanUp();
   }
diff --git a/android/guava/src/com/google/common/base/FinalizableWeakReference.java b/android/guava/src/com/google/common/base/FinalizableWeakReference.java
index fb3b09b..9cca92e 100644
--- a/android/guava/src/com/google/common/base/FinalizableWeakReference.java
+++ b/android/guava/src/com/google/common/base/FinalizableWeakReference.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.lang.ref.ReferenceQueue;
 import java.lang.ref.WeakReference;
+import javax.annotation.CheckForNull;
 
 /**
  * Weak reference with a {@code finalizeReferent()} method which a background thread invokes after
@@ -27,6 +28,7 @@
  * @since 2.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class FinalizableWeakReference<T> extends WeakReference<T>
     implements FinalizableReference {
   /**
@@ -35,7 +37,7 @@
    * @param referent to weakly reference
    * @param queue that should finalize the referent
    */
-  protected FinalizableWeakReference(T referent, FinalizableReferenceQueue queue) {
+  protected FinalizableWeakReference(@CheckForNull T referent, FinalizableReferenceQueue queue) {
     super(referent, queue.queue);
     queue.cleanUp();
   }
diff --git a/android/guava/src/com/google/common/base/Function.java b/android/guava/src/com/google/common/base/Function.java
index 0583186..7d633af 100644
--- a/android/guava/src/com/google/common/base/Function.java
+++ b/android/guava/src/com/google/common/base/Function.java
@@ -16,7 +16,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Determines an output value based on an input value; a pre-Java-8 version of {@link
@@ -44,7 +45,8 @@
  * @since 2.0
  */
 @GwtCompatible
-public interface Function<F, T> {
+@ElementTypesAreNonnullByDefault
+public interface Function<F extends @Nullable Object, T extends @Nullable Object> {
   /**
    * Returns the result of applying this function to {@code input}. This method is <i>generally
    * expected</i>, but not absolutely required, to have the following properties:
@@ -60,8 +62,8 @@
    *     arguments
    */
   @CanIgnoreReturnValue // TODO(kevinb): remove this
-  @NullableDecl
-  T apply(@NullableDecl F input);
+  @ParametricNullness
+  T apply(@ParametricNullness F input);
 
   /**
    * <i>May</i> return {@code true} if {@code object} is a {@code Function} that behaves identically
@@ -75,5 +77,5 @@
    * disappear. It is best not to depend on it.
    */
   @Override
-  boolean equals(@NullableDecl Object object);
+  boolean equals(@CheckForNull Object object);
 }
diff --git a/android/guava/src/com/google/common/base/FunctionalEquivalence.java b/android/guava/src/com/google/common/base/FunctionalEquivalence.java
index 17dd400..8bb67be 100644
--- a/android/guava/src/com/google/common/base/FunctionalEquivalence.java
+++ b/android/guava/src/com/google/common/base/FunctionalEquivalence.java
@@ -19,7 +19,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Equivalence applied on functional result.
@@ -29,14 +29,16 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class FunctionalEquivalence<F, T> extends Equivalence<F> implements Serializable {
 
   private static final long serialVersionUID = 0;
 
-  private final Function<F, ? extends T> function;
+  private final Function<? super F, ? extends T> function;
   private final Equivalence<T> resultEquivalence;
 
-  FunctionalEquivalence(Function<F, ? extends T> function, Equivalence<T> resultEquivalence) {
+  FunctionalEquivalence(
+      Function<? super F, ? extends T> function, Equivalence<T> resultEquivalence) {
     this.function = checkNotNull(function);
     this.resultEquivalence = checkNotNull(resultEquivalence);
   }
@@ -52,7 +54,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/base/Functions.java b/android/guava/src/com/google/common/base/Functions.java
index 805f15c..5337d0e 100644
--- a/android/guava/src/com/google/common/base/Functions.java
+++ b/android/guava/src/com/google/common/base/Functions.java
@@ -14,13 +14,15 @@
 
 package com.google.common.base;
 
+import static com.google.common.base.NullnessCasts.uncheckedCastNullableTToT;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to {@code com.google.common.base.Function} instances; see that
@@ -36,6 +38,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Functions {
   private Functions() {}
 
@@ -79,17 +82,17 @@
   /** Returns the identity function. */
   // implementation is "fully variant"; E has become a "pass-through" type
   @SuppressWarnings("unchecked")
-  public static <E> Function<E, E> identity() {
+  public static <E extends @Nullable Object> Function<E, E> identity() {
     return (Function<E, E>) IdentityFunction.INSTANCE;
   }
 
   // enum singleton pattern
-  private enum IdentityFunction implements Function<Object, Object> {
+  private enum IdentityFunction implements Function<@Nullable Object, @Nullable Object> {
     INSTANCE;
 
     @Override
-    @NullableDecl
-    public Object apply(@NullableDecl Object o) {
+    @CheckForNull
+    public Object apply(@CheckForNull Object o) {
       return o;
     }
 
@@ -112,7 +115,8 @@
    * key (instead of an exception being thrown), you can use the method reference {@code map::get}
    * instead.
    */
-  public static <K, V> Function<K, V> forMap(Map<K, V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Function<K, V> forMap(
+      Map<K, V> map) {
     return new FunctionForMapNoDefault<>(map);
   }
 
@@ -129,12 +133,14 @@
    * @return function that returns {@code map.get(a)} when {@code a} is a key, or {@code
    *     defaultValue} otherwise
    */
-  public static <K, V> Function<K, V> forMap(
-      Map<K, ? extends V> map, @NullableDecl V defaultValue) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Function<K, V> forMap(
+      Map<K, ? extends V> map, @ParametricNullness V defaultValue) {
     return new ForMapWithDefault<>(map, defaultValue);
   }
 
-  private static class FunctionForMapNoDefault<K, V> implements Function<K, V>, Serializable {
+  private static class FunctionForMapNoDefault<
+          K extends @Nullable Object, V extends @Nullable Object>
+      implements Function<K, V>, Serializable {
     final Map<K, V> map;
 
     FunctionForMapNoDefault(Map<K, V> map) {
@@ -142,14 +148,16 @@
     }
 
     @Override
-    public V apply(@NullableDecl K key) {
+    @ParametricNullness
+    public V apply(@ParametricNullness K key) {
       V result = map.get(key);
       checkArgument(result != null || map.containsKey(key), "Key '%s' not present in map", key);
-      return result;
+      // The unchecked cast is safe because of the containsKey check.
+      return uncheckedCastNullableTToT(result);
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof FunctionForMapNoDefault) {
         FunctionForMapNoDefault<?, ?> that = (FunctionForMapNoDefault<?, ?>) o;
         return map.equals(that.map);
@@ -170,23 +178,28 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static class ForMapWithDefault<K, V> implements Function<K, V>, Serializable {
+  private static class ForMapWithDefault<K extends @Nullable Object, V extends @Nullable Object>
+      implements Function<K, V>, Serializable {
     final Map<K, ? extends V> map;
-    @NullableDecl final V defaultValue;
+    @ParametricNullness final V defaultValue;
 
-    ForMapWithDefault(Map<K, ? extends V> map, @NullableDecl V defaultValue) {
+    ForMapWithDefault(Map<K, ? extends V> map, @ParametricNullness V defaultValue) {
       this.map = checkNotNull(map);
       this.defaultValue = defaultValue;
     }
 
     @Override
-    public V apply(@NullableDecl K key) {
+    @ParametricNullness
+    public V apply(@ParametricNullness K key) {
       V result = map.get(key);
-      return (result != null || map.containsKey(key)) ? result : defaultValue;
+      // The unchecked cast is safe because of the containsKey check.
+      return (result != null || map.containsKey(key))
+          ? uncheckedCastNullableTToT(result)
+          : defaultValue;
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof ForMapWithDefault) {
         ForMapWithDefault<?, ?> that = (ForMapWithDefault<?, ?>) o;
         return map.equals(that.map) && Objects.equal(defaultValue, that.defaultValue);
@@ -220,11 +233,14 @@
    * @return the composition of {@code f} and {@code g}
    * @see <a href="//en.wikipedia.org/wiki/Function_composition">function composition</a>
    */
-  public static <A, B, C> Function<A, C> compose(Function<B, C> g, Function<A, ? extends B> f) {
+  public static <A extends @Nullable Object, B extends @Nullable Object, C extends @Nullable Object>
+      Function<A, C> compose(Function<B, C> g, Function<A, ? extends B> f) {
     return new FunctionComposition<>(g, f);
   }
 
-  private static class FunctionComposition<A, B, C> implements Function<A, C>, Serializable {
+  private static class FunctionComposition<
+          A extends @Nullable Object, B extends @Nullable Object, C extends @Nullable Object>
+      implements Function<A, C>, Serializable {
     private final Function<B, C> g;
     private final Function<A, ? extends B> f;
 
@@ -234,12 +250,13 @@
     }
 
     @Override
-    public C apply(@NullableDecl A a) {
+    @ParametricNullness
+    public C apply(@ParametricNullness A a) {
       return g.apply(f.apply(a));
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof FunctionComposition) {
         FunctionComposition<?, ?, ?> that = (FunctionComposition<?, ?, ?>) obj;
         return f.equals(that.f) && g.equals(that.g);
@@ -269,12 +286,14 @@
    *
    * <p><b>Java 8 users:</b> use the method reference {@code predicate::test} instead.
    */
-  public static <T> Function<T, Boolean> forPredicate(Predicate<T> predicate) {
+  public static <T extends @Nullable Object> Function<T, Boolean> forPredicate(
+      Predicate<T> predicate) {
     return new PredicateFunction<T>(predicate);
   }
 
   /** @see Functions#forPredicate */
-  private static class PredicateFunction<T> implements Function<T, Boolean>, Serializable {
+  private static class PredicateFunction<T extends @Nullable Object>
+      implements Function<T, Boolean>, Serializable {
     private final Predicate<T> predicate;
 
     private PredicateFunction(Predicate<T> predicate) {
@@ -282,12 +301,12 @@
     }
 
     @Override
-    public Boolean apply(@NullableDecl T t) {
+    public Boolean apply(@ParametricNullness T t) {
       return predicate.apply(t);
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof PredicateFunction) {
         PredicateFunction<?> that = (PredicateFunction<?>) obj;
         return predicate.equals(that.predicate);
@@ -316,24 +335,27 @@
    * @param value the constant value for the function to return
    * @return a function that always returns {@code value}
    */
-  public static <E> Function<Object, E> constant(@NullableDecl E value) {
-    return new ConstantFunction<E>(value);
+  public static <E extends @Nullable Object> Function<@Nullable Object, E> constant(
+      @ParametricNullness E value) {
+    return new ConstantFunction<>(value);
   }
 
-  private static class ConstantFunction<E> implements Function<Object, E>, Serializable {
-    @NullableDecl private final E value;
+  private static class ConstantFunction<E extends @Nullable Object>
+      implements Function<@Nullable Object, E>, Serializable {
+    @ParametricNullness private final E value;
 
-    public ConstantFunction(@NullableDecl E value) {
+    public ConstantFunction(@ParametricNullness E value) {
       this.value = value;
     }
 
     @Override
-    public E apply(@NullableDecl Object from) {
+    @ParametricNullness
+    public E apply(@CheckForNull Object from) {
       return value;
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof ConstantFunction) {
         ConstantFunction<?> that = (ConstantFunction<?>) obj;
         return Objects.equal(value, that.value);
@@ -361,12 +383,14 @@
    *
    * @since 10.0
    */
-  public static <T> Function<Object, T> forSupplier(Supplier<T> supplier) {
-    return new SupplierFunction<T>(supplier);
+  public static <F extends @Nullable Object, T extends @Nullable Object> Function<F, T> forSupplier(
+      Supplier<T> supplier) {
+    return new SupplierFunction<>(supplier);
   }
 
   /** @see Functions#forSupplier */
-  private static class SupplierFunction<T> implements Function<Object, T>, Serializable {
+  private static class SupplierFunction<F extends @Nullable Object, T extends @Nullable Object>
+      implements Function<F, T>, Serializable {
 
     private final Supplier<T> supplier;
 
@@ -375,14 +399,15 @@
     }
 
     @Override
-    public T apply(@NullableDecl Object input) {
+    @ParametricNullness
+    public T apply(@ParametricNullness F input) {
       return supplier.get();
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof SupplierFunction) {
-        SupplierFunction<?> that = (SupplierFunction<?>) obj;
+        SupplierFunction<?, ?> that = (SupplierFunction<?, ?>) obj;
         return this.supplier.equals(that.supplier);
       }
       return false;
diff --git a/android/guava/src/com/google/common/base/Java8Compatibility.java b/android/guava/src/com/google/common/base/Java8Compatibility.java
new file mode 100644
index 0000000..edc8b73
--- /dev/null
+++ b/android/guava/src/com/google/common/base/Java8Compatibility.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2020 The Guava Authors
+ *
+ * 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 com.google.common.base;
+
+import com.google.common.annotations.GwtIncompatible;
+import java.nio.Buffer;
+
+/**
+ * Wrappers around {@link Buffer} methods that are covariantly overridden in Java 9+. See
+ * https://github.com/google/guava/issues/3990
+ */
+@GwtIncompatible
+@ElementTypesAreNonnullByDefault
+final class Java8Compatibility {
+  static void clear(Buffer b) {
+    b.clear();
+  }
+
+  static void flip(Buffer b) {
+    b.flip();
+  }
+
+  static void limit(Buffer b, int limit) {
+    b.limit(limit);
+  }
+
+  static void position(Buffer b, int position) {
+    b.position(position);
+  }
+
+  private Java8Compatibility() {}
+}
diff --git a/android/guava/src/com/google/common/base/JdkPattern.java b/android/guava/src/com/google/common/base/JdkPattern.java
index f7791db..4788398 100644
--- a/android/guava/src/com/google/common/base/JdkPattern.java
+++ b/android/guava/src/com/google/common/base/JdkPattern.java
@@ -20,6 +20,7 @@
 import java.util.regex.Pattern;
 
 /** A regex pattern implementation which is backed by the {@link Pattern}. */
+@ElementTypesAreNonnullByDefault
 @GwtIncompatible
 final class JdkPattern extends CommonPattern implements Serializable {
   private final Pattern pattern;
diff --git a/android/guava/src/com/google/common/base/Joiner.java b/android/guava/src/com/google/common/base/Joiner.java
index f74f02f..0f3d6e4 100644
--- a/android/guava/src/com/google/common/base/Joiner.java
+++ b/android/guava/src/com/google/common/base/Joiner.java
@@ -15,6 +15,7 @@
 package com.google.common.base;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -25,7 +26,8 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An object which joins pieces of text (specified as an array, {@link Iterable}, varargs or even a
@@ -63,6 +65,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class Joiner {
   /** Returns a joiner which automatically places {@code separator} between consecutive elements. */
   public static Joiner on(String separator) {
@@ -84,12 +87,19 @@
     this.separator = prototype.separator;
   }
 
+  /*
+   * In this file, we use <? extends @Nullable Object> instead of <?> to work around a Kotlin bug
+   * (see b/189937072 until we file a bug against Kotlin itself). (The two should be equivalent, so
+   * we normally prefer the shorter one.)
+   */
+
   /**
    * Appends the string representation of each of {@code parts}, using the previously configured
    * separator between each, to {@code appendable}.
    */
   @CanIgnoreReturnValue
-  public <A extends Appendable> A appendTo(A appendable, Iterable<?> parts) throws IOException {
+  public <A extends Appendable> A appendTo(A appendable, Iterable<? extends @Nullable Object> parts)
+      throws IOException {
     return appendTo(appendable, parts.iterator());
   }
 
@@ -100,7 +110,8 @@
    * @since 11.0
    */
   @CanIgnoreReturnValue
-  public <A extends Appendable> A appendTo(A appendable, Iterator<?> parts) throws IOException {
+  public <A extends Appendable> A appendTo(A appendable, Iterator<? extends @Nullable Object> parts)
+      throws IOException {
     checkNotNull(appendable);
     if (parts.hasNext()) {
       appendable.append(toString(parts.next()));
@@ -117,14 +128,18 @@
    * separator between each, to {@code appendable}.
    */
   @CanIgnoreReturnValue
-  public final <A extends Appendable> A appendTo(A appendable, Object[] parts) throws IOException {
+  public final <A extends Appendable> A appendTo(A appendable, @Nullable Object[] parts)
+      throws IOException {
     return appendTo(appendable, Arrays.asList(parts));
   }
 
   /** Appends to {@code appendable} the string representation of each of the remaining arguments. */
   @CanIgnoreReturnValue
   public final <A extends Appendable> A appendTo(
-      A appendable, @NullableDecl Object first, @NullableDecl Object second, Object... rest)
+      A appendable,
+      @CheckForNull Object first,
+      @CheckForNull Object second,
+      @Nullable Object... rest)
       throws IOException {
     return appendTo(appendable, iterable(first, second, rest));
   }
@@ -135,7 +150,8 @@
    * Iterable)}, except that it does not throw {@link IOException}.
    */
   @CanIgnoreReturnValue
-  public final StringBuilder appendTo(StringBuilder builder, Iterable<?> parts) {
+  public final StringBuilder appendTo(
+      StringBuilder builder, Iterable<? extends @Nullable Object> parts) {
     return appendTo(builder, parts.iterator());
   }
 
@@ -147,7 +163,8 @@
    * @since 11.0
    */
   @CanIgnoreReturnValue
-  public final StringBuilder appendTo(StringBuilder builder, Iterator<?> parts) {
+  public final StringBuilder appendTo(
+      StringBuilder builder, Iterator<? extends @Nullable Object> parts) {
     try {
       appendTo((Appendable) builder, parts);
     } catch (IOException impossible) {
@@ -162,7 +179,7 @@
    * Iterable)}, except that it does not throw {@link IOException}.
    */
   @CanIgnoreReturnValue
-  public final StringBuilder appendTo(StringBuilder builder, Object[] parts) {
+  public final StringBuilder appendTo(StringBuilder builder, @Nullable Object[] parts) {
     return appendTo(builder, Arrays.asList(parts));
   }
 
@@ -174,9 +191,9 @@
   @CanIgnoreReturnValue
   public final StringBuilder appendTo(
       StringBuilder builder,
-      @NullableDecl Object first,
-      @NullableDecl Object second,
-      Object... rest) {
+      @CheckForNull Object first,
+      @CheckForNull Object second,
+      @Nullable Object... rest) {
     return appendTo(builder, iterable(first, second, rest));
   }
 
@@ -184,7 +201,7 @@
    * Returns a string containing the string representation of each of {@code parts}, using the
    * previously configured separator between each.
    */
-  public final String join(Iterable<?> parts) {
+  public final String join(Iterable<? extends @Nullable Object> parts) {
     return join(parts.iterator());
   }
 
@@ -194,7 +211,7 @@
    *
    * @since 11.0
    */
-  public final String join(Iterator<?> parts) {
+  public final String join(Iterator<? extends @Nullable Object> parts) {
     return appendTo(new StringBuilder(), parts).toString();
   }
 
@@ -202,7 +219,7 @@
    * Returns a string containing the string representation of each of {@code parts}, using the
    * previously configured separator between each.
    */
-  public final String join(Object[] parts) {
+  public final String join(@Nullable Object[] parts) {
     return join(Arrays.asList(parts));
   }
 
@@ -211,7 +228,7 @@
    * configured separator between each.
    */
   public final String join(
-      @NullableDecl Object first, @NullableDecl Object second, Object... rest) {
+      @CheckForNull Object first, @CheckForNull Object second, @Nullable Object... rest) {
     return join(iterable(first, second, rest));
   }
 
@@ -223,7 +240,7 @@
     checkNotNull(nullText);
     return new Joiner(this) {
       @Override
-      CharSequence toString(@NullableDecl Object part) {
+      CharSequence toString(@CheckForNull Object part) {
         return (part == null) ? nullText : Joiner.this.toString(part);
       }
 
@@ -246,7 +263,8 @@
   public Joiner skipNulls() {
     return new Joiner(this) {
       @Override
-      public <A extends Appendable> A appendTo(A appendable, Iterator<?> parts) throws IOException {
+      public <A extends Appendable> A appendTo(
+          A appendable, Iterator<? extends @Nullable Object> parts) throws IOException {
         checkNotNull(appendable, "appendable");
         checkNotNull(parts, "parts");
         while (parts.hasNext()) {
@@ -452,21 +470,41 @@
     }
   }
 
-  CharSequence toString(Object part) {
-    checkNotNull(part); // checkNotNull for GWT (do not optimize).
+  CharSequence toString(@CheckForNull Object part) {
+    /*
+     * requireNonNull is not safe: Joiner.on(...).join(somethingThatContainsNull) will indeed throw.
+     * However, Joiner.on(...).useForNull(...).join(somethingThatContainsNull) *is* safe -- because
+     * it returns a subclass of Joiner that overrides this method to tolerate null inputs.
+     *
+     * Unfortunately, we don't distinguish between these two cases in our public API: Joiner.on(...)
+     * and Joiner.on(...).useForNull(...) both declare the same return type: plain Joiner. To ensure
+     * that users *can* pass null arguments to Joiner, we annotate it as if it always tolerates null
+     * inputs, rather than as if it never tolerates them.
+     *
+     * We rely on checkers to implement special cases to catch dangerous calls to join(), etc. based
+     * on what they know about the particular Joiner instances the calls are performed on.
+     *
+     * (In addition to useForNull, we also offer skipNulls. It, too, tolerates null inputs, but its
+     * tolerance is implemented differently: Its implementation avoids calling this toString(Object)
+     * method in the first place.)
+     */
+    requireNonNull(part);
     return (part instanceof CharSequence) ? (CharSequence) part : part.toString();
   }
 
-  private static Iterable<Object> iterable(
-      final Object first, final Object second, final Object[] rest) {
+  private static Iterable<@Nullable Object> iterable(
+      @CheckForNull final Object first,
+      @CheckForNull final Object second,
+      final @Nullable Object[] rest) {
     checkNotNull(rest);
-    return new AbstractList<Object>() {
+    return new AbstractList<@Nullable Object>() {
       @Override
       public int size() {
         return rest.length + 2;
       }
 
       @Override
+      @CheckForNull
       public Object get(int index) {
         switch (index) {
           case 0:
diff --git a/android/guava/src/com/google/common/base/MoreObjects.java b/android/guava/src/com/google/common/base/MoreObjects.java
index a56b2a6..da97624 100644
--- a/android/guava/src/com/google/common/base/MoreObjects.java
+++ b/android/guava/src/com/google/common/base/MoreObjects.java
@@ -18,8 +18,11 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.lang.reflect.Array;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import java.util.Collection;
+import java.util.Map;
+import javax.annotation.CheckForNull;
 
 /**
  * Helper functions that operate on any {@code Object}, and are not already provided in {@link
@@ -33,6 +36,7 @@
  * @since 18.0 (since 2.0 as {@code Objects})
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class MoreObjects {
   /**
    * Returns the first of two given parameters that is not {@code null}, if either is, or otherwise
@@ -54,7 +58,24 @@
    * @throws NullPointerException if both {@code first} and {@code second} are null
    * @since 18.0 (since 3.0 as {@code Objects.firstNonNull()}).
    */
-  public static <T> T firstNonNull(@NullableDecl T first, @NullableDecl T second) {
+  /*
+   * We annotate firstNonNull in a way that protects against NullPointerException at the cost of
+   * forbidding some reasonable calls.
+   *
+   * The more permissive signature would be to accept (@CheckForNull T first, @CheckForNull T
+   * second), since it's OK for `second` to be null as long as `first` is not also null. But we
+   * expect for that flexibility to be useful relatively rarely: The more common use case is to
+   * supply a clearly non-null default, like `firstNonNull(someString, "")`. And users who really
+   * know that `first` is guaranteed non-null when `second` is null can write the logic out
+   * longhand, including a requireNonNull call, which calls attention to the fact that the static
+   * analyzer can't prove that the operation is safe.
+   *
+   * This matches the signature we currently have for requireNonNullElse in our own checker. (And
+   * that in turn matches that method's signature under the Checker Framework.) As always, we could
+   * consider the more flexible signature if we judge it worth the risks. If we do, we would likely
+   * update both methods so that they continue to match.
+   */
+  public static <T> T firstNonNull(@CheckForNull T first, T second) {
     if (first != null) {
       return first;
     }
@@ -145,6 +166,7 @@
     private final ValueHolder holderHead = new ValueHolder();
     private ValueHolder holderTail = holderHead;
     private boolean omitNullValues = false;
+    private boolean omitEmptyValues = false;
 
     /** Use {@link MoreObjects#toStringHelper(Object)} to create an instance. */
     private ToStringHelper(String className) {
@@ -170,7 +192,7 @@
      * called, in which case this name/value pair will not be added.
      */
     @CanIgnoreReturnValue
-    public ToStringHelper add(String name, @NullableDecl Object value) {
+    public ToStringHelper add(String name, @CheckForNull Object value) {
       return addHolder(name, value);
     }
 
@@ -181,7 +203,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, boolean value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -191,7 +213,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, char value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -201,7 +223,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, double value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -211,7 +233,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, float value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -221,7 +243,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, int value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -231,7 +253,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, long value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -241,7 +263,7 @@
      * readable name.
      */
     @CanIgnoreReturnValue
-    public ToStringHelper addValue(@NullableDecl Object value) {
+    public ToStringHelper addValue(@CheckForNull Object value) {
       return addHolder(value);
     }
 
@@ -255,7 +277,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(boolean value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
     }
 
     /**
@@ -268,7 +290,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(char value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
     }
 
     /**
@@ -281,7 +303,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(double value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
     }
 
     /**
@@ -294,7 +316,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(float value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
     }
 
     /**
@@ -307,7 +329,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(int value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
     }
 
     /**
@@ -320,7 +342,23 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(long value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
+    }
+
+    private static boolean isEmpty(Object value) {
+      // Put types estimated to be most frequent first.
+      if (value instanceof CharSequence) {
+        return ((CharSequence) value).length() == 0;
+      } else if (value instanceof Collection) {
+        return ((Collection<?>) value).isEmpty();
+      } else if (value instanceof Map) {
+        return ((Map<?, ?>) value).isEmpty();
+      } else if (value instanceof Optional) {
+        return !((Optional) value).isPresent();
+      } else if (value.getClass().isArray()) {
+        return Array.getLength(value) == 0;
+      }
+      return false;
     }
 
     /**
@@ -335,13 +373,17 @@
     public String toString() {
       // create a copy to keep it consistent in case value changes
       boolean omitNullValuesSnapshot = omitNullValues;
+      boolean omitEmptyValuesSnapshot = omitEmptyValues;
       String nextSeparator = "";
       StringBuilder builder = new StringBuilder(32).append(className).append('{');
       for (ValueHolder valueHolder = holderHead.next;
           valueHolder != null;
           valueHolder = valueHolder.next) {
         Object value = valueHolder.value;
-        if (!omitNullValuesSnapshot || value != null) {
+        if (valueHolder instanceof UnconditionalValueHolder
+            || (value == null
+                ? !omitNullValuesSnapshot
+                : (!omitEmptyValuesSnapshot || !isEmpty(value)))) {
           builder.append(nextSeparator);
           nextSeparator = ", ";
 
@@ -366,24 +408,51 @@
       return valueHolder;
     }
 
-    private ToStringHelper addHolder(@NullableDecl Object value) {
+    private ToStringHelper addHolder(@CheckForNull Object value) {
       ValueHolder valueHolder = addHolder();
       valueHolder.value = value;
       return this;
     }
 
-    private ToStringHelper addHolder(String name, @NullableDecl Object value) {
+    private ToStringHelper addHolder(String name, @CheckForNull Object value) {
       ValueHolder valueHolder = addHolder();
       valueHolder.value = value;
       valueHolder.name = checkNotNull(name);
       return this;
     }
 
-    private static final class ValueHolder {
-      @NullableDecl String name;
-      @NullableDecl Object value;
-      @NullableDecl ValueHolder next;
+    private UnconditionalValueHolder addUnconditionalHolder() {
+      UnconditionalValueHolder valueHolder = new UnconditionalValueHolder();
+      holderTail = holderTail.next = valueHolder;
+      return valueHolder;
     }
+
+    private ToStringHelper addUnconditionalHolder(Object value) {
+      UnconditionalValueHolder valueHolder = addUnconditionalHolder();
+      valueHolder.value = value;
+      return this;
+    }
+
+    private ToStringHelper addUnconditionalHolder(String name, Object value) {
+      UnconditionalValueHolder valueHolder = addUnconditionalHolder();
+      valueHolder.value = value;
+      valueHolder.name = checkNotNull(name);
+      return this;
+    }
+
+    // Holder object for values that might be null and/or empty.
+    private static class ValueHolder {
+      @CheckForNull String name;
+      @CheckForNull Object value;
+      @CheckForNull ValueHolder next;
+    }
+
+    /**
+     * Holder object for values that cannot be null or empty (will be printed unconditionally). This
+     * helps to shortcut most calls to isEmpty(), which is important because the check for emptiness
+     * is relatively expensive. Use a subtype so this also doesn't need any extra storage.
+     */
+    private static final class UnconditionalValueHolder extends ValueHolder {}
   }
 
   private MoreObjects() {}
diff --git a/android/guava/src/com/google/common/base/NullnessCasts.java b/android/guava/src/com/google/common/base/NullnessCasts.java
new file mode 100644
index 0000000..1ada6bf
--- /dev/null
+++ b/android/guava/src/com/google/common/base/NullnessCasts.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.base;
+
+import com.google.common.annotations.GwtCompatible;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/** A utility method to perform unchecked casts to suppress errors produced by nullness analyses. */
+@GwtCompatible
+@ElementTypesAreNonnullByDefault
+final class NullnessCasts {
+  /**
+   * Accepts a {@code @Nullable T} and returns a plain {@code T}, without performing any check that
+   * that conversion is safe.
+   *
+   * <p>This method is intended to help with usages of type parameters that have {@linkplain
+   * ParametricNullness parametric nullness}. If a type parameter instead ranges over only non-null
+   * types (or if the type is a non-variable type, like {@code String}), then code should almost
+   * never use this method, preferring instead to call {@code requireNonNull} so as to benefit from
+   * its runtime check.
+   *
+   * <p>An example use case for this method is in implementing an {@code Iterator<T>} whose {@code
+   * next} field is lazily initialized. The type of that field would be {@code @Nullable T}, and the
+   * code would be responsible for populating a "real" {@code T} (which might still be the value
+   * {@code null}!) before returning it to callers. Depending on how the code is structured, a
+   * nullness analysis might not understand that the field has been populated. To avoid that problem
+   * without having to add {@code @SuppressWarnings}, the code can call this method.
+   *
+   * <p>Why <i>not</i> just add {@code SuppressWarnings}? The problem is that this method is
+   * typically useful for {@code return} statements. That leaves the code with two options: Either
+   * add the suppression to the whole method (which turns off checking for a large section of code),
+   * or extract a variable, and put the suppression on that. However, a local variable typically
+   * doesn't work: Because nullness analyses typically infer the nullness of local variables,
+   * there's no way to assign a {@code @Nullable T} to a field {@code T foo;} and instruct the
+   * analysis that that means "plain {@code T}" rather than the inferred type {@code @Nullable T}.
+   * (Even if supported added {@code @NonNull}, that would not help, since the problem case
+   * addressed by this method is the case in which {@code T} has parametric nullness -- and thus its
+   * value may be legitimately {@code null}.)
+   */
+  @ParametricNullness
+  @SuppressWarnings("nullness")
+  static <T extends @Nullable Object> T uncheckedCastNullableTToT(@CheckForNull T t) {
+    return t;
+  }
+
+  private NullnessCasts() {}
+}
diff --git a/android/guava/src/com/google/common/base/Objects.java b/android/guava/src/com/google/common/base/Objects.java
index 1a409a6..bd6b0d9 100644
--- a/android/guava/src/com/google/common/base/Objects.java
+++ b/android/guava/src/com/google/common/base/Objects.java
@@ -16,7 +16,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Helper functions that can operate on any {@code Object}.
@@ -29,6 +30,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Objects extends ExtraObjectsMethodsForWeb {
   private Objects() {}
 
@@ -48,7 +50,7 @@
    * <p><b>Note for Java 7 and later:</b> This method should be treated as deprecated; use {@link
    * java.util.Objects#equals} instead.
    */
-  public static boolean equal(@NullableDecl Object a, @NullableDecl Object b) {
+  public static boolean equal(@CheckForNull Object a, @CheckForNull Object b) {
     return a == b || (a != null && a.equals(b));
   }
 
@@ -73,7 +75,7 @@
    * <p><b>Note for Java 7 and later:</b> This method should be treated as deprecated; use {@link
    * java.util.Objects#hash} instead.
    */
-  public static int hashCode(@NullableDecl Object... objects) {
+  public static int hashCode(@CheckForNull @Nullable Object... objects) {
     return Arrays.hashCode(objects);
   }
 }
diff --git a/android/guava/src/com/google/common/base/Optional.java b/android/guava/src/com/google/common/base/Optional.java
index 611ba54..a7a0b3d 100644
--- a/android/guava/src/com/google/common/base/Optional.java
+++ b/android/guava/src/com/google/common/base/Optional.java
@@ -22,7 +22,7 @@
 import java.io.Serializable;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable object that may contain a non-null reference to another object. Each instance of
@@ -82,6 +82,7 @@
  */
 @DoNotMock("Use Optional.of(value) or Optional.absent()")
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 public abstract class Optional<T> implements Serializable {
   /**
    * Returns an {@code Optional} instance with no contained reference.
@@ -112,7 +113,7 @@
    * <p><b>Comparison to {@code java.util.Optional}:</b> this method is equivalent to Java 8's
    * {@code Optional.ofNullable}.
    */
-  public static <T> Optional<T> fromNullable(@NullableDecl T nullableReference) {
+  public static <T> Optional<T> fromNullable(@CheckForNull T nullableReference) {
     return (nullableReference == null) ? Optional.<T>absent() : new Present<T>(nullableReference);
   }
 
@@ -206,7 +207,7 @@
    * <p><b>Comparison to {@code java.util.Optional}:</b> this method is equivalent to Java 8's
    * {@code Optional.orElse(null)}.
    */
-  @NullableDecl
+  @CheckForNull
   public abstract T orNull();
 
   /**
@@ -255,7 +256,7 @@
    * <p><b>Comparison to {@code java.util.Optional}:</b> no differences.
    */
   @Override
-  public abstract boolean equals(@NullableDecl Object object);
+  public abstract boolean equals(@CheckForNull Object object);
 
   /**
    * Returns a hash code for this instance.
@@ -300,6 +301,7 @@
               checkNotNull(optionals.iterator());
 
           @Override
+          @CheckForNull
           protected T computeNext() {
             while (iterator.hasNext()) {
               Optional<? extends T> optional = iterator.next();
diff --git a/android/guava/src/com/google/common/base/PairwiseEquivalence.java b/android/guava/src/com/google/common/base/PairwiseEquivalence.java
index cb7d784..74be27f 100644
--- a/android/guava/src/com/google/common/base/PairwiseEquivalence.java
+++ b/android/guava/src/com/google/common/base/PairwiseEquivalence.java
@@ -17,14 +17,16 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 @GwtCompatible(serializable = true)
-final class PairwiseEquivalence<T> extends Equivalence<Iterable<T>> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class PairwiseEquivalence<E, T extends @Nullable E> extends Equivalence<Iterable<T>>
+    implements Serializable {
+  final Equivalence<E> elementEquivalence;
 
-  final Equivalence<? super T> elementEquivalence;
-
-  PairwiseEquivalence(Equivalence<? super T> elementEquivalence) {
+  PairwiseEquivalence(Equivalence<E> elementEquivalence) {
     this.elementEquivalence = Preconditions.checkNotNull(elementEquivalence);
   }
 
@@ -52,9 +54,9 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof PairwiseEquivalence) {
-      PairwiseEquivalence<?> that = (PairwiseEquivalence<?>) object;
+      PairwiseEquivalence<?, ?> that = (PairwiseEquivalence<?, ?>) object;
       return this.elementEquivalence.equals(that.elementEquivalence);
     }
 
diff --git a/android/guava/src/com/google/common/base/ParametricNullness.java b/android/guava/src/com/google/common/base/ParametricNullness.java
new file mode 100644
index 0000000..c736055
--- /dev/null
+++ b/android/guava/src/com/google/common/base/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.base;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/base/PatternCompiler.java b/android/guava/src/com/google/common/base/PatternCompiler.java
index 813a25f..72a45fa 100644
--- a/android/guava/src/com/google/common/base/PatternCompiler.java
+++ b/android/guava/src/com/google/common/base/PatternCompiler.java
@@ -22,6 +22,7 @@
  * java.util.ServiceLoader} mechanism.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 interface PatternCompiler {
   /**
    * Compiles the given pattern.
diff --git a/android/guava/src/com/google/common/base/Platform.java b/android/guava/src/com/google/common/base/Platform.java
index 26c5c29..703b860 100644
--- a/android/guava/src/com/google/common/base/Platform.java
+++ b/android/guava/src/com/google/common/base/Platform.java
@@ -21,7 +21,7 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.regex.Pattern;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Methods factored out so that they can be emulated differently in GWT.
@@ -29,6 +29,7 @@
  * @author Jesse Wilson
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class Platform {
   private static final Logger logger = Logger.getLogger(Platform.class.getName());
   private static final PatternCompiler patternCompiler = loadPatternCompiler();
@@ -54,15 +55,28 @@
     return String.format(Locale.ROOT, "%.4g", value);
   }
 
-  static boolean stringIsNullOrEmpty(@NullableDecl String string) {
+  static boolean stringIsNullOrEmpty(@CheckForNull String string) {
     return string == null || string.isEmpty();
   }
 
-  static String nullToEmpty(@NullableDecl String string) {
+  /**
+   * Returns the string if it is not null, or an empty string otherwise.
+   *
+   * @param string the string to test and possibly return
+   * @return {@code string} if it is not null; {@code ""} otherwise
+   */
+  static String nullToEmpty(@CheckForNull String string) {
     return (string == null) ? "" : string;
   }
 
-  static String emptyToNull(@NullableDecl String string) {
+  /**
+   * Returns the string if it is not empty, or a null string otherwise.
+   *
+   * @param string the string to test and possibly return
+   * @return {@code string} if it is not empty; {@code null} otherwise
+   */
+  @CheckForNull
+  static String emptyToNull(@CheckForNull String string) {
     return stringIsNullOrEmpty(string) ? null : string;
   }
 
diff --git a/android/guava/src/com/google/common/base/Preconditions.java b/android/guava/src/com/google/common/base/Preconditions.java
index 995d394..13ff77b 100644
--- a/android/guava/src/com/google/common/base/Preconditions.java
+++ b/android/guava/src/com/google/common/base/Preconditions.java
@@ -18,8 +18,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import org.checkerframework.checker.nullness.compatqual.NonNullDecl;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static convenience methods that help a method or constructor check whether it was invoked
@@ -114,9 +114,12 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Preconditions {
   private Preconditions() {}
 
+  // TODO(cpovirk): Standardize parameter names (expression vs. b, reference vs. obj).
+
   /**
    * Ensures the truth of an expression involving one or more parameters to the calling method.
    *
@@ -137,7 +140,7 @@
    *     string using {@link String#valueOf(Object)}
    * @throws IllegalArgumentException if {@code expression} is false
    */
-  public static void checkArgument(boolean expression, @NullableDecl Object errorMessage) {
+  public static void checkArgument(boolean expression, @CheckForNull Object errorMessage) {
     if (!expression) {
       throw new IllegalArgumentException(String.valueOf(errorMessage));
     }
@@ -158,8 +161,8 @@
    */
   public static void checkArgument(
       boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object... errorMessageArgs) {
+      String errorMessageTemplate,
+      @CheckForNull @Nullable Object... errorMessageArgs) {
     if (!expression) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, errorMessageArgs));
     }
@@ -172,7 +175,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkArgument(boolean b, @NullableDecl String errorMessageTemplate, char p1) {
+  public static void checkArgument(boolean b, String errorMessageTemplate, char p1) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -185,7 +188,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkArgument(boolean b, @NullableDecl String errorMessageTemplate, int p1) {
+  public static void checkArgument(boolean b, String errorMessageTemplate, int p1) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -198,7 +201,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkArgument(boolean b, @NullableDecl String errorMessageTemplate, long p1) {
+  public static void checkArgument(boolean b, String errorMessageTemplate, long p1) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -212,7 +215,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -225,8 +228,33 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, char p1, char p2) {
+  public static void checkArgument(boolean b, String errorMessageTemplate, char p1, char p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, char p1, int p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, char p1, long p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -240,7 +268,46 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, char p1, int p2) {
+      boolean b, String errorMessageTemplate, char p1, @CheckForNull Object p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, int p1, char p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, int p1, int p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, int p1, long p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -254,7 +321,46 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, char p1, long p2) {
+      boolean b, String errorMessageTemplate, int p1, @CheckForNull Object p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, long p1, char p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, long p1, int p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, long p1, long p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -268,7 +374,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, char p1, @NullableDecl Object p2) {
+      boolean b, String errorMessageTemplate, long p1, @CheckForNull Object p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -282,7 +388,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, int p1, char p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, char p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -296,7 +402,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, int p1, int p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, int p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -310,7 +416,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, int p1, long p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, long p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -324,105 +430,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, int p1, @NullableDecl Object p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, long p1, char p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, long p1, int p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, long p1, long p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, long p1, @NullableDecl Object p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, char p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, int p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, long p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, @CheckForNull Object p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -437,27 +445,10 @@
    */
   public static void checkArgument(
       boolean b,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2,
-      @NullableDecl Object p3) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2, p3));
     }
@@ -472,11 +463,11 @@
    */
   public static void checkArgument(
       boolean b,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2,
-      @NullableDecl Object p3,
-      @NullableDecl Object p4) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3,
+      @CheckForNull Object p4) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2, p3, p4));
     }
@@ -506,7 +497,7 @@
    * @throws IllegalStateException if {@code expression} is false
    * @see Verify#verify Verify.verify()
    */
-  public static void checkState(boolean expression, @NullableDecl Object errorMessage) {
+  public static void checkState(boolean expression, @CheckForNull Object errorMessage) {
     if (!expression) {
       throw new IllegalStateException(String.valueOf(errorMessage));
     }
@@ -529,8 +520,16 @@
    */
   public static void checkState(
       boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object... errorMessageArgs) {
+      /*
+       * TODO(cpovirk): Consider removing @CheckForNull here, as we've done with the other methods'
+       * errorMessageTemplate parameters: It it unlikely that callers intend for their string
+       * template to be null (though we do handle that case gracefully at runtime). I've left this
+       * one as it is because one of our users has defined a wrapper API around Preconditions,
+       * declaring a checkState method that accepts a possibly null template. So we'd need to update
+       * that user first.
+       */
+      @CheckForNull String errorMessageTemplate,
+      @CheckForNull @Nullable Object... errorMessageArgs) {
     if (!expression) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, errorMessageArgs));
     }
@@ -544,7 +543,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(boolean b, @NullableDecl String errorMessageTemplate, char p1) {
+  public static void checkState(boolean b, String errorMessageTemplate, char p1) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -558,7 +557,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(boolean b, @NullableDecl String errorMessageTemplate, int p1) {
+  public static void checkState(boolean b, String errorMessageTemplate, int p1) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -572,7 +571,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(boolean b, @NullableDecl String errorMessageTemplate, long p1) {
+  public static void checkState(boolean b, String errorMessageTemplate, long p1) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -586,8 +585,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1) {
+  public static void checkState(boolean b, String errorMessageTemplate, @CheckForNull Object p1) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -601,8 +599,35 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, char p1, char p2) {
+  public static void checkState(boolean b, String errorMessageTemplate, char p1, char p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, char p1, int p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, char p1, long p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -617,7 +642,49 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, char p1, int p2) {
+      boolean b, String errorMessageTemplate, char p1, @CheckForNull Object p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, int p1, char p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, int p1, int p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, int p1, long p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -632,7 +699,49 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, char p1, long p2) {
+      boolean b, String errorMessageTemplate, int p1, @CheckForNull Object p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, long p1, char p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, long p1, int p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, long p1, long p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -647,7 +756,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, char p1, @NullableDecl Object p2) {
+      boolean b, String errorMessageTemplate, long p1, @CheckForNull Object p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -662,7 +771,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, int p1, char p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, char p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -677,7 +786,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, int p1, int p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, int p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -692,7 +801,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, int p1, long p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, long p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -707,112 +816,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, int p1, @NullableDecl Object p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, long p1, char p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, long p1, int p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, long p1, long p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, long p1, @NullableDecl Object p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, char p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, int p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(
-      boolean b, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1, long p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, @CheckForNull Object p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -828,28 +832,10 @@
    */
   public static void checkState(
       boolean b,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(
-      boolean b,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2,
-      @NullableDecl Object p3) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2, p3));
     }
@@ -865,16 +851,30 @@
    */
   public static void checkState(
       boolean b,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2,
-      @NullableDecl Object p3,
-      @NullableDecl Object p4) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3,
+      @CheckForNull Object p4) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2, p3, p4));
     }
   }
 
+  /*
+   * Preconditions.checkNotNull is *intended* for performing eager null checks on parameters that a
+   * nullness checker can already "prove" are non-null. That means that the first parameter to
+   * checkNotNull *should* be annotated to require it to be non-null.
+   *
+   * However, for a variety of reasons, Google developers have written a ton of code over the past
+   * decade that assumes that they can use checkNotNull for non-precondition checks. I had hoped to
+   * take a principled stand on this, but the amount of such code is simply overwhelming. To avoid
+   * creating a lot of compile errors that users would not find to be informative, we're giving in
+   * and allowing callers to pass arguments that a nullness checker believes could be null.
+   *
+   * We still encourage people to use requireNonNull over checkNotNull for non-precondition checks.
+   */
+
   /**
    * Ensures that an object reference passed as a parameter to the calling method is not null.
    *
@@ -884,8 +884,7 @@
    * @see Verify#verifyNotNull Verify.verifyNotNull()
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(@NonNullDecl T reference) {
+  public static <T> T checkNotNull(@CheckForNull T reference) {
     if (reference == null) {
       throw new NullPointerException();
     }
@@ -903,9 +902,7 @@
    * @see Verify#verifyNotNull Verify.verifyNotNull()
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T reference, @NullableDecl Object errorMessage) {
+  public static <T> T checkNotNull(@CheckForNull T reference, @CheckForNull Object errorMessage) {
     if (reference == null) {
       throw new NullPointerException(String.valueOf(errorMessage));
     }
@@ -928,11 +925,10 @@
    * @see Verify#verifyNotNull Verify.verifyNotNull()
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T reference,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object... errorMessageArgs) {
+  public static <T> T checkNotNull(
+      @CheckForNull T reference,
+      String errorMessageTemplate,
+      @CheckForNull @Nullable Object... errorMessageArgs) {
     if (reference == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, errorMessageArgs));
     }
@@ -947,9 +943,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1) {
+  public static <T> T checkNotNull(@CheckForNull T obj, String errorMessageTemplate, char p1) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -964,9 +958,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1) {
+  public static <T> T checkNotNull(@CheckForNull T obj, String errorMessageTemplate, int p1) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -981,9 +973,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1) {
+  public static <T> T checkNotNull(@CheckForNull T obj, String errorMessageTemplate, long p1) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -998,9 +988,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -1015,9 +1004,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1, char p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, char p1, char p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1032,9 +1020,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1, int p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, char p1, int p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1049,9 +1036,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, char p1, long p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, char p1, long p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1066,12 +1052,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj,
-      @NullableDecl String errorMessageTemplate,
-      char p1,
-      @NullableDecl Object p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, char p1, @CheckForNull Object p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1086,9 +1068,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1, char p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, int p1, char p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1103,9 +1084,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1, int p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, int p1, int p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1120,9 +1100,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, int p1, long p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, int p1, long p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1137,12 +1116,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj,
-      @NullableDecl String errorMessageTemplate,
-      int p1,
-      @NullableDecl Object p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, int p1, @CheckForNull Object p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1157,9 +1132,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1, char p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, long p1, char p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1174,9 +1148,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1, int p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, long p1, int p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1191,9 +1164,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj, @NullableDecl String errorMessageTemplate, long p1, long p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, long p1, long p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1208,12 +1180,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj,
-      @NullableDecl String errorMessageTemplate,
-      long p1,
-      @NullableDecl Object p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, long p1, @CheckForNull Object p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1228,12 +1196,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      char p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1, char p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1248,12 +1212,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      int p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1, int p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1268,12 +1228,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      long p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1, long p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1288,12 +1244,11 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj,
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1308,13 +1263,12 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2,
-      @NullableDecl Object p3) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj,
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2, p3));
     }
@@ -1329,14 +1283,13 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  @NonNullDecl
-  public static <T extends Object> T checkNotNull(
-      @NonNullDecl T obj,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2,
-      @NullableDecl Object p3,
-      @NullableDecl Object p4) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj,
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3,
+      @CheckForNull Object p4) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2, p3, p4));
     }
@@ -1396,7 +1349,7 @@
    * @throws IllegalArgumentException if {@code size} is negative
    */
   @CanIgnoreReturnValue
-  public static int checkElementIndex(int index, int size, @NullableDecl String desc) {
+  public static int checkElementIndex(int index, int size, String desc) {
     // Carefully optimized for execution by hotspot (explanatory comment above)
     if (index < 0 || index >= size) {
       throw new IndexOutOfBoundsException(badElementIndex(index, size, desc));
@@ -1404,7 +1357,7 @@
     return index;
   }
 
-  private static String badElementIndex(int index, int size, @NullableDecl String desc) {
+  private static String badElementIndex(int index, int size, String desc) {
     if (index < 0) {
       return lenientFormat("%s (%s) must not be negative", desc, index);
     } else if (size < 0) {
@@ -1441,7 +1394,7 @@
    * @throws IllegalArgumentException if {@code size} is negative
    */
   @CanIgnoreReturnValue
-  public static int checkPositionIndex(int index, int size, @NullableDecl String desc) {
+  public static int checkPositionIndex(int index, int size, String desc) {
     // Carefully optimized for execution by hotspot (explanatory comment above)
     if (index < 0 || index > size) {
       throw new IndexOutOfBoundsException(badPositionIndex(index, size, desc));
@@ -1449,7 +1402,7 @@
     return index;
   }
 
-  private static String badPositionIndex(int index, int size, @NullableDecl String desc) {
+  private static String badPositionIndex(int index, int size, String desc) {
     if (index < 0) {
       return lenientFormat("%s (%s) must not be negative", desc, index);
     } else if (size < 0) {
diff --git a/android/guava/src/com/google/common/base/Predicate.java b/android/guava/src/com/google/common/base/Predicate.java
index e062725..35d57a6 100644
--- a/android/guava/src/com/google/common/base/Predicate.java
+++ b/android/guava/src/com/google/common/base/Predicate.java
@@ -16,7 +16,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Determines a true or false value for a given input; a pre-Java-8 version of {@link
@@ -45,7 +46,8 @@
  * @since 2.0
  */
 @GwtCompatible
-public interface Predicate<T> {
+@ElementTypesAreNonnullByDefault
+public interface Predicate<T extends @Nullable Object> {
   /**
    * Returns the result of applying this predicate to {@code input} (Java 8 users, see notes in the
    * class documentation above). This method is <i>generally expected</i>, but not absolutely
@@ -62,7 +64,7 @@
    *     arguments
    */
   @CanIgnoreReturnValue
-  boolean apply(@NullableDecl T input);
+  boolean apply(@ParametricNullness T input);
 
   /**
    * Indicates whether another object is equal to this predicate.
@@ -75,5 +77,5 @@
    * predicates are known <i>not</i> to be interchangeable.
    */
   @Override
-  boolean equals(@NullableDecl Object object);
+  boolean equals(@CheckForNull Object object);
 }
diff --git a/android/guava/src/com/google/common/base/Predicates.java b/android/guava/src/com/google/common/base/Predicates.java
index 9c8f1e5..c3b5562 100644
--- a/android/guava/src/com/google/common/base/Predicates.java
+++ b/android/guava/src/com/google/common/base/Predicates.java
@@ -25,7 +25,8 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.regex.Pattern;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to {@code Predicate} instances.
@@ -39,6 +40,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Predicates {
   private Predicates() {}
 
@@ -47,13 +49,13 @@
 
   /** Returns a predicate that always evaluates to {@code true}. */
   @GwtCompatible(serializable = true)
-  public static <T> Predicate<T> alwaysTrue() {
+  public static <T extends @Nullable Object> Predicate<T> alwaysTrue() {
     return ObjectPredicate.ALWAYS_TRUE.withNarrowedType();
   }
 
   /** Returns a predicate that always evaluates to {@code false}. */
   @GwtCompatible(serializable = true)
-  public static <T> Predicate<T> alwaysFalse() {
+  public static <T extends @Nullable Object> Predicate<T> alwaysFalse() {
     return ObjectPredicate.ALWAYS_FALSE.withNarrowedType();
   }
 
@@ -62,7 +64,7 @@
    * null.
    */
   @GwtCompatible(serializable = true)
-  public static <T> Predicate<T> isNull() {
+  public static <T extends @Nullable Object> Predicate<T> isNull() {
     return ObjectPredicate.IS_NULL.withNarrowedType();
   }
 
@@ -71,7 +73,7 @@
    * null.
    */
   @GwtCompatible(serializable = true)
-  public static <T> Predicate<T> notNull() {
+  public static <T extends @Nullable Object> Predicate<T> notNull() {
     return ObjectPredicate.NOT_NULL.withNarrowedType();
   }
 
@@ -79,7 +81,7 @@
    * Returns a predicate that evaluates to {@code true} if the given predicate evaluates to {@code
    * false}.
    */
-  public static <T> Predicate<T> not(Predicate<T> predicate) {
+  public static <T extends @Nullable Object> Predicate<T> not(Predicate<T> predicate) {
     return new NotPredicate<T>(predicate);
   }
 
@@ -90,7 +92,8 @@
    * changes to it won't alter the behavior of this predicate. If {@code components} is empty, the
    * returned predicate will always evaluate to {@code true}.
    */
-  public static <T> Predicate<T> and(Iterable<? extends Predicate<? super T>> components) {
+  public static <T extends @Nullable Object> Predicate<T> and(
+      Iterable<? extends Predicate<? super T>> components) {
     return new AndPredicate<T>(defensiveCopy(components));
   }
 
@@ -102,7 +105,7 @@
    * returned predicate will always evaluate to {@code true}.
    */
   @SafeVarargs
-  public static <T> Predicate<T> and(Predicate<? super T>... components) {
+  public static <T extends @Nullable Object> Predicate<T> and(Predicate<? super T>... components) {
     return new AndPredicate<T>(defensiveCopy(components));
   }
 
@@ -111,7 +114,8 @@
    * true}. The components are evaluated in order, and evaluation will be "short-circuited" as soon
    * as a false predicate is found.
    */
-  public static <T> Predicate<T> and(Predicate<? super T> first, Predicate<? super T> second) {
+  public static <T extends @Nullable Object> Predicate<T> and(
+      Predicate<? super T> first, Predicate<? super T> second) {
     return new AndPredicate<T>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
   }
 
@@ -122,7 +126,8 @@
    * changes to it won't alter the behavior of this predicate. If {@code components} is empty, the
    * returned predicate will always evaluate to {@code false}.
    */
-  public static <T> Predicate<T> or(Iterable<? extends Predicate<? super T>> components) {
+  public static <T extends @Nullable Object> Predicate<T> or(
+      Iterable<? extends Predicate<? super T>> components) {
     return new OrPredicate<T>(defensiveCopy(components));
   }
 
@@ -134,7 +139,7 @@
    * returned predicate will always evaluate to {@code false}.
    */
   @SafeVarargs
-  public static <T> Predicate<T> or(Predicate<? super T>... components) {
+  public static <T extends @Nullable Object> Predicate<T> or(Predicate<? super T>... components) {
     return new OrPredicate<T>(defensiveCopy(components));
   }
 
@@ -143,7 +148,8 @@
    * {@code true}. The components are evaluated in order, and evaluation will be "short-circuited"
    * as soon as a true predicate is found.
    */
-  public static <T> Predicate<T> or(Predicate<? super T> first, Predicate<? super T> second) {
+  public static <T extends @Nullable Object> Predicate<T> or(
+      Predicate<? super T> first, Predicate<? super T> second) {
     return new OrPredicate<T>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
   }
 
@@ -151,8 +157,10 @@
    * Returns a predicate that evaluates to {@code true} if the object being tested {@code equals()}
    * the given target or both are null.
    */
-  public static <T> Predicate<T> equalTo(@NullableDecl T target) {
-    return (target == null) ? Predicates.<T>isNull() : new IsEqualToPredicate<T>(target);
+  public static <T extends @Nullable Object> Predicate<T> equalTo(@ParametricNullness T target) {
+    return (target == null)
+        ? Predicates.<T>isNull()
+        : new IsEqualToPredicate(target).withNarrowedType();
   }
 
   /**
@@ -169,8 +177,8 @@
    * instances {@code Lists.newArrayList(1)} and {@code Arrays.asList(1)}.
    */
   @GwtIncompatible // Class.isInstance
-  public static Predicate<Object> instanceOf(Class<?> clazz) {
-    return new InstanceOfPredicate(clazz);
+  public static <T extends @Nullable Object> Predicate<T> instanceOf(Class<?> clazz) {
+    return new InstanceOfPredicate<>(clazz);
   }
 
   /**
@@ -204,7 +212,7 @@
    *
    * @param target the collection that may contain the function input
    */
-  public static <T> Predicate<T> in(Collection<? extends T> target) {
+  public static <T extends @Nullable Object> Predicate<T> in(Collection<? extends T> target) {
     return new InPredicate<T>(target);
   }
 
@@ -214,7 +222,7 @@
    *
    * @return the composition of the provided function and predicate
    */
-  public static <A, B> Predicate<A> compose(
+  public static <A extends @Nullable Object, B extends @Nullable Object> Predicate<A> compose(
       Predicate<B> predicate, Function<A, ? extends B> function) {
     return new CompositionPredicate<>(predicate, function);
   }
@@ -247,11 +255,11 @@
   // End public API, begin private implementation classes.
 
   // Package private for GWT serialization.
-  enum ObjectPredicate implements Predicate<Object> {
+  enum ObjectPredicate implements Predicate<@Nullable Object> {
     /** @see Predicates#alwaysTrue() */
     ALWAYS_TRUE {
       @Override
-      public boolean apply(@NullableDecl Object o) {
+      public boolean apply(@CheckForNull Object o) {
         return true;
       }
 
@@ -263,7 +271,7 @@
     /** @see Predicates#alwaysFalse() */
     ALWAYS_FALSE {
       @Override
-      public boolean apply(@NullableDecl Object o) {
+      public boolean apply(@CheckForNull Object o) {
         return false;
       }
 
@@ -275,7 +283,7 @@
     /** @see Predicates#isNull() */
     IS_NULL {
       @Override
-      public boolean apply(@NullableDecl Object o) {
+      public boolean apply(@CheckForNull Object o) {
         return o == null;
       }
 
@@ -287,7 +295,7 @@
     /** @see Predicates#notNull() */
     NOT_NULL {
       @Override
-      public boolean apply(@NullableDecl Object o) {
+      public boolean apply(@CheckForNull Object o) {
         return o != null;
       }
 
@@ -298,13 +306,14 @@
     };
 
     @SuppressWarnings("unchecked") // safe contravariant cast
-    <T> Predicate<T> withNarrowedType() {
+    <T extends @Nullable Object> Predicate<T> withNarrowedType() {
       return (Predicate<T>) this;
     }
   }
 
   /** @see Predicates#not(Predicate) */
-  private static class NotPredicate<T> implements Predicate<T>, Serializable {
+  private static class NotPredicate<T extends @Nullable Object>
+      implements Predicate<T>, Serializable {
     final Predicate<T> predicate;
 
     NotPredicate(Predicate<T> predicate) {
@@ -312,7 +321,7 @@
     }
 
     @Override
-    public boolean apply(@NullableDecl T t) {
+    public boolean apply(@ParametricNullness T t) {
       return !predicate.apply(t);
     }
 
@@ -322,7 +331,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof NotPredicate) {
         NotPredicate<?> that = (NotPredicate<?>) obj;
         return predicate.equals(that.predicate);
@@ -339,7 +348,8 @@
   }
 
   /** @see Predicates#and(Iterable) */
-  private static class AndPredicate<T> implements Predicate<T>, Serializable {
+  private static class AndPredicate<T extends @Nullable Object>
+      implements Predicate<T>, Serializable {
     private final List<? extends Predicate<? super T>> components;
 
     private AndPredicate(List<? extends Predicate<? super T>> components) {
@@ -347,7 +357,7 @@
     }
 
     @Override
-    public boolean apply(@NullableDecl T t) {
+    public boolean apply(@ParametricNullness T t) {
       // Avoid using the Iterator to avoid generating garbage (issue 820).
       for (int i = 0; i < components.size(); i++) {
         if (!components.get(i).apply(t)) {
@@ -364,7 +374,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof AndPredicate) {
         AndPredicate<?> that = (AndPredicate<?>) obj;
         return components.equals(that.components);
@@ -381,7 +391,8 @@
   }
 
   /** @see Predicates#or(Iterable) */
-  private static class OrPredicate<T> implements Predicate<T>, Serializable {
+  private static class OrPredicate<T extends @Nullable Object>
+      implements Predicate<T>, Serializable {
     private final List<? extends Predicate<? super T>> components;
 
     private OrPredicate(List<? extends Predicate<? super T>> components) {
@@ -389,7 +400,7 @@
     }
 
     @Override
-    public boolean apply(@NullableDecl T t) {
+    public boolean apply(@ParametricNullness T t) {
       // Avoid using the Iterator to avoid generating garbage (issue 820).
       for (int i = 0; i < components.size(); i++) {
         if (components.get(i).apply(t)) {
@@ -406,7 +417,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof OrPredicate) {
         OrPredicate<?> that = (OrPredicate<?>) obj;
         return components.equals(that.components);
@@ -436,16 +447,16 @@
   }
 
   /** @see Predicates#equalTo(Object) */
-  private static class IsEqualToPredicate<T> implements Predicate<T>, Serializable {
-    private final T target;
+  private static class IsEqualToPredicate implements Predicate<@Nullable Object>, Serializable {
+    private final Object target;
 
-    private IsEqualToPredicate(T target) {
+    private IsEqualToPredicate(Object target) {
       this.target = target;
     }
 
     @Override
-    public boolean apply(T t) {
-      return target.equals(t);
+    public boolean apply(@CheckForNull Object o) {
+      return target.equals(o);
     }
 
     @Override
@@ -454,9 +465,9 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof IsEqualToPredicate) {
-        IsEqualToPredicate<?> that = (IsEqualToPredicate<?>) obj;
+        IsEqualToPredicate that = (IsEqualToPredicate) obj;
         return target.equals(that.target);
       }
       return false;
@@ -468,11 +479,17 @@
     }
 
     private static final long serialVersionUID = 0;
+
+    @SuppressWarnings("unchecked") // safe contravariant cast
+    <T extends @Nullable Object> Predicate<T> withNarrowedType() {
+      return (Predicate<T>) this;
+    }
   }
 
   /** @see Predicates#instanceOf(Class) */
   @GwtIncompatible // Class.isInstance
-  private static class InstanceOfPredicate implements Predicate<Object>, Serializable {
+  private static class InstanceOfPredicate<T extends @Nullable Object>
+      implements Predicate<T>, Serializable {
     private final Class<?> clazz;
 
     private InstanceOfPredicate(Class<?> clazz) {
@@ -480,7 +497,7 @@
     }
 
     @Override
-    public boolean apply(@NullableDecl Object o) {
+    public boolean apply(@ParametricNullness T o) {
       return clazz.isInstance(o);
     }
 
@@ -490,9 +507,9 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof InstanceOfPredicate) {
-        InstanceOfPredicate that = (InstanceOfPredicate) obj;
+        InstanceOfPredicate<?> that = (InstanceOfPredicate<?>) obj;
         return clazz == that.clazz;
       }
       return false;
@@ -526,7 +543,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof SubtypeOfPredicate) {
         SubtypeOfPredicate that = (SubtypeOfPredicate) obj;
         return clazz == that.clazz;
@@ -543,7 +560,8 @@
   }
 
   /** @see Predicates#in(Collection) */
-  private static class InPredicate<T> implements Predicate<T>, Serializable {
+  private static class InPredicate<T extends @Nullable Object>
+      implements Predicate<T>, Serializable {
     private final Collection<?> target;
 
     private InPredicate(Collection<?> target) {
@@ -551,7 +569,7 @@
     }
 
     @Override
-    public boolean apply(@NullableDecl T t) {
+    public boolean apply(@ParametricNullness T t) {
       try {
         return target.contains(t);
       } catch (NullPointerException | ClassCastException e) {
@@ -560,7 +578,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof InPredicate) {
         InPredicate<?> that = (InPredicate<?>) obj;
         return target.equals(that.target);
@@ -582,7 +600,8 @@
   }
 
   /** @see Predicates#compose(Predicate, Function) */
-  private static class CompositionPredicate<A, B> implements Predicate<A>, Serializable {
+  private static class CompositionPredicate<A extends @Nullable Object, B extends @Nullable Object>
+      implements Predicate<A>, Serializable {
     final Predicate<B> p;
     final Function<A, ? extends B> f;
 
@@ -592,12 +611,12 @@
     }
 
     @Override
-    public boolean apply(@NullableDecl A a) {
+    public boolean apply(@ParametricNullness A a) {
       return p.apply(f.apply(a));
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof CompositionPredicate) {
         CompositionPredicate<?, ?> that = (CompositionPredicate<?, ?>) obj;
         return f.equals(that.f) && p.equals(that.p);
@@ -642,7 +661,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof ContainsPatternPredicate) {
         ContainsPatternPredicate that = (ContainsPatternPredicate) obj;
 
@@ -683,7 +702,7 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static <T> List<Predicate<? super T>> asList(
+  private static <T extends @Nullable Object> List<Predicate<? super T>> asList(
       Predicate<? super T> first, Predicate<? super T> second) {
     // TODO(kevinb): understand why we still get a warning despite @SafeVarargs!
     return Arrays.<Predicate<? super T>>asList(first, second);
diff --git a/android/guava/src/com/google/common/base/Present.java b/android/guava/src/com/google/common/base/Present.java
index d33eb8e..59efebc 100644
--- a/android/guava/src/com/google/common/base/Present.java
+++ b/android/guava/src/com/google/common/base/Present.java
@@ -19,10 +19,11 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Collections;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /** Implementation of an {@link Optional} containing a reference. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class Present<T> extends Optional<T> {
   private final T reference;
 
@@ -77,7 +78,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Present) {
       Present<?> other = (Present<?>) object;
       return reference.equals(other.reference);
diff --git a/android/guava/src/com/google/common/base/SmallCharMatcher.java b/android/guava/src/com/google/common/base/SmallCharMatcher.java
index 1e565c8..f0e801b 100644
--- a/android/guava/src/com/google/common/base/SmallCharMatcher.java
+++ b/android/guava/src/com/google/common/base/SmallCharMatcher.java
@@ -26,6 +26,7 @@
  * @author Christopher Swenson
  */
 @GwtIncompatible // no precomputation is done in GWT
+@ElementTypesAreNonnullByDefault
 final class SmallCharMatcher extends NamedFastMatcher {
   static final int MAX_SIZE = 1023;
   private final char[] table;
diff --git a/android/guava/src/com/google/common/base/Splitter.java b/android/guava/src/com/google/common/base/Splitter.java
index 150c2fe..bde2e0e 100644
--- a/android/guava/src/com/google/common/base/Splitter.java
+++ b/android/guava/src/com/google/common/base/Splitter.java
@@ -27,6 +27,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
+import javax.annotation.CheckForNull;
 
 /**
  * Extracts non-overlapping substrings from an input string, typically by recognizing appearances of
@@ -97,6 +98,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Splitter {
   private final CharMatcher trimmer;
   private final boolean omitEmptyStrings;
@@ -547,6 +549,7 @@
       this.toSplit = toSplit;
     }
 
+    @CheckForNull
     @Override
     protected String computeNext() {
       /*
diff --git a/android/guava/src/com/google/common/base/StandardSystemProperty.java b/android/guava/src/com/google/common/base/StandardSystemProperty.java
index 2feb073..dc29792 100644
--- a/android/guava/src/com/google/common/base/StandardSystemProperty.java
+++ b/android/guava/src/com/google/common/base/StandardSystemProperty.java
@@ -15,7 +15,7 @@
 package com.google.common.base;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Represents a {@linkplain System#getProperties() standard system property}.
@@ -24,6 +24,7 @@
  * @since 15.0
  */
 @GwtIncompatible // java.lang.System#getProperty
+@ElementTypesAreNonnullByDefault
 public enum StandardSystemProperty {
 
   /** Java Runtime Environment version. */
@@ -80,7 +81,15 @@
   /** Name of JIT compiler to use. */
   JAVA_COMPILER("java.compiler"),
 
-  /** Path of extension directory or directories. */
+  /**
+   * Path of extension directory or directories.
+   *
+   * @deprecated This property was <a
+   *     href="https://openjdk.java.net/jeps/220#Removed:-The-extension-mechanism">deprecated</a> in
+   *     Java 8 and removed in Java 9. We do not plan to remove this API from Guava, but if you are
+   *     using it, it is probably not doing what you want.
+   */
+  @Deprecated
   JAVA_EXT_DIRS("java.ext.dirs"),
 
   /** Operating system name. */
@@ -124,8 +133,27 @@
   /**
    * Returns the current value for this system property by delegating to {@link
    * System#getProperty(String)}.
+   *
+   * <p>The value returned by this method is non-null except in rare circumstances:
+   *
+   * <ul>
+   *   <li>{@link #JAVA_EXT_DIRS} was deprecated in Java 8 and removed in Java 9. We have not
+   *       confirmed whether it is available under older versions.
+   *   <li>{@link #JAVA_COMPILER}, while still listed as required as of Java 15, is typically not
+   *       available even under older version.
+   *   <li>Any property may be cleared through APIs like {@link System#clearProperty}.
+   *   <li>Unusual environments like GWT may have their own special handling of system properties.
+   * </ul>
+   *
+   * <p>Note that {@code StandardSystemProperty} does not provide constants for more recently added
+   * properties, including:
+   *
+   * <ul>
+   *   <li>{@code java.vendor.version} (added in Java 11, listed as optional as of Java 13)
+   *   <li>{@code jdk.module.*} (added in Java 9, optional)
+   * </ul>
    */
-  @NullableDecl
+  @CheckForNull
   public String value() {
     return System.getProperty(key);
   }
diff --git a/android/guava/src/com/google/common/base/Stopwatch.java b/android/guava/src/com/google/common/base/Stopwatch.java
index 4a6767d..f76c098 100644
--- a/android/guava/src/com/google/common/base/Stopwatch.java
+++ b/android/guava/src/com/google/common/base/Stopwatch.java
@@ -77,7 +77,7 @@
  * Stopwatch.createStarted(
  *      new Ticker() {
  *        public long read() {
- *          return android.os.SystemClock.elapsedRealtimeNanos();
+ *          return android.os.SystemClock.elapsedRealtimeNanos(); // requires API Level 17
  *        }
  *      });
  * }</pre>
@@ -85,8 +85,9 @@
  * @author Kevin Bourrillion
  * @since 10.0
  */
-@GwtCompatible
+@GwtCompatible(emulated = true)
 @SuppressWarnings("GoodTime") // lots of violations
+@ElementTypesAreNonnullByDefault
 public final class Stopwatch {
   private final Ticker ticker;
   private boolean isRunning;
diff --git a/android/guava/src/com/google/common/base/Strings.java b/android/guava/src/com/google/common/base/Strings.java
index 4758517..fa36266 100644
--- a/android/guava/src/com/google/common/base/Strings.java
+++ b/android/guava/src/com/google/common/base/Strings.java
@@ -21,7 +21,8 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to {@code String} or {@code CharSequence} instances.
@@ -30,6 +31,7 @@
  * @since 3.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Strings {
   private Strings() {}
 
@@ -39,7 +41,7 @@
    * @param string the string to test and possibly return
    * @return {@code string} itself if it is non-null; {@code ""} if it is null
    */
-  public static String nullToEmpty(@NullableDecl String string) {
+  public static String nullToEmpty(@CheckForNull String string) {
     return Platform.nullToEmpty(string);
   }
 
@@ -49,8 +51,8 @@
    * @param string the string to test and possibly return
    * @return {@code string} itself if it is nonempty; {@code null} if it is empty or null
    */
-  @NullableDecl
-  public static String emptyToNull(@NullableDecl String string) {
+  @CheckForNull
+  public static String emptyToNull(@CheckForNull String string) {
     return Platform.emptyToNull(string);
   }
 
@@ -65,7 +67,7 @@
    * @param string a string reference to check
    * @return {@code true} if the string is null or is the empty string
    */
-  public static boolean isNullOrEmpty(@NullableDecl String string) {
+  public static boolean isNullOrEmpty(@CheckForNull String string) {
     return Platform.stringIsNullOrEmpty(string);
   }
 
@@ -257,7 +259,8 @@
    * @since 25.1
    */
   // TODO(diamondm) consider using Arrays.toString() for array parameters
-  public static String lenientFormat(@NullableDecl String template, @NullableDecl Object... args) {
+  public static String lenientFormat(
+      @CheckForNull String template, @CheckForNull @Nullable Object... args) {
     template = String.valueOf(template); // null -> "null"
 
     if (args == null) {
@@ -297,7 +300,7 @@
     return builder.toString();
   }
 
-  private static String lenientToString(@NullableDecl Object o) {
+  private static String lenientToString(@CheckForNull Object o) {
     if (o == null) {
       return "null";
     }
diff --git a/android/guava/src/com/google/common/base/Supplier.java b/android/guava/src/com/google/common/base/Supplier.java
index 662bf1f..f9e1e34 100644
--- a/android/guava/src/com/google/common/base/Supplier.java
+++ b/android/guava/src/com/google/common/base/Supplier.java
@@ -16,6 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A class that can supply objects of a single type; a pre-Java-8 version of {@link
@@ -45,7 +46,8 @@
  * @since 2.0
  */
 @GwtCompatible
-public interface Supplier<T> {
+@ElementTypesAreNonnullByDefault
+public interface Supplier<T extends @Nullable Object> {
   /**
    * Retrieves an instance of the appropriate type. The returned object may or may not be a new
    * instance, depending on the implementation.
@@ -53,5 +55,6 @@
    * @return an instance of the appropriate type
    */
   @CanIgnoreReturnValue
+  @ParametricNullness
   T get();
 }
diff --git a/android/guava/src/com/google/common/base/Suppliers.java b/android/guava/src/com/google/common/base/Suppliers.java
index da1490d..57d3486 100644
--- a/android/guava/src/com/google/common/base/Suppliers.java
+++ b/android/guava/src/com/google/common/base/Suppliers.java
@@ -14,14 +14,17 @@
 
 package com.google.common.base;
 
+import static com.google.common.base.NullnessCasts.uncheckedCastNullableTToT;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import java.io.Serializable;
 import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Useful suppliers.
@@ -33,6 +36,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Suppliers {
   private Suppliers() {}
 
@@ -42,11 +46,13 @@
    * and then applying {@code function} to that value. Note that the resulting supplier will not
    * call {@code supplier} or invoke {@code function} until it is called.
    */
-  public static <F, T> Supplier<T> compose(Function<? super F, T> function, Supplier<F> supplier) {
+  public static <F extends @Nullable Object, T extends @Nullable Object> Supplier<T> compose(
+      Function<? super F, T> function, Supplier<F> supplier) {
     return new SupplierComposition<>(function, supplier);
   }
 
-  private static class SupplierComposition<F, T> implements Supplier<T>, Serializable {
+  private static class SupplierComposition<F extends @Nullable Object, T extends @Nullable Object>
+      implements Supplier<T>, Serializable {
     final Function<? super F, T> function;
     final Supplier<F> supplier;
 
@@ -56,12 +62,13 @@
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       return function.apply(supplier.get());
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof SupplierComposition) {
         SupplierComposition<?, ?> that = (SupplierComposition<?, ?>) obj;
         return function.equals(that.function) && supplier.equals(that.supplier);
@@ -98,7 +105,7 @@
    * <p>If {@code delegate} is an instance created by an earlier call to {@code memoize}, it is
    * returned directly.
    */
-  public static <T> Supplier<T> memoize(Supplier<T> delegate) {
+  public static <T extends @Nullable Object> Supplier<T> memoize(Supplier<T> delegate) {
     if (delegate instanceof NonSerializableMemoizingSupplier
         || delegate instanceof MemoizingSupplier) {
       return delegate;
@@ -109,18 +116,19 @@
   }
 
   @VisibleForTesting
-  static class MemoizingSupplier<T> implements Supplier<T>, Serializable {
+  static class MemoizingSupplier<T extends @Nullable Object> implements Supplier<T>, Serializable {
     final Supplier<T> delegate;
     transient volatile boolean initialized;
     // "value" does not need to be volatile; visibility piggy-backs
     // on volatile read of "initialized".
-    @NullableDecl transient T value;
+    @CheckForNull transient T value;
 
     MemoizingSupplier(Supplier<T> delegate) {
       this.delegate = checkNotNull(delegate);
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       // A 2-field variant of Double Checked Locking.
       if (!initialized) {
@@ -133,7 +141,8 @@
           }
         }
       }
-      return value;
+      // This is safe because we checked `initialized.`
+      return uncheckedCastNullableTToT(value);
     }
 
     @Override
@@ -147,24 +156,31 @@
   }
 
   @VisibleForTesting
-  static class NonSerializableMemoizingSupplier<T> implements Supplier<T> {
-    volatile Supplier<T> delegate;
+  static class NonSerializableMemoizingSupplier<T extends @Nullable Object> implements Supplier<T> {
+    @CheckForNull volatile Supplier<T> delegate;
     volatile boolean initialized;
     // "value" does not need to be volatile; visibility piggy-backs
     // on volatile read of "initialized".
-    @NullableDecl T value;
+    @CheckForNull T value;
 
     NonSerializableMemoizingSupplier(Supplier<T> delegate) {
       this.delegate = checkNotNull(delegate);
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       // A 2-field variant of Double Checked Locking.
       if (!initialized) {
         synchronized (this) {
           if (!initialized) {
-            T t = delegate.get();
+            /*
+             * requireNonNull is safe because we read and write `delegate` under synchronization.
+             *
+             * TODO(cpovirk): To avoid having to check for null, replace `delegate` with a singleton
+             * `Supplier` that always throws an exception.
+             */
+            T t = requireNonNull(delegate).get();
             value = t;
             initialized = true;
             // Release the delegate to GC.
@@ -173,7 +189,8 @@
           }
         }
       }
-      return value;
+      // This is safe because we checked `initialized.`
+      return uncheckedCastNullableTToT(value);
     }
 
     @Override
@@ -207,17 +224,18 @@
    * @since 2.0
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  public static <T> Supplier<T> memoizeWithExpiration(
+  public static <T extends @Nullable Object> Supplier<T> memoizeWithExpiration(
       Supplier<T> delegate, long duration, TimeUnit unit) {
     return new ExpiringMemoizingSupplier<T>(delegate, duration, unit);
   }
 
   @VisibleForTesting
   @SuppressWarnings("GoodTime") // lots of violations
-  static class ExpiringMemoizingSupplier<T> implements Supplier<T>, Serializable {
+  static class ExpiringMemoizingSupplier<T extends @Nullable Object>
+      implements Supplier<T>, Serializable {
     final Supplier<T> delegate;
     final long durationNanos;
-    @NullableDecl transient volatile T value;
+    @CheckForNull transient volatile T value;
     // The special value 0 means "not yet initialized".
     transient volatile long expirationNanos;
 
@@ -228,6 +246,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       // Another variant of Double Checked Locking.
       //
@@ -250,7 +269,8 @@
           }
         }
       }
-      return value;
+      // This is safe because we checked `expirationNanos.`
+      return uncheckedCastNullableTToT(value);
     }
 
     @Override
@@ -264,24 +284,27 @@
   }
 
   /** Returns a supplier that always supplies {@code instance}. */
-  public static <T> Supplier<T> ofInstance(@NullableDecl T instance) {
+  public static <T extends @Nullable Object> Supplier<T> ofInstance(
+      @ParametricNullness T instance) {
     return new SupplierOfInstance<T>(instance);
   }
 
-  private static class SupplierOfInstance<T> implements Supplier<T>, Serializable {
-    @NullableDecl final T instance;
+  private static class SupplierOfInstance<T extends @Nullable Object>
+      implements Supplier<T>, Serializable {
+    @ParametricNullness final T instance;
 
-    SupplierOfInstance(@NullableDecl T instance) {
+    SupplierOfInstance(@ParametricNullness T instance) {
       this.instance = instance;
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       return instance;
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof SupplierOfInstance) {
         SupplierOfInstance<?> that = (SupplierOfInstance<?>) obj;
         return Objects.equal(instance, that.instance);
@@ -306,11 +329,13 @@
    * Returns a supplier whose {@code get()} method synchronizes on {@code delegate} before calling
    * it, making it thread-safe.
    */
-  public static <T> Supplier<T> synchronizedSupplier(Supplier<T> delegate) {
+  public static <T extends @Nullable Object> Supplier<T> synchronizedSupplier(
+      Supplier<T> delegate) {
     return new ThreadSafeSupplier<T>(delegate);
   }
 
-  private static class ThreadSafeSupplier<T> implements Supplier<T>, Serializable {
+  private static class ThreadSafeSupplier<T extends @Nullable Object>
+      implements Supplier<T>, Serializable {
     final Supplier<T> delegate;
 
     ThreadSafeSupplier(Supplier<T> delegate) {
@@ -318,6 +343,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       synchronized (delegate) {
         return delegate.get();
@@ -340,20 +366,21 @@
    *
    * @since 8.0
    */
-  public static <T> Function<Supplier<T>, T> supplierFunction() {
+  public static <T extends @Nullable Object> Function<Supplier<T>, T> supplierFunction() {
     @SuppressWarnings("unchecked") // implementation is "fully variant"
     SupplierFunction<T> sf = (SupplierFunction<T>) SupplierFunctionImpl.INSTANCE;
     return sf;
   }
 
-  private interface SupplierFunction<T> extends Function<Supplier<T>, T> {}
+  private interface SupplierFunction<T extends @Nullable Object> extends Function<Supplier<T>, T> {}
 
-  private enum SupplierFunctionImpl implements SupplierFunction<Object> {
+  private enum SupplierFunctionImpl implements SupplierFunction<@Nullable Object> {
     INSTANCE;
 
     // Note: This makes T a "pass-through type"
     @Override
-    public Object apply(Supplier<Object> input) {
+    @CheckForNull
+    public Object apply(Supplier<@Nullable Object> input) {
       return input.get();
     }
 
diff --git a/android/guava/src/com/google/common/base/Throwables.java b/android/guava/src/com/google/common/base/Throwables.java
index b2abb50..7832d18 100644
--- a/android/guava/src/com/google/common/base/Throwables.java
+++ b/android/guava/src/com/google/common/base/Throwables.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static java.util.Arrays.asList;
 import static java.util.Collections.unmodifiableList;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -32,7 +33,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to instances of {@link Throwable}.
@@ -45,6 +46,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Throwables {
   private Throwables() {}
 
@@ -99,7 +101,7 @@
   @Deprecated
   @GwtIncompatible // throwIfInstanceOf
   public static <X extends Throwable> void propagateIfInstanceOf(
-      @NullableDecl Throwable throwable, Class<X> declaredType) throws X {
+      @CheckForNull Throwable throwable, Class<X> declaredType) throws X {
     if (throwable != null) {
       throwIfInstanceOf(throwable, declaredType);
     }
@@ -154,7 +156,7 @@
    */
   @Deprecated
   @GwtIncompatible
-  public static void propagateIfPossible(@NullableDecl Throwable throwable) {
+  public static void propagateIfPossible(@CheckForNull Throwable throwable) {
     if (throwable != null) {
       throwIfUnchecked(throwable);
     }
@@ -180,7 +182,7 @@
    */
   @GwtIncompatible // propagateIfInstanceOf
   public static <X extends Throwable> void propagateIfPossible(
-      @NullableDecl Throwable throwable, Class<X> declaredType) throws X {
+      @CheckForNull Throwable throwable, Class<X> declaredType) throws X {
     propagateIfInstanceOf(throwable, declaredType);
     propagateIfPossible(throwable);
   }
@@ -198,7 +200,7 @@
    */
   @GwtIncompatible // propagateIfInstanceOf
   public static <X1 extends Throwable, X2 extends Throwable> void propagateIfPossible(
-      @NullableDecl Throwable throwable, Class<X1> declaredType1, Class<X2> declaredType2)
+      @CheckForNull Throwable throwable, Class<X1> declaredType1, Class<X2> declaredType2)
       throws X1, X2 {
     checkNotNull(declaredType2);
     propagateIfInstanceOf(throwable, declaredType1);
@@ -330,6 +332,7 @@
    */
   @Beta
   @GwtIncompatible // Class.cast(Object)
+  @CheckForNull
   public static <X extends Throwable> X getCauseAs(
       Throwable throwable, Class<X> expectedCauseType) {
     try {
@@ -412,15 +415,22 @@
      * AOSP grief.
      */
     return new AbstractList<StackTraceElement>() {
+      /*
+       * The following requireNonNull calls are safe because we use jlaStackTrace() only if
+       * lazyStackTraceIsLazy() returns true.
+       */
       @Override
       public StackTraceElement get(int n) {
         return (StackTraceElement)
-            invokeAccessibleNonThrowingMethod(getStackTraceElementMethod, jla, t, n);
+            invokeAccessibleNonThrowingMethod(
+                requireNonNull(getStackTraceElementMethod), requireNonNull(jla), t, n);
       }
 
       @Override
       public int size() {
-        return (Integer) invokeAccessibleNonThrowingMethod(getStackTraceDepthMethod, jla, t);
+        return (Integer)
+            invokeAccessibleNonThrowingMethod(
+                requireNonNull(getStackTraceDepthMethod), requireNonNull(jla), t);
       }
     };
   }
@@ -448,7 +458,7 @@
 
   /** Access to some fancy internal JVM internals. */
   @GwtIncompatible // java.lang.reflect
-  @NullableDecl
+  @CheckForNull
   private static final Object jla = getJLA();
 
   /**
@@ -456,7 +466,7 @@
    * find it when available. When this is null, use the slow way.
    */
   @GwtIncompatible // java.lang.reflect
-  @NullableDecl
+  @CheckForNull
   private static final Method getStackTraceElementMethod = (jla == null) ? null : getGetMethod();
 
   /**
@@ -464,15 +474,15 @@
    * when available. When this is null, use the slow way.
    */
   @GwtIncompatible // java.lang.reflect
-  @NullableDecl
-  private static final Method getStackTraceDepthMethod = (jla == null) ? null : getSizeMethod();
+  @CheckForNull
+  private static final Method getStackTraceDepthMethod = (jla == null) ? null : getSizeMethod(jla);
 
   /**
    * Returns the JavaLangAccess class that is present in all Sun JDKs. It is not allowed in
    * AppEngine, and not present in non-Sun JDKs.
    */
   @GwtIncompatible // java.lang.reflect
-  @NullableDecl
+  @CheckForNull
   private static Object getJLA() {
     try {
       /*
@@ -498,7 +508,7 @@
    * method cannot be found (it is only to be found in fairly recent JDKs).
    */
   @GwtIncompatible // java.lang.reflect
-  @NullableDecl
+  @CheckForNull
   private static Method getGetMethod() {
     return getJlaMethod("getStackTraceElement", Throwable.class, int.class);
   }
@@ -513,14 +523,14 @@
    * UnsupportedOperationException</a>.
    */
   @GwtIncompatible // java.lang.reflect
-  @NullableDecl
-  private static Method getSizeMethod() {
+  @CheckForNull
+  private static Method getSizeMethod(Object jla) {
     try {
       Method getStackTraceDepth = getJlaMethod("getStackTraceDepth", Throwable.class);
       if (getStackTraceDepth == null) {
         return null;
       }
-      getStackTraceDepth.invoke(getJLA(), new Throwable());
+      getStackTraceDepth.invoke(jla, new Throwable());
       return getStackTraceDepth;
     } catch (UnsupportedOperationException | IllegalAccessException | InvocationTargetException e) {
       return null;
@@ -528,7 +538,7 @@
   }
 
   @GwtIncompatible // java.lang.reflect
-  @NullableDecl
+  @CheckForNull
   private static Method getJlaMethod(String name, Class<?>... parameterTypes) throws ThreadDeath {
     try {
       return Class.forName(JAVA_LANG_ACCESS_CLASSNAME, false, null).getMethod(name, parameterTypes);
diff --git a/android/guava/src/com/google/common/base/Ticker.java b/android/guava/src/com/google/common/base/Ticker.java
index a53883b..d898735 100644
--- a/android/guava/src/com/google/common/base/Ticker.java
+++ b/android/guava/src/com/google/common/base/Ticker.java
@@ -28,6 +28,7 @@
  *     source-compatible</a> since 9.0)
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class Ticker {
   /** Constructor for use by subclasses. */
   protected Ticker() {}
diff --git a/android/guava/src/com/google/common/base/Utf8.java b/android/guava/src/com/google/common/base/Utf8.java
index 8a2fbb7..bb945a3 100644
--- a/android/guava/src/com/google/common/base/Utf8.java
+++ b/android/guava/src/com/google/common/base/Utf8.java
@@ -38,6 +38,7 @@
  */
 @Beta
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Utf8 {
   /**
    * Returns the number of bytes in the UTF-8-encoded form of {@code sequence}. For a string, this
diff --git a/android/guava/src/com/google/common/base/Verify.java b/android/guava/src/com/google/common/base/Verify.java
index 843a77f..b2e9f5f 100644
--- a/android/guava/src/com/google/common/base/Verify.java
+++ b/android/guava/src/com/google/common/base/Verify.java
@@ -18,7 +18,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static convenience methods that serve the same purpose as Java language <a
@@ -87,6 +88,7 @@
  * @since 17.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Verify {
   /**
    * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with no
@@ -118,8 +120,8 @@
    */
   public static void verify(
       boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object... errorMessageArgs) {
+      String errorMessageTemplate,
+      @CheckForNull @Nullable Object... errorMessageArgs) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, errorMessageArgs));
     }
@@ -133,8 +135,7 @@
    *
    * @since 23.1 (varargs overload since 17.0)
    */
-  public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, char p1) {
+  public static void verify(boolean expression, String errorMessageTemplate, char p1) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -148,7 +149,21 @@
    *
    * @since 23.1 (varargs overload since 17.0)
    */
-  public static void verify(boolean expression, @NullableDecl String errorMessageTemplate, int p1) {
+  public static void verify(boolean expression, String errorMessageTemplate, int p1) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, long p1) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -163,7 +178,7 @@
    * @since 23.1 (varargs overload since 17.0)
    */
   public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, long p1) {
+      boolean expression, String errorMessageTemplate, @CheckForNull Object p1) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -177,10 +192,9 @@
    *
    * @since 23.1 (varargs overload since 17.0)
    */
-  public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, @NullableDecl Object p1) {
+  public static void verify(boolean expression, String errorMessageTemplate, char p1, char p2) {
     if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1));
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
   }
 
@@ -192,8 +206,21 @@
    *
    * @since 23.1 (varargs overload since 17.0)
    */
-  public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, char p1, char p2) {
+  public static void verify(boolean expression, String errorMessageTemplate, int p1, char p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, long p1, char p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -208,7 +235,49 @@
    * @since 23.1 (varargs overload since 17.0)
    */
   public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, int p1, char p2) {
+      boolean expression, String errorMessageTemplate, @CheckForNull Object p1, char p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, char p1, int p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, int p1, int p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, long p1, int p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -223,7 +292,109 @@
    * @since 23.1 (varargs overload since 17.0)
    */
   public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, long p1, char p2) {
+      boolean expression, String errorMessageTemplate, @CheckForNull Object p1, int p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, char p1, long p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, int p1, long p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, long p1, long p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(
+      boolean expression, String errorMessageTemplate, @CheckForNull Object p1, long p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(
+      boolean expression, String errorMessageTemplate, char p1, @CheckForNull Object p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(
+      boolean expression, String errorMessageTemplate, int p1, @CheckForNull Object p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(
+      boolean expression, String errorMessageTemplate, long p1, @CheckForNull Object p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -239,54 +410,9 @@
    */
   public static void verify(
       boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      char p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, char p1, int p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, int p1, int p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, long p1, int p2) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -302,163 +428,10 @@
    */
   public static void verify(
       boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      int p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, char p1, long p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, int p1, long p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @NullableDecl String errorMessageTemplate, long p1, long p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      long p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      char p1,
-      @NullableDecl Object p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      int p1,
-      @NullableDecl Object p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      long p1,
-      @NullableDecl Object p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2,
-      @NullableDecl Object p3) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2, p3));
     }
@@ -474,16 +447,25 @@
    */
   public static void verify(
       boolean expression,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object p1,
-      @NullableDecl Object p2,
-      @NullableDecl Object p3,
-      @NullableDecl Object p4) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3,
+      @CheckForNull Object p4) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2, p3, p4));
     }
   }
 
+  /*
+   * For a discussion of the signature of verifyNotNull, see the discussion above
+   * Preconditions.checkNotNull.
+   *
+   * (verifyNotNull has many fewer "problem" callers, so we could try to be stricter. On the other
+   * hand, verifyNotNull arguably has more reason to accept nullable arguments in the first
+   * place....)
+   */
+
   /**
    * Ensures that {@code reference} is non-null, throwing a {@code VerifyException} with a default
    * message otherwise.
@@ -493,7 +475,7 @@
    * @see Preconditions#checkNotNull Preconditions.checkNotNull()
    */
   @CanIgnoreReturnValue
-  public static <T> T verifyNotNull(@NullableDecl T reference) {
+  public static <T> T verifyNotNull(@CheckForNull T reference) {
     return verifyNotNull(reference, "expected a non-null reference");
   }
 
@@ -514,10 +496,12 @@
    */
   @CanIgnoreReturnValue
   public static <T> T verifyNotNull(
-      @NullableDecl T reference,
-      @NullableDecl String errorMessageTemplate,
-      @NullableDecl Object... errorMessageArgs) {
-    verify(reference != null, errorMessageTemplate, errorMessageArgs);
+      @CheckForNull T reference,
+      String errorMessageTemplate,
+      @CheckForNull @Nullable Object... errorMessageArgs) {
+    if (reference == null) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, errorMessageArgs));
+    }
     return reference;
   }
 
diff --git a/android/guava/src/com/google/common/base/VerifyException.java b/android/guava/src/com/google/common/base/VerifyException.java
index eed5c6d..10b99de 100644
--- a/android/guava/src/com/google/common/base/VerifyException.java
+++ b/android/guava/src/com/google/common/base/VerifyException.java
@@ -15,7 +15,7 @@
 package com.google.common.base;
 
 import com.google.common.annotations.GwtCompatible;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Exception thrown upon the failure of a <a
@@ -25,12 +25,13 @@
  * @since 17.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class VerifyException extends RuntimeException {
   /** Constructs a {@code VerifyException} with no message. */
   public VerifyException() {}
 
   /** Constructs a {@code VerifyException} with the message {@code message}. */
-  public VerifyException(@NullableDecl String message) {
+  public VerifyException(@CheckForNull String message) {
     super(message);
   }
 
@@ -40,7 +41,7 @@
    *
    * @since 19.0
    */
-  public VerifyException(@NullableDecl Throwable cause) {
+  public VerifyException(@CheckForNull Throwable cause) {
     super(cause);
   }
 
@@ -50,7 +51,7 @@
    *
    * @since 19.0
    */
-  public VerifyException(@NullableDecl String message, @NullableDecl Throwable cause) {
+  public VerifyException(@CheckForNull String message, @CheckForNull Throwable cause) {
     super(message, cause);
   }
 }
diff --git a/android/guava/src/com/google/common/cache/AbstractCache.java b/android/guava/src/com/google/common/cache/AbstractCache.java
index d8ef032..eec5fdc 100644
--- a/android/guava/src/com/google/common/cache/AbstractCache.java
+++ b/android/guava/src/com/google/common/cache/AbstractCache.java
@@ -38,6 +38,7 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractCache<K, V> implements Cache<K, V> {
 
   /** Constructor for use by subclasses. */
@@ -58,8 +59,12 @@
    *
    * @since 11.0
    */
+  /*
+   * <? extends Object> is mostly the same as <?> to plain Java. But to nullness checkers, they
+   * differ: <? extends Object> means "non-null types," while <?> means "all types."
+   */
   @Override
-  public ImmutableMap<K, V> getAllPresent(Iterable<?> keys) {
+  public ImmutableMap<K, V> getAllPresent(Iterable<? extends Object> keys) {
     Map<K, V> result = Maps.newLinkedHashMap();
     for (Object key : keys) {
       if (!result.containsKey(key)) {
@@ -103,7 +108,8 @@
 
   /** @since 11.0 */
   @Override
-  public void invalidateAll(Iterable<?> keys) {
+  // For discussion of <? extends Object>, see getAllPresent.
+  public void invalidateAll(Iterable<? extends Object> keys) {
     for (Object key : keys) {
       invalidate(key);
     }
diff --git a/android/guava/src/com/google/common/cache/AbstractLoadingCache.java b/android/guava/src/com/google/common/cache/AbstractLoadingCache.java
index 38b9774..489597c 100644
--- a/android/guava/src/com/google/common/cache/AbstractLoadingCache.java
+++ b/android/guava/src/com/google/common/cache/AbstractLoadingCache.java
@@ -38,6 +38,7 @@
  * @since 11.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractLoadingCache<K, V> extends AbstractCache<K, V>
     implements LoadingCache<K, V> {
 
diff --git a/android/guava/src/com/google/common/cache/Cache.java b/android/guava/src/com/google/common/cache/Cache.java
index 69bd752..1234bb6 100644
--- a/android/guava/src/com/google/common/cache/Cache.java
+++ b/android/guava/src/com/google/common/cache/Cache.java
@@ -18,13 +18,14 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.util.concurrent.ExecutionError;
 import com.google.common.util.concurrent.UncheckedExecutionException;
+import com.google.errorprone.annotations.CheckReturnValue;
 import com.google.errorprone.annotations.CompatibleWith;
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutionException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A semi-persistent mapping from keys to values. Cache entries are manually added using {@link
@@ -34,11 +35,14 @@
  * <p>Implementations of this interface are expected to be thread-safe, and can be safely accessed
  * by multiple concurrent threads.
  *
+ * @param <K> the type of the cache's keys, which are not permitted to be null
+ * @param <V> the type of the cache's values, which are not permitted to be null
  * @author Charles Fry
  * @since 10.0
  */
 @DoNotMock("Use CacheBuilder.newBuilder().build()")
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public interface Cache<K, V> {
 
   /**
@@ -47,7 +51,7 @@
    *
    * @since 11.0
    */
-  @NullableDecl
+  @CheckForNull
   V getIfPresent(@CompatibleWith("K") Object key);
 
   /**
@@ -104,7 +108,11 @@
    *
    * @since 11.0
    */
-  ImmutableMap<K, V> getAllPresent(Iterable<?> keys);
+  /*
+   * <? extends Object> is mostly the same as <?> to plain Java. But to nullness checkers, they
+   * differ: <? extends Object> means "non-null types," while <?> means "all types."
+   */
+  ImmutableMap<K, V> getAllPresent(Iterable<? extends Object> keys);
 
   /**
    * Associates {@code value} with {@code key} in this cache. If the cache previously contained a
@@ -135,12 +143,14 @@
    *
    * @since 11.0
    */
-  void invalidateAll(Iterable<?> keys);
+  // For discussion of <? extends Object>, see getAllPresent.
+  void invalidateAll(Iterable<? extends Object> keys);
 
   /** Discards all entries in the cache. */
   void invalidateAll();
 
   /** Returns the approximate number of entries in this cache. */
+  @CheckReturnValue
   long size();
 
   /**
@@ -154,6 +164,7 @@
    * all values is returned.
    *
    */
+  @CheckReturnValue
   CacheStats stats();
 
   /**
@@ -169,6 +180,7 @@
    * {@code ConcurrentMap} documentation. They will not function correctly and it is impossible for
    * Guava to fix them until Guava is ready to <i>require</i> Java 8 for all users.
    */
+  @CheckReturnValue
   ConcurrentMap<K, V> asMap();
 
   /**
diff --git a/android/guava/src/com/google/common/cache/CacheBuilder.java b/android/guava/src/com/google/common/cache/CacheBuilder.java
index cd98515..227b2c2 100644
--- a/android/guava/src/com/google/common/cache/CacheBuilder.java
+++ b/android/guava/src/com/google/common/cache/CacheBuilder.java
@@ -39,15 +39,55 @@
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
- * A builder of {@link LoadingCache} and {@link Cache} instances having any combination of the
- * following features:
+ * A builder of {@link LoadingCache} and {@link Cache} instances.
+ *
+ * <h2>Prefer <a href="https://github.com/ben-manes/caffeine/wiki">Caffeine</a> over Guava's caching
+ * API</h2>
+ *
+ * <p>The successor to Guava's caching API is <a
+ * href="https://github.com/ben-manes/caffeine/wiki">Caffeine</a>. Its API is designed to make it a
+ * nearly drop-in replacement -- though it requires Java 8 APIs and is not available for Android or
+ * GWT/j2cl. Its equivalent to {@code CacheBuilder} is its <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/Caffeine.html">{@code
+ * Caffeine}</a> class. Caffeine offers better performance, more features (including asynchronous
+ * loading), and fewer <a
+ * href="https://github.com/google/guava/issues?q=is%3Aopen+is%3Aissue+label%3Apackage%3Dcache+label%3Atype%3Ddefect">bugs</a>.
+ *
+ * <p>Caffeine defines its own interfaces (<a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/Cache.html">{@code
+ * Cache}</a>, <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/LoadingCache.html">{@code
+ * LoadingCache}</a>, <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/CacheLoader.html">{@code
+ * CacheLoader}</a>, etc.), so you can use Caffeine without needing to use any Guava types.
+ * Caffeine's types are better than Guava's, especially for <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/AsyncLoadingCache.html">their
+ * deep support for asynchronous operations</a>. But if you want to migrate to Caffeine with minimal
+ * code changes, you can use <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/guava/latest/com.github.benmanes.caffeine.guava/com/github/benmanes/caffeine/guava/CaffeinatedGuava.html">its
+ * {@code CaffeinatedGuava} adapter class</a>, which lets you build a Guava {@code Cache} or a Guava
+ * {@code LoadingCache} backed by a Guava {@code CacheLoader}.
+ *
+ * <p>Caffeine's API for asynchronous operations uses {@code CompletableFuture}: <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/AsyncLoadingCache.html#get(K)">{@code
+ * AsyncLoadingCache.get}</a> returns a {@code CompletableFuture}, and implementations of <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/AsyncCacheLoader.html#asyncLoad(K,java.util.concurrent.Executor)">{@code
+ * AsyncCacheLoader.asyncLoad}</a> must return a {@code CompletableFuture}. Users of Guava's {@link
+ * com.google.common.util.concurrent.ListenableFuture} can adapt between the two {@code Future}
+ * types by using <a href="https://github.com/lukas-krecan/future-converter#java8-guava">{@code
+ * net.javacrumbs.futureconverter.java8guava.FutureConverter}</a>.
+ *
+ * <h2>More on {@code CacheBuilder}</h2>
+ *
+ * {@code CacheBuilder} builds caches with any combination of the following features:
  *
  * <ul>
  *   <li>automatic loading of entries into the cache
- *   <li>least-recently-used eviction when a maximum size is exceeded
+ *   <li>least-recently-used eviction when a maximum size is exceeded (note that the cache is
+ *       divided into segments, each of which does LRU internally)
  *   <li>time-based expiration of entries, measured since last access or last write
  *   <li>keys automatically wrapped in {@code WeakReference}
  *   <li>values automatically wrapped in {@code WeakReference} or {@code SoftReference}
@@ -55,7 +95,6 @@
  *   <li>accumulation of cache access statistics
  * </ul>
  *
- *
  * <p>These features are all optional; caches can be created using all or none of them. By default
  * cache instances created by {@code CacheBuilder} will not perform any type of eviction.
  *
@@ -143,15 +182,16 @@
  *
  * @param <K> the most general key type this builder will be able to create caches for. This is
  *     normally {@code Object} unless it is constrained by using a method like {@code
- *     #removalListener}
+ *     #removalListener}. Cache keys may not be null.
  * @param <V> the most general value type this builder will be able to create caches for. This is
  *     normally {@code Object} unless it is constrained by using a method like {@code
- *     #removalListener}
+ *     #removalListener}. Cache values may not be null.
  * @author Charles Fry
  * @author Kevin Bourrillion
  * @since 10.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class CacheBuilder<K, V> {
   private static final int DEFAULT_INITIAL_CAPACITY = 16;
   private static final int DEFAULT_CONCURRENCY_LEVEL = 4;
@@ -231,10 +271,10 @@
   int concurrencyLevel = UNSET_INT;
   long maximumSize = UNSET_INT;
   long maximumWeight = UNSET_INT;
-  @NullableDecl Weigher<? super K, ? super V> weigher;
+  @Nullable Weigher<? super K, ? super V> weigher;
 
-  @NullableDecl Strength keyStrength;
-  @NullableDecl Strength valueStrength;
+  @Nullable Strength keyStrength;
+  @Nullable Strength valueStrength;
 
   @SuppressWarnings("GoodTime") // should be a java.time.Duration
   long expireAfterWriteNanos = UNSET_INT;
@@ -245,11 +285,11 @@
   @SuppressWarnings("GoodTime") // should be a java.time.Duration
   long refreshNanos = UNSET_INT;
 
-  @NullableDecl Equivalence<Object> keyEquivalence;
-  @NullableDecl Equivalence<Object> valueEquivalence;
+  @Nullable Equivalence<Object> keyEquivalence;
+  @Nullable Equivalence<Object> valueEquivalence;
 
-  @NullableDecl RemovalListener<? super K, ? super V> removalListener;
-  @NullableDecl Ticker ticker;
+  @Nullable RemovalListener<? super K, ? super V> removalListener;
+  @Nullable Ticker ticker;
 
   Supplier<? extends StatsCounter> statsCounterSupplier = NULL_STATS_COUNTER;
 
@@ -262,6 +302,7 @@
    * <p>Note that while this return type is {@code CacheBuilder<Object, Object>}, type parameters on
    * the {@link #build} methods allow you to create a cache of any key and value type desired.
    */
+  @CheckReturnValue
   public static CacheBuilder<Object, Object> newBuilder() {
     return new CacheBuilder<>();
   }
@@ -272,6 +313,7 @@
    * @since 12.0
    */
   @GwtIncompatible // To be supported
+  @CheckReturnValue
   public static CacheBuilder<Object, Object> from(CacheBuilderSpec spec) {
     return spec.toCacheBuilder().lenientParsing();
   }
@@ -284,6 +326,7 @@
    * @since 12.0
    */
   @GwtIncompatible // To be supported
+  @CheckReturnValue
   public static CacheBuilder<Object, Object> from(String spec) {
     return from(CacheBuilderSpec.parse(spec));
   }
@@ -478,8 +521,8 @@
         this.maximumWeight);
     checkState(
         this.maximumSize == UNSET_INT, "maximum size was already set to %s", this.maximumSize);
-    this.maximumWeight = maximumWeight;
     checkArgument(maximumWeight >= 0, "maximum weight must not be negative");
+    this.maximumWeight = maximumWeight;
     return this;
   }
 
@@ -648,7 +691,7 @@
    * @param unit the unit that {@code duration} is expressed in
    * @return this {@code CacheBuilder} instance (for chaining)
    * @throws IllegalArgumentException if {@code duration} is negative
-   * @throws IllegalStateException if the time to live or time to idle was already set
+   * @throws IllegalStateException if {@link #expireAfterWrite} was already set
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public CacheBuilder<K, V> expireAfterWrite(long duration, TimeUnit unit) {
@@ -688,7 +731,7 @@
    * @param unit the unit that {@code duration} is expressed in
    * @return this {@code CacheBuilder} instance (for chaining)
    * @throws IllegalArgumentException if {@code duration} is negative
-   * @throws IllegalStateException if the time to idle or time to live was already set
+   * @throws IllegalStateException if {@link #expireAfterAccess} was already set
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public CacheBuilder<K, V> expireAfterAccess(long duration, TimeUnit unit) {
@@ -720,7 +763,8 @@
    * operations.
    *
    * <p>Currently automatic refreshes are performed when the first stale request for an entry
-   * occurs. The request triggering refresh will make a blocking call to {@link CacheLoader#reload}
+   * occurs. The request triggering refresh will make a synchronous call to {@link
+   * CacheLoader#reload}
    * and immediately return the new value if the returned future is complete, and the old value
    * otherwise.
    *
@@ -731,7 +775,7 @@
    * @param unit the unit that {@code duration} is expressed in
    * @return this {@code CacheBuilder} instance (for chaining)
    * @throws IllegalArgumentException if {@code duration} is negative
-   * @throws IllegalStateException if the refresh interval was already set
+   * @throws IllegalStateException if {@link #refreshAfterWrite} was already set
    * @since 11.0
    */
   @GwtIncompatible // To be supported (synchronously).
@@ -846,6 +890,7 @@
    * @param loader the cache loader used to obtain new values
    * @return a cache having the requested features
    */
+  @CheckReturnValue
   public <K1 extends K, V1 extends V> LoadingCache<K1, V1> build(
       CacheLoader<? super K1, V1> loader) {
     checkWeightWithWeigher();
@@ -864,6 +909,7 @@
    * @return a cache having the requested features
    * @since 11.0
    */
+  @CheckReturnValue
   public <K1 extends K, V1 extends V> Cache<K1, V1> build() {
     checkWeightWithWeigher();
     checkNonLoadingCache();
diff --git a/android/guava/src/com/google/common/cache/CacheBuilderSpec.java b/android/guava/src/com/google/common/cache/CacheBuilderSpec.java
index e804866..64b5ad2 100644
--- a/android/guava/src/com/google/common/cache/CacheBuilderSpec.java
+++ b/android/guava/src/com/google/common/cache/CacheBuilderSpec.java
@@ -15,6 +15,7 @@
 package com.google.common.cache;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Strings.isNullOrEmpty;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -27,7 +28,8 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A specification of a {@link CacheBuilder} configuration.
@@ -78,10 +80,11 @@
  */
 @SuppressWarnings("GoodTime") // lots of violations (nanosecond math)
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class CacheBuilderSpec {
   /** Parses a single value. */
   private interface ValueParser {
-    void parse(CacheBuilderSpec spec, String key, @NullableDecl String value);
+    void parse(CacheBuilderSpec spec, String key, @CheckForNull String value);
   }
 
   /** Splits each key-value pair. */
@@ -107,19 +110,19 @@
           .put("refreshInterval", new RefreshDurationParser())
           .build();
 
-  @VisibleForTesting @NullableDecl Integer initialCapacity;
-  @VisibleForTesting @NullableDecl Long maximumSize;
-  @VisibleForTesting @NullableDecl Long maximumWeight;
-  @VisibleForTesting @NullableDecl Integer concurrencyLevel;
-  @VisibleForTesting @NullableDecl Strength keyStrength;
-  @VisibleForTesting @NullableDecl Strength valueStrength;
-  @VisibleForTesting @NullableDecl Boolean recordStats;
+  @VisibleForTesting @CheckForNull Integer initialCapacity;
+  @VisibleForTesting @CheckForNull Long maximumSize;
+  @VisibleForTesting @CheckForNull Long maximumWeight;
+  @VisibleForTesting @CheckForNull Integer concurrencyLevel;
+  @VisibleForTesting @CheckForNull Strength keyStrength;
+  @VisibleForTesting @CheckForNull Strength valueStrength;
+  @VisibleForTesting @CheckForNull Boolean recordStats;
   @VisibleForTesting long writeExpirationDuration;
-  @VisibleForTesting @NullableDecl TimeUnit writeExpirationTimeUnit;
+  @VisibleForTesting @CheckForNull TimeUnit writeExpirationTimeUnit;
   @VisibleForTesting long accessExpirationDuration;
-  @VisibleForTesting @NullableDecl TimeUnit accessExpirationTimeUnit;
+  @VisibleForTesting @CheckForNull TimeUnit accessExpirationTimeUnit;
   @VisibleForTesting long refreshDuration;
-  @VisibleForTesting @NullableDecl TimeUnit refreshTimeUnit;
+  @VisibleForTesting @CheckForNull TimeUnit refreshTimeUnit;
   /** Specification; used for toParseableString(). */
   private final String specification;
 
@@ -248,7 +251,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (this == obj) {
       return true;
     }
@@ -278,8 +281,8 @@
    * Converts an expiration duration/unit pair into a single Long for hashing and equality. Uses
    * nanos to match CacheBuilder implementation.
    */
-  @NullableDecl
-  private static Long durationInNanos(long duration, @NullableDecl TimeUnit unit) {
+  @CheckForNull
+  private static Long durationInNanos(long duration, @CheckForNull TimeUnit unit) {
     return (unit == null) ? null : unit.toNanos(duration);
   }
 
@@ -288,8 +291,10 @@
     protected abstract void parseInteger(CacheBuilderSpec spec, int value);
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, String value) {
-      checkArgument(value != null && !value.isEmpty(), "value of key %s omitted", key);
+    public void parse(CacheBuilderSpec spec, String key, @Nullable String value) {
+      if (isNullOrEmpty(value)) {
+        throw new IllegalArgumentException("value of key " + key + " omitted");
+      }
       try {
         parseInteger(spec, Integer.parseInt(value));
       } catch (NumberFormatException e) {
@@ -304,8 +309,10 @@
     protected abstract void parseLong(CacheBuilderSpec spec, long value);
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, String value) {
-      checkArgument(value != null && !value.isEmpty(), "value of key %s omitted", key);
+    public void parse(CacheBuilderSpec spec, String key, @Nullable String value) {
+      if (isNullOrEmpty(value)) {
+        throw new IllegalArgumentException("value of key " + key + " omitted");
+      }
       try {
         parseLong(spec, Long.parseLong(value));
       } catch (NumberFormatException e) {
@@ -370,7 +377,7 @@
     }
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, @NullableDecl String value) {
+    public void parse(CacheBuilderSpec spec, String key, @CheckForNull String value) {
       checkArgument(value == null, "key %s does not take values", key);
       checkArgument(spec.keyStrength == null, "%s was already set to %s", key, spec.keyStrength);
       spec.keyStrength = strength;
@@ -386,7 +393,7 @@
     }
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, @NullableDecl String value) {
+    public void parse(CacheBuilderSpec spec, String key, @CheckForNull String value) {
       checkArgument(value == null, "key %s does not take values", key);
       checkArgument(
           spec.valueStrength == null, "%s was already set to %s", key, spec.valueStrength);
@@ -399,7 +406,7 @@
   static class RecordStatsParser implements ValueParser {
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, @NullableDecl String value) {
+    public void parse(CacheBuilderSpec spec, String key, @CheckForNull String value) {
       checkArgument(value == null, "recordStats does not take values");
       checkArgument(spec.recordStats == null, "recordStats already set");
       spec.recordStats = true;
@@ -411,8 +418,10 @@
     protected abstract void parseDuration(CacheBuilderSpec spec, long duration, TimeUnit unit);
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, String value) {
-      checkArgument(value != null && !value.isEmpty(), "value of key %s omitted", key);
+    public void parse(CacheBuilderSpec spec, String key, @CheckForNull String value) {
+      if (isNullOrEmpty(value)) {
+        throw new IllegalArgumentException("value of key " + key + " omitted");
+      }
       try {
         char lastChar = value.charAt(value.length() - 1);
         TimeUnit timeUnit;
@@ -431,8 +440,7 @@
             break;
           default:
             throw new IllegalArgumentException(
-                format(
-                    "key %s invalid format.  was %s, must end with one of [dDhHmMsS]", key, value));
+                format("key %s invalid unit: was %s, must end with one of [dhms]", key, value));
         }
 
         long duration = Long.parseLong(value.substring(0, value.length() - 1));
diff --git a/android/guava/src/com/google/common/cache/CacheLoader.java b/android/guava/src/com/google/common/cache/CacheLoader.java
index b490d48..bb544cd 100644
--- a/android/guava/src/com/google/common/cache/CacheLoader.java
+++ b/android/guava/src/com/google/common/cache/CacheLoader.java
@@ -23,6 +23,7 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListenableFutureTask;
+import com.google.errorprone.annotations.CheckReturnValue;
 import java.io.Serializable;
 import java.util.Map;
 import java.util.concurrent.Callable;
@@ -56,6 +57,7 @@
  * @since 10.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public abstract class CacheLoader<K, V> {
   /** Constructor for use by subclasses. */
   protected CacheLoader() {}
@@ -136,6 +138,7 @@
    * @param function the function to be used for loading values; must never return {@code null}
    * @return a cache loader that loads values by passing each key to {@code function}
    */
+  @CheckReturnValue
   public static <K, V> CacheLoader<K, V> from(Function<K, V> function) {
     return new FunctionToCacheLoader<>(function);
   }
@@ -149,6 +152,7 @@
    * @return a cache loader that loads values by calling {@link Supplier#get}, irrespective of the
    *     key
    */
+  @CheckReturnValue
   public static <V> CacheLoader<Object, V> from(Supplier<V> supplier) {
     return new SupplierToCacheLoader<V>(supplier);
   }
@@ -178,6 +182,7 @@
    *
    * @since 17.0
    */
+  @CheckReturnValue
   @GwtIncompatible // Executor + Futures
   public static <K, V> CacheLoader<K, V> asyncReloading(
       final CacheLoader<K, V> loader, final Executor executor) {
diff --git a/android/guava/src/com/google/common/cache/CacheStats.java b/android/guava/src/com/google/common/cache/CacheStats.java
index e0c39c3..8307e94 100644
--- a/android/guava/src/com/google/common/cache/CacheStats.java
+++ b/android/guava/src/com/google/common/cache/CacheStats.java
@@ -22,7 +22,7 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import java.util.concurrent.Callable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Statistics about the performance of a {@link Cache}. Instances of this class are immutable.
@@ -57,6 +57,7 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class CacheStats {
   private final long hitCount;
   private final long missCount;
@@ -276,7 +277,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof CacheStats) {
       CacheStats other = (CacheStats) object;
       return hitCount == other.hitCount
diff --git a/android/guava/src/com/google/common/cache/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/cache/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..bcf0fce
--- /dev/null
+++ b/android/guava/src/com/google/common/cache/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.cache;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/cache/ForwardingCache.java b/android/guava/src/com/google/common/cache/ForwardingCache.java
index 217042b..f118977 100644
--- a/android/guava/src/com/google/common/cache/ForwardingCache.java
+++ b/android/guava/src/com/google/common/cache/ForwardingCache.java
@@ -22,7 +22,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutionException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A cache which forwards all its method calls to another cache. Subclasses should override one or
@@ -33,6 +33,7 @@
  * @since 10.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingCache<K, V> extends ForwardingObject implements Cache<K, V> {
 
   /** Constructor for use by subclasses. */
@@ -43,7 +44,7 @@
 
   /** @since 11.0 */
   @Override
-  @NullableDecl
+  @CheckForNull
   public V getIfPresent(Object key) {
     return delegate().getIfPresent(key);
   }
@@ -56,7 +57,11 @@
 
   /** @since 11.0 */
   @Override
-  public ImmutableMap<K, V> getAllPresent(Iterable<?> keys) {
+  /*
+   * <? extends Object> is mostly the same as <?> to plain Java. But to nullness checkers, they
+   * differ: <? extends Object> means "non-null types," while <?> means "all types."
+   */
+  public ImmutableMap<K, V> getAllPresent(Iterable<? extends Object> keys) {
     return delegate().getAllPresent(keys);
   }
 
@@ -79,7 +84,8 @@
 
   /** @since 11.0 */
   @Override
-  public void invalidateAll(Iterable<?> keys) {
+  // For discussion of <? extends Object>, see getAllPresent.
+  public void invalidateAll(Iterable<? extends Object> keys) {
     delegate().invalidateAll(keys);
   }
 
diff --git a/android/guava/src/com/google/common/cache/ForwardingLoadingCache.java b/android/guava/src/com/google/common/cache/ForwardingLoadingCache.java
index ba88ded..ecd44ca 100644
--- a/android/guava/src/com/google/common/cache/ForwardingLoadingCache.java
+++ b/android/guava/src/com/google/common/cache/ForwardingLoadingCache.java
@@ -31,6 +31,7 @@
  * @since 11.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingLoadingCache<K, V> extends ForwardingCache<K, V>
     implements LoadingCache<K, V> {
 
diff --git a/android/guava/src/com/google/common/cache/LoadingCache.java b/android/guava/src/com/google/common/cache/LoadingCache.java
index 6af1d3a..e338ac4 100644
--- a/android/guava/src/com/google/common/cache/LoadingCache.java
+++ b/android/guava/src/com/google/common/cache/LoadingCache.java
@@ -33,10 +33,13 @@
  * <p>When evaluated as a {@link Function}, a cache yields the same result as invoking {@link
  * #getUnchecked}.
  *
+ * @param <K> the type of the cache's keys, which are not permitted to be null
+ * @param <V> the type of the cache's values, which are not permitted to be null
  * @author Charles Fry
  * @since 11.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public interface LoadingCache<K, V> extends Cache<K, V>, Function<K, V> {
 
   /**
@@ -130,11 +133,11 @@
   V apply(K key);
 
   /**
-   * Loads a new value for key {@code key}, possibly asynchronously. While the new value is loading
-   * the previous value (if any) will continue to be returned by {@code get(key)} unless it is
-   * evicted. If the new value is loaded successfully it will replace the previous value in the
-   * cache; if an exception is thrown while refreshing the previous value will remain, <i>and the
-   * exception will be logged (using {@link java.util.logging.Logger}) and swallowed</i>.
+   * Loads a new value for {@code key}, possibly asynchronously. While the new value is loading the
+   * previous value (if any) will continue to be returned by {@code get(key)} unless it is evicted.
+   * If the new value is loaded successfully it will replace the previous value in the cache; if an
+   * exception is thrown while refreshing the previous value will remain, <i>and the exception will
+   * be logged (using {@link java.util.logging.Logger}) and swallowed</i>.
    *
    * <p>Caches loaded by a {@link CacheLoader} will call {@link CacheLoader#reload} if the cache
    * currently contains a value for {@code key}, and {@link CacheLoader#load} otherwise. Loading is
diff --git a/android/guava/src/com/google/common/cache/LocalCache.java b/android/guava/src/com/google/common/cache/LocalCache.java
index 86f9dbe..f61f68e 100644
--- a/android/guava/src/com/google/common/cache/LocalCache.java
+++ b/android/guava/src/com/google/common/cache/LocalCache.java
@@ -93,8 +93,12 @@
  * @author Bob Lee ({@code com.google.common.collect.MapMaker})
  * @author Doug Lea ({@code ConcurrentHashMap})
  */
-@SuppressWarnings("GoodTime") // lots of violations (nanosecond math)
+@SuppressWarnings({
+  "GoodTime", // lots of violations (nanosecond math)
+  "nullness", // too much trouble for the payoff
+})
 @GwtCompatible(emulated = true)
+// TODO(cpovirk): Annotate for nullness.
 class LocalCache<K, V> extends AbstractMap<K, V> implements ConcurrentMap<K, V> {
 
   /*
@@ -3861,8 +3865,7 @@
     return value;
   }
 
-  // Only becomes available in Java 8 when it's on the interface.
-  // @Override
+  @SuppressWarnings("MissingOverride") // Supermethod will not exist if we build with --release 7.
   @NullableDecl
   public V getOrDefault(@NullableDecl Object key, @NullableDecl V defaultValue) {
     V result = get(key);
diff --git a/android/guava/src/com/google/common/cache/LongAddable.java b/android/guava/src/com/google/common/cache/LongAddable.java
index eaa6414..9851052 100644
--- a/android/guava/src/com/google/common/cache/LongAddable.java
+++ b/android/guava/src/com/google/common/cache/LongAddable.java
@@ -22,6 +22,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 interface LongAddable {
   void increment();
 
diff --git a/android/guava/src/com/google/common/cache/LongAddables.java b/android/guava/src/com/google/common/cache/LongAddables.java
index 203d2ef..b0f9e2b 100644
--- a/android/guava/src/com/google/common/cache/LongAddables.java
+++ b/android/guava/src/com/google/common/cache/LongAddables.java
@@ -24,6 +24,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class LongAddables {
   private static final Supplier<LongAddable> SUPPLIER;
 
diff --git a/android/guava/src/com/google/common/cache/LongAdder.java b/android/guava/src/com/google/common/cache/LongAdder.java
index f0c44ff..7ead7e8 100644
--- a/android/guava/src/com/google/common/cache/LongAdder.java
+++ b/android/guava/src/com/google/common/cache/LongAdder.java
@@ -40,6 +40,7 @@
  * @author Doug Lea
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class LongAdder extends Striped64 implements Serializable, LongAddable {
   private static final long serialVersionUID = 7249069246863182397L;
 
diff --git a/android/guava/src/com/google/common/cache/ParametricNullness.java b/android/guava/src/com/google/common/cache/ParametricNullness.java
new file mode 100644
index 0000000..19305a6
--- /dev/null
+++ b/android/guava/src/com/google/common/cache/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.cache;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/cache/ReferenceEntry.java b/android/guava/src/com/google/common/cache/ReferenceEntry.java
index f9027ab..8ff2e6c 100644
--- a/android/guava/src/com/google/common/cache/ReferenceEntry.java
+++ b/android/guava/src/com/google/common/cache/ReferenceEntry.java
@@ -16,7 +16,7 @@
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.cache.LocalCache.ValueReference;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An entry in a reference map.
@@ -39,22 +39,24 @@
  * </ul>
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 interface ReferenceEntry<K, V> {
   /** Returns the value reference from this entry. */
+  @CheckForNull
   ValueReference<K, V> getValueReference();
 
   /** Sets the value reference for this entry. */
   void setValueReference(ValueReference<K, V> valueReference);
 
   /** Returns the next entry in the chain. */
-  @NullableDecl
+  @CheckForNull
   ReferenceEntry<K, V> getNext();
 
   /** Returns the entry's hash. */
   int getHash();
 
   /** Returns the key for this entry. */
-  @NullableDecl
+  @CheckForNull
   K getKey();
 
   /*
diff --git a/android/guava/src/com/google/common/cache/RemovalCause.java b/android/guava/src/com/google/common/cache/RemovalCause.java
index 8ecc1d6..2e68e68 100644
--- a/android/guava/src/com/google/common/cache/RemovalCause.java
+++ b/android/guava/src/com/google/common/cache/RemovalCause.java
@@ -26,6 +26,7 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public enum RemovalCause {
   /**
    * The entry was manually removed by the user. This can result from the user invoking {@link
diff --git a/android/guava/src/com/google/common/cache/RemovalListener.java b/android/guava/src/com/google/common/cache/RemovalListener.java
index 5e738bf..a7472d7 100644
--- a/android/guava/src/com/google/common/cache/RemovalListener.java
+++ b/android/guava/src/com/google/common/cache/RemovalListener.java
@@ -33,6 +33,7 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public interface RemovalListener<K, V> {
   /**
    * Notifies the listener that a removal occurred at some point in the past.
diff --git a/android/guava/src/com/google/common/cache/RemovalListeners.java b/android/guava/src/com/google/common/cache/RemovalListeners.java
index c82b094..d0623e7 100644
--- a/android/guava/src/com/google/common/cache/RemovalListeners.java
+++ b/android/guava/src/com/google/common/cache/RemovalListeners.java
@@ -26,6 +26,7 @@
  * @since 10.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class RemovalListeners {
 
   private RemovalListeners() {}
diff --git a/android/guava/src/com/google/common/cache/RemovalNotification.java b/android/guava/src/com/google/common/cache/RemovalNotification.java
index e30ec0c..dab7fe5 100644
--- a/android/guava/src/com/google/common/cache/RemovalNotification.java
+++ b/android/guava/src/com/google/common/cache/RemovalNotification.java
@@ -18,7 +18,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.AbstractMap.SimpleImmutableEntry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A notification of the removal of a single entry. The key and/or value may be null if they were
@@ -32,7 +33,9 @@
  * @since 10.0
  */
 @GwtCompatible
-public final class RemovalNotification<K, V> extends SimpleImmutableEntry<K, V> {
+@ElementTypesAreNonnullByDefault
+public final class RemovalNotification<K, V>
+    extends SimpleImmutableEntry<@Nullable K, @Nullable V> {
   private final RemovalCause cause;
 
   /**
@@ -43,11 +46,11 @@
    * @since 19.0
    */
   public static <K, V> RemovalNotification<K, V> create(
-      @NullableDecl K key, @NullableDecl V value, RemovalCause cause) {
+      @CheckForNull K key, @CheckForNull V value, RemovalCause cause) {
     return new RemovalNotification(key, value, cause);
   }
 
-  private RemovalNotification(@NullableDecl K key, @NullableDecl V value, RemovalCause cause) {
+  private RemovalNotification(@CheckForNull K key, @CheckForNull V value, RemovalCause cause) {
     super(key, value);
     this.cause = checkNotNull(cause);
   }
diff --git a/android/guava/src/com/google/common/cache/Striped64.java b/android/guava/src/com/google/common/cache/Striped64.java
index 676e09a..0d2d75b 100644
--- a/android/guava/src/com/google/common/cache/Striped64.java
+++ b/android/guava/src/com/google/common/cache/Striped64.java
@@ -13,7 +13,8 @@
 
 import com.google.common.annotations.GwtIncompatible;
 import java.util.Random;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A package-local class holding common representation and mechanics for classes supporting dynamic
@@ -21,6 +22,7 @@
  * so.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class Striped64 extends Number {
   /*
    * This class maintains a lazily-initialized table of atomically
@@ -125,7 +127,7 @@
    * class, we use a suboptimal int[] representation to avoid introducing a new type that can impede
    * class-unloading when ThreadLocals are not removed.
    */
-  static final ThreadLocal<int[]> threadHashCode = new ThreadLocal<>();
+  static final ThreadLocal<int @Nullable []> threadHashCode = new ThreadLocal<>();
 
   /** Generator of new random hash codes */
   static final Random rng = new Random();
@@ -134,7 +136,7 @@
   static final int NCPU = Runtime.getRuntime().availableProcessors();
 
   /** Table of cells. When non-null, size is a power of 2. */
-  @NullableDecl transient volatile Cell[] cells;
+  @CheckForNull transient volatile Cell[] cells;
 
   /**
    * Base value, used mainly when there is no contention, but also as a fallback during table
@@ -177,7 +179,7 @@
    * @param hc the hash code holder
    * @param wasUncontended false if CAS failed before call
    */
-  final void retryUpdate(long x, int[] hc, boolean wasUncontended) {
+  final void retryUpdate(long x, @CheckForNull int[] hc, boolean wasUncontended) {
     int h;
     if (hc == null) {
       threadHashCode.set(hc = new int[1]); // Initialize randomly
diff --git a/android/guava/src/com/google/common/cache/Weigher.java b/android/guava/src/com/google/common/cache/Weigher.java
index cf552d4..d5bcd5b 100644
--- a/android/guava/src/com/google/common/cache/Weigher.java
+++ b/android/guava/src/com/google/common/cache/Weigher.java
@@ -23,6 +23,7 @@
  * @since 11.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public interface Weigher<K, V> {
 
   /**
diff --git a/android/guava/src/com/google/common/collect/AbstractBiMap.java b/android/guava/src/com/google/common/collect/AbstractBiMap.java
index 0b314ae..151764b 100644
--- a/android/guava/src/com/google/common/collect/AbstractBiMap.java
+++ b/android/guava/src/com/google/common/collect/AbstractBiMap.java
@@ -18,7 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -34,7 +34,8 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A general-purpose bimap implementation using any two backing {@code Map} instances.
@@ -46,11 +47,12 @@
  * @author Mike Bostock
  */
 @GwtCompatible(emulated = true)
-abstract class AbstractBiMap<K, V> extends ForwardingMap<K, V>
-    implements BiMap<K, V>, Serializable {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractBiMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingMap<K, V> implements BiMap<K, V>, Serializable {
 
-  @NullableDecl private transient Map<K, V> delegate;
-  @RetainedWith @NullableDecl transient AbstractBiMap<V, K> inverse;
+  private transient Map<K, V> delegate;
+  @RetainedWith transient AbstractBiMap<V, K> inverse;
 
   /** Package-private constructor for creating a map-backed bimap. */
   AbstractBiMap(Map<K, V> forward, Map<V, K> backward) {
@@ -70,13 +72,15 @@
 
   /** Returns its input, or throws an exception if this is not a valid key. */
   @CanIgnoreReturnValue
-  K checkKey(@NullableDecl K key) {
+  @ParametricNullness
+  K checkKey(@ParametricNullness K key) {
     return key;
   }
 
   /** Returns its input, or throws an exception if this is not a valid value. */
   @CanIgnoreReturnValue
-  V checkValue(@NullableDecl V value) {
+  @ParametricNullness
+  V checkValue(@ParametricNullness V value) {
     return value;
   }
 
@@ -105,7 +109,7 @@
   // Query Operations (optimizations)
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return inverse.containsKey(value);
   }
 
@@ -113,17 +117,20 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V put(@NullableDecl K key, @NullableDecl V value) {
+  @CheckForNull
+  public V put(@ParametricNullness K key, @ParametricNullness V value) {
     return putInBothMaps(key, value, false);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public V forcePut(@NullableDecl K key, @NullableDecl V value) {
+  @CheckForNull
+  public V forcePut(@ParametricNullness K key, @ParametricNullness V value) {
     return putInBothMaps(key, value, true);
   }
 
-  private V putInBothMaps(@NullableDecl K key, @NullableDecl V value, boolean force) {
+  @CheckForNull
+  private V putInBothMaps(@ParametricNullness K key, @ParametricNullness V value, boolean force) {
     checkKey(key);
     checkValue(value);
     boolean containedKey = containsKey(key);
@@ -140,27 +147,35 @@
     return oldValue;
   }
 
-  private void updateInverseMap(K key, boolean containedKey, V oldValue, V newValue) {
+  private void updateInverseMap(
+      @ParametricNullness K key,
+      boolean containedKey,
+      @CheckForNull V oldValue,
+      @ParametricNullness V newValue) {
     if (containedKey) {
-      removeFromInverseMap(oldValue);
+      // The cast is safe because of the containedKey check.
+      removeFromInverseMap(uncheckedCastNullableTToT(oldValue));
     }
     inverse.delegate.put(newValue, key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(@NullableDecl Object key) {
+  @CheckForNull
+  public V remove(@CheckForNull Object key) {
     return containsKey(key) ? removeFromBothMaps(key) : null;
   }
 
   @CanIgnoreReturnValue
-  private V removeFromBothMaps(Object key) {
-    V oldValue = delegate.remove(key);
+  @ParametricNullness
+  private V removeFromBothMaps(@CheckForNull Object key) {
+    // The cast is safe because the callers of this method first check that the key is present.
+    V oldValue = uncheckedCastNullableTToT(delegate.remove(key));
     removeFromInverseMap(oldValue);
     return oldValue;
   }
 
-  private void removeFromInverseMap(V oldValue) {
+  private void removeFromInverseMap(@ParametricNullness V oldValue) {
     inverse.delegate.remove(oldValue);
   }
 
@@ -186,7 +201,7 @@
     return inverse;
   }
 
-  @NullableDecl private transient Set<K> keySet;
+  @CheckForNull private transient Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -207,7 +222,7 @@
     }
 
     @Override
-    public boolean remove(Object key) {
+    public boolean remove(@CheckForNull Object key) {
       if (!contains(key)) {
         return false;
       }
@@ -231,7 +246,7 @@
     }
   }
 
-  @NullableDecl private transient Set<V> valueSet;
+  @CheckForNull private transient Set<V> valueSet;
 
   @Override
   public Set<V> values() {
@@ -258,12 +273,13 @@
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       return standardToArray();
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // bug in our checker's handling of toArray signatures
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return standardToArray(array);
     }
 
@@ -273,7 +289,7 @@
     }
   }
 
-  @NullableDecl private transient Set<Entry<K, V>> entrySet;
+  @CheckForNull private transient Set<Entry<K, V>> entrySet;
 
   @Override
   public Set<Entry<K, V>> entrySet() {
@@ -313,7 +329,7 @@
   Iterator<Entry<K, V>> entrySetIterator() {
     final Iterator<Entry<K, V>> iterator = delegate.entrySet().iterator();
     return new Iterator<Entry<K, V>>() {
-      @NullableDecl Entry<K, V> entry;
+      @CheckForNull Entry<K, V> entry;
 
       @Override
       public boolean hasNext() {
@@ -328,7 +344,9 @@
 
       @Override
       public void remove() {
-        checkRemove(entry != null);
+        if (entry == null) {
+          throw new IllegalStateException("no calls to next() since the last call to remove()");
+        }
         V value = entry.getValue();
         iterator.remove();
         removeFromInverseMap(value);
@@ -352,12 +370,15 @@
     }
 
     @Override
-    public boolean remove(Object object) {
-      if (!esDelegate.contains(object)) {
+    public boolean remove(@CheckForNull Object object) {
+      /*
+       * `o instanceof Entry` is guaranteed by `contains`, but we check it here to satisfy our
+       * nullness checker.
+       */
+      if (!esDelegate.contains(object) || !(object instanceof Entry)) {
         return false;
       }
 
-      // safe because esDelegate.contains(object).
       Entry<?, ?> entry = (Entry<?, ?>) object;
       inverse.delegate.remove(entry.getValue());
       /*
@@ -378,16 +399,24 @@
 
     @Override
     public Object[] toArray() {
-      return standardToArray();
+      /*
+       * standardToArray returns `@Nullable Object[]` rather than `Object[]` but only because it can
+       * be used with collections that may contain null. This collection never contains nulls, so we
+       * can treat it as a plain `Object[]`.
+       */
+      @SuppressWarnings("nullness")
+      Object[] result = standardToArray();
+      return result;
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // bug in our checker's handling of toArray signatures
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return standardToArray(array);
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return Maps.containsEntryImpl(delegate(), o);
     }
 
@@ -408,7 +437,8 @@
   }
 
   /** The inverse of any other {@code AbstractBiMap} subclass. */
-  static class Inverse<K, V> extends AbstractBiMap<K, V> {
+  static class Inverse<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractBiMap<K, V> {
     Inverse(Map<K, V> backward, AbstractBiMap<V, K> forward) {
       super(backward, forward);
     }
@@ -423,12 +453,14 @@
      */
 
     @Override
-    K checkKey(K key) {
+    @ParametricNullness
+    K checkKey(@ParametricNullness K key) {
       return inverse.checkValue(key);
     }
 
     @Override
-    V checkValue(V value) {
+    @ParametricNullness
+    V checkValue(@ParametricNullness V value) {
       return inverse.checkKey(value);
     }
 
diff --git a/android/guava/src/com/google/common/collect/AbstractIndexedListIterator.java b/android/guava/src/com/google/common/collect/AbstractIndexedListIterator.java
index 855fb1c..abb3960 100644
--- a/android/guava/src/com/google/common/collect/AbstractIndexedListIterator.java
+++ b/android/guava/src/com/google/common/collect/AbstractIndexedListIterator.java
@@ -21,6 +21,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.ListIterator;
 import java.util.NoSuchElementException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * This class provides a skeletal implementation of the {@link ListIterator} interface across a
@@ -30,11 +31,14 @@
  * @author Jared Levy
  */
 @GwtCompatible
-abstract class AbstractIndexedListIterator<E> extends UnmodifiableListIterator<E> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractIndexedListIterator<E extends @Nullable Object>
+    extends UnmodifiableListIterator<E> {
   private final int size;
   private int position;
 
   /** Returns the element with the specified index. This method is called by {@link #next()}. */
+  @ParametricNullness
   protected abstract E get(int index);
 
   /**
@@ -70,6 +74,7 @@
   }
 
   @Override
+  @ParametricNullness
   public final E next() {
     if (!hasNext()) {
       throw new NoSuchElementException();
@@ -88,6 +93,7 @@
   }
 
   @Override
+  @ParametricNullness
   public final E previous() {
     if (!hasPrevious()) {
       throw new NoSuchElementException();
diff --git a/android/guava/src/com/google/common/collect/AbstractIterator.java b/android/guava/src/com/google/common/collect/AbstractIterator.java
index ea5ea7a..66273f4 100644
--- a/android/guava/src/com/google/common/collect/AbstractIterator.java
+++ b/android/guava/src/com/google/common/collect/AbstractIterator.java
@@ -17,11 +17,13 @@
 package com.google.common.collect;
 
 import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * This class provides a skeletal implementation of the {@code Iterator} interface, to make this
@@ -61,7 +63,8 @@
 // When making changes to this class, please also update the copy at
 // com.google.common.base.AbstractIterator
 @GwtCompatible
-public abstract class AbstractIterator<T> extends UnmodifiableIterator<T> {
+@ElementTypesAreNonnullByDefault
+public abstract class AbstractIterator<T extends @Nullable Object> extends UnmodifiableIterator<T> {
   private State state = State.NOT_READY;
 
   /** Constructor for use by subclasses. */
@@ -81,7 +84,7 @@
     FAILED,
   }
 
-  @NullableDecl private T next;
+  @CheckForNull private T next;
 
   /**
    * Returns the next element. <b>Note:</b> the implementation must call {@link #endOfData()} when
@@ -107,6 +110,7 @@
    *     this method. Any further attempts to use the iterator will result in an {@link
    *     IllegalStateException}.
    */
+  @CheckForNull
   protected abstract T computeNext();
 
   /**
@@ -117,6 +121,7 @@
    *     simple statement {@code return endOfData();}
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   protected final T endOfData() {
     state = State.DONE;
     return null;
@@ -148,12 +153,14 @@
 
   @CanIgnoreReturnValue // TODO(kak): Should we remove this?
   @Override
+  @ParametricNullness
   public final T next() {
     if (!hasNext()) {
       throw new NoSuchElementException();
     }
     state = State.NOT_READY;
-    T result = next;
+    // Safe because hasNext() ensures that tryToComputeNext() has put a T into `next`.
+    T result = uncheckedCastNullableTToT(next);
     next = null;
     return result;
   }
@@ -165,10 +172,12 @@
    * <p>Implementations of {@code AbstractIterator} that wish to expose this functionality should
    * implement {@code PeekingIterator}.
    */
+  @ParametricNullness
   public final T peek() {
     if (!hasNext()) {
       throw new NoSuchElementException();
     }
-    return next;
+    // Safe because hasNext() ensures that tryToComputeNext() has put a T into `next`.
+    return uncheckedCastNullableTToT(next);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/AbstractListMultimap.java b/android/guava/src/com/google/common/collect/AbstractListMultimap.java
index 4f075d1..46c4ee2 100644
--- a/android/guava/src/com/google/common/collect/AbstractListMultimap.java
+++ b/android/guava/src/com/google/common/collect/AbstractListMultimap.java
@@ -22,7 +22,8 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Basic implementation of the {@link ListMultimap} interface. It's a wrapper around {@link
@@ -33,8 +34,9 @@
  * @since 2.0
  */
 @GwtCompatible
-abstract class AbstractListMultimap<K, V> extends AbstractMapBasedMultimap<K, V>
-    implements ListMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMapBasedMultimap<K, V> implements ListMultimap<K, V> {
   /**
    * Creates a new multimap that uses the provided map.
    *
@@ -53,12 +55,13 @@
   }
 
   @Override
-  <E> Collection<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+  <E extends @Nullable Object> Collection<E> unmodifiableCollectionSubclass(
+      Collection<E> collection) {
     return Collections.unmodifiableList((List<E>) collection);
   }
 
   @Override
-  Collection<V> wrapCollection(K key, Collection<V> collection) {
+  Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
     return wrapList(key, (List<V>) collection, null);
   }
 
@@ -72,7 +75,7 @@
    * Multimap} interface.
    */
   @Override
-  public List<V> get(@NullableDecl K key) {
+  public List<V> get(@ParametricNullness K key) {
     return (List<V>) super.get(key);
   }
 
@@ -85,7 +88,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public List<V> removeAll(@NullableDecl Object key) {
+  public List<V> removeAll(@CheckForNull Object key) {
     return (List<V>) super.removeAll(key);
   }
 
@@ -98,7 +101,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public List<V> replaceValues(@NullableDecl K key, Iterable<? extends V> values) {
+  public List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (List<V>) super.replaceValues(key, values);
   }
 
@@ -111,7 +114,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public boolean put(@NullableDecl K key, @NullableDecl V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     return super.put(key, value);
   }
 
@@ -133,7 +136,7 @@
    * in the same order. If the value orderings disagree, the multimaps will not be considered equal.
    */
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return super.equals(object);
   }
 
diff --git a/android/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java b/android/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
index b72f135..72cf8f1 100644
--- a/android/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
+++ b/android/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
@@ -18,7 +18,9 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.Maps.ViewCachingAbstractMap;
@@ -40,7 +42,8 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Basic implementation of the {@link Multimap} interface. This class represents a multimap as a map
@@ -81,8 +84,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class AbstractMapBasedMultimap<K, V> extends AbstractMultimap<K, V>
-    implements Serializable {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractMapBasedMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMultimap<K, V> implements Serializable {
   /*
    * Here's an outline of the overall design.
    *
@@ -155,7 +159,7 @@
    * @param key key to associate with values in the collection
    * @return an empty collection of values
    */
-  Collection<V> createCollection(@NullableDecl K key) {
+  Collection<V> createCollection(@ParametricNullness K key) {
     return createCollection();
   }
 
@@ -171,14 +175,14 @@
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return map.containsKey(key);
   }
 
   // Modification Operations
 
   @Override
-  public boolean put(@NullableDecl K key, @NullableDecl V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     Collection<V> collection = map.get(key);
     if (collection == null) {
       collection = createCollection(key);
@@ -197,7 +201,7 @@
     }
   }
 
-  private Collection<V> getOrCreateCollection(@NullableDecl K key) {
+  private Collection<V> getOrCreateCollection(@ParametricNullness K key) {
     Collection<V> collection = map.get(key);
     if (collection == null) {
       collection = createCollection(key);
@@ -214,7 +218,7 @@
    * <p>The returned collection is immutable.
    */
   @Override
-  public Collection<V> replaceValues(@NullableDecl K key, Iterable<? extends V> values) {
+  public Collection<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     Iterator<? extends V> iterator = values.iterator();
     if (!iterator.hasNext()) {
       return removeAll(key);
@@ -243,7 +247,7 @@
    * <p>The returned collection is immutable.
    */
   @Override
-  public Collection<V> removeAll(@NullableDecl Object key) {
+  public Collection<V> removeAll(@CheckForNull Object key) {
     Collection<V> collection = map.remove(key);
 
     if (collection == null) {
@@ -258,7 +262,8 @@
     return unmodifiableCollectionSubclass(output);
   }
 
-  <E> Collection<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+  <E extends @Nullable Object> Collection<E> unmodifiableCollectionSubclass(
+      Collection<E> collection) {
     return Collections.unmodifiableCollection(collection);
   }
 
@@ -280,7 +285,7 @@
    * <p>The returned collection is not serializable.
    */
   @Override
-  public Collection<V> get(@NullableDecl K key) {
+  public Collection<V> get(@ParametricNullness K key) {
     Collection<V> collection = map.get(key);
     if (collection == null) {
       collection = createCollection(key);
@@ -292,12 +297,12 @@
    * Generates a decorated collection that remains consistent with the values in the multimap for
    * the provided key. Changes to the multimap may alter the returned collection, and vice versa.
    */
-  Collection<V> wrapCollection(@NullableDecl K key, Collection<V> collection) {
+  Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
     return new WrappedCollection(key, collection, null);
   }
 
   final List<V> wrapList(
-      @NullableDecl K key, List<V> list, @NullableDecl WrappedCollection ancestor) {
+      @ParametricNullness K key, List<V> list, @CheckForNull WrappedCollection ancestor) {
     return (list instanceof RandomAccess)
         ? new RandomAccessWrappedList(key, list, ancestor)
         : new WrappedList(key, list, ancestor);
@@ -320,13 +325,15 @@
    */
   @WeakOuter
   class WrappedCollection extends AbstractCollection<V> {
-    @NullableDecl final K key;
+    @ParametricNullness final K key;
     Collection<V> delegate;
-    @NullableDecl final WrappedCollection ancestor;
-    @NullableDecl final Collection<V> ancestorDelegate;
+    @CheckForNull final WrappedCollection ancestor;
+    @CheckForNull final Collection<V> ancestorDelegate;
 
     WrappedCollection(
-        @NullableDecl K key, Collection<V> delegate, @NullableDecl WrappedCollection ancestor) {
+        @ParametricNullness K key,
+        Collection<V> delegate,
+        @CheckForNull WrappedCollection ancestor) {
       this.key = key;
       this.delegate = delegate;
       this.ancestor = ancestor;
@@ -366,6 +373,7 @@
       }
     }
 
+    @ParametricNullness
     K getKey() {
       return key;
     }
@@ -391,7 +399,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
@@ -451,6 +459,7 @@
       }
 
       @Override
+      @ParametricNullness
       public V next() {
         validateIterator();
         return delegateIterator.next();
@@ -470,7 +479,7 @@
     }
 
     @Override
-    public boolean add(V value) {
+    public boolean add(@ParametricNullness V value) {
       refreshIfEmpty();
       boolean wasEmpty = delegate.isEmpty();
       boolean changed = delegate.add(value);
@@ -483,6 +492,7 @@
       return changed;
     }
 
+    @CheckForNull
     WrappedCollection getAncestor() {
       return ancestor;
     }
@@ -507,7 +517,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       refreshIfEmpty();
       return delegate.contains(o);
     }
@@ -530,7 +540,7 @@
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       refreshIfEmpty();
       boolean changed = delegate.remove(o);
       if (changed) {
@@ -569,7 +579,8 @@
     }
   }
 
-  private static <E> Iterator<E> iteratorOrListIterator(Collection<E> collection) {
+  private static <E extends @Nullable Object> Iterator<E> iteratorOrListIterator(
+      Collection<E> collection) {
     return (collection instanceof List)
         ? ((List<E>) collection).listIterator()
         : collection.iterator();
@@ -578,7 +589,7 @@
   /** Set decorator that stays in sync with the multimap values for a key. */
   @WeakOuter
   class WrappedSet extends WrappedCollection implements Set<V> {
-    WrappedSet(@NullableDecl K key, Set<V> delegate) {
+    WrappedSet(@ParametricNullness K key, Set<V> delegate) {
       super(key, delegate, null);
     }
 
@@ -606,7 +617,9 @@
   @WeakOuter
   class WrappedSortedSet extends WrappedCollection implements SortedSet<V> {
     WrappedSortedSet(
-        @NullableDecl K key, SortedSet<V> delegate, @NullableDecl WrappedCollection ancestor) {
+        @ParametricNullness K key,
+        SortedSet<V> delegate,
+        @CheckForNull WrappedCollection ancestor) {
       super(key, delegate, ancestor);
     }
 
@@ -615,24 +628,27 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super V> comparator() {
       return getSortedSetDelegate().comparator();
     }
 
     @Override
+    @ParametricNullness
     public V first() {
       refreshIfEmpty();
       return getSortedSetDelegate().first();
     }
 
     @Override
+    @ParametricNullness
     public V last() {
       refreshIfEmpty();
       return getSortedSetDelegate().last();
     }
 
     @Override
-    public SortedSet<V> headSet(V toElement) {
+    public SortedSet<V> headSet(@ParametricNullness V toElement) {
       refreshIfEmpty();
       return new WrappedSortedSet(
           getKey(),
@@ -641,7 +657,7 @@
     }
 
     @Override
-    public SortedSet<V> subSet(V fromElement, V toElement) {
+    public SortedSet<V> subSet(@ParametricNullness V fromElement, @ParametricNullness V toElement) {
       refreshIfEmpty();
       return new WrappedSortedSet(
           getKey(),
@@ -650,7 +666,7 @@
     }
 
     @Override
-    public SortedSet<V> tailSet(V fromElement) {
+    public SortedSet<V> tailSet(@ParametricNullness V fromElement) {
       refreshIfEmpty();
       return new WrappedSortedSet(
           getKey(),
@@ -662,7 +678,9 @@
   @WeakOuter
   class WrappedNavigableSet extends WrappedSortedSet implements NavigableSet<V> {
     WrappedNavigableSet(
-        @NullableDecl K key, NavigableSet<V> delegate, @NullableDecl WrappedCollection ancestor) {
+        @ParametricNullness K key,
+        NavigableSet<V> delegate,
+        @CheckForNull WrappedCollection ancestor) {
       super(key, delegate, ancestor);
     }
 
@@ -672,31 +690,37 @@
     }
 
     @Override
-    public V lower(V v) {
+    @CheckForNull
+    public V lower(@ParametricNullness V v) {
       return getSortedSetDelegate().lower(v);
     }
 
     @Override
-    public V floor(V v) {
+    @CheckForNull
+    public V floor(@ParametricNullness V v) {
       return getSortedSetDelegate().floor(v);
     }
 
     @Override
-    public V ceiling(V v) {
+    @CheckForNull
+    public V ceiling(@ParametricNullness V v) {
       return getSortedSetDelegate().ceiling(v);
     }
 
     @Override
-    public V higher(V v) {
+    @CheckForNull
+    public V higher(@ParametricNullness V v) {
       return getSortedSetDelegate().higher(v);
     }
 
     @Override
+    @CheckForNull
     public V pollFirst() {
       return Iterators.pollNext(iterator());
     }
 
     @Override
+    @CheckForNull
     public V pollLast() {
       return Iterators.pollNext(descendingIterator());
     }
@@ -717,18 +741,21 @@
 
     @Override
     public NavigableSet<V> subSet(
-        V fromElement, boolean fromInclusive, V toElement, boolean toInclusive) {
+        @ParametricNullness V fromElement,
+        boolean fromInclusive,
+        @ParametricNullness V toElement,
+        boolean toInclusive) {
       return wrap(
           getSortedSetDelegate().subSet(fromElement, fromInclusive, toElement, toInclusive));
     }
 
     @Override
-    public NavigableSet<V> headSet(V toElement, boolean inclusive) {
+    public NavigableSet<V> headSet(@ParametricNullness V toElement, boolean inclusive) {
       return wrap(getSortedSetDelegate().headSet(toElement, inclusive));
     }
 
     @Override
-    public NavigableSet<V> tailSet(V fromElement, boolean inclusive) {
+    public NavigableSet<V> tailSet(@ParametricNullness V fromElement, boolean inclusive) {
       return wrap(getSortedSetDelegate().tailSet(fromElement, inclusive));
     }
   }
@@ -736,7 +763,8 @@
   /** List decorator that stays in sync with the multimap values for a key. */
   @WeakOuter
   class WrappedList extends WrappedCollection implements List<V> {
-    WrappedList(@NullableDecl K key, List<V> delegate, @NullableDecl WrappedCollection ancestor) {
+    WrappedList(
+        @ParametricNullness K key, List<V> delegate, @CheckForNull WrappedCollection ancestor) {
       super(key, delegate, ancestor);
     }
 
@@ -762,19 +790,21 @@
     }
 
     @Override
+    @ParametricNullness
     public V get(int index) {
       refreshIfEmpty();
       return getListDelegate().get(index);
     }
 
     @Override
-    public V set(int index, V element) {
+    @ParametricNullness
+    public V set(int index, @ParametricNullness V element) {
       refreshIfEmpty();
       return getListDelegate().set(index, element);
     }
 
     @Override
-    public void add(int index, V element) {
+    public void add(int index, @ParametricNullness V element) {
       refreshIfEmpty();
       boolean wasEmpty = getDelegate().isEmpty();
       getListDelegate().add(index, element);
@@ -785,6 +815,7 @@
     }
 
     @Override
+    @ParametricNullness
     public V remove(int index) {
       refreshIfEmpty();
       V value = getListDelegate().remove(index);
@@ -794,13 +825,13 @@
     }
 
     @Override
-    public int indexOf(Object o) {
+    public int indexOf(@CheckForNull Object o) {
       refreshIfEmpty();
       return getListDelegate().indexOf(o);
     }
 
     @Override
-    public int lastIndexOf(Object o) {
+    public int lastIndexOf(@CheckForNull Object o) {
       refreshIfEmpty();
       return getListDelegate().lastIndexOf(o);
     }
@@ -844,6 +875,7 @@
       }
 
       @Override
+      @ParametricNullness
       public V previous() {
         return getDelegateListIterator().previous();
       }
@@ -859,12 +891,12 @@
       }
 
       @Override
-      public void set(V value) {
+      public void set(@ParametricNullness V value) {
         getDelegateListIterator().set(value);
       }
 
       @Override
-      public void add(V value) {
+      public void add(@ParametricNullness V value) {
         boolean wasEmpty = isEmpty();
         getDelegateListIterator().add(value);
         totalSize++;
@@ -881,7 +913,7 @@
    */
   private class RandomAccessWrappedList extends WrappedList implements RandomAccess {
     RandomAccessWrappedList(
-        @NullableDecl K key, List<V> delegate, @NullableDecl WrappedCollection ancestor) {
+        @ParametricNullness K key, List<V> delegate, @CheckForNull WrappedCollection ancestor) {
       super(key, delegate, ancestor);
     }
   }
@@ -911,7 +943,7 @@
     public Iterator<K> iterator() {
       final Iterator<Entry<K, Collection<V>>> entryIterator = map().entrySet().iterator();
       return new Iterator<K>() {
-        @NullableDecl Entry<K, Collection<V>> entry;
+        @CheckForNull Entry<K, Collection<V>> entry;
 
         @Override
         public boolean hasNext() {
@@ -919,6 +951,7 @@
         }
 
         @Override
+        @ParametricNullness
         public K next() {
           entry = entryIterator.next();
           return entry.getKey();
@@ -926,7 +959,7 @@
 
         @Override
         public void remove() {
-          checkRemove(entry != null);
+          checkState(entry != null, "no calls to next() since the last call to remove()");
           Collection<V> collection = entry.getValue();
           entryIterator.remove();
           totalSize -= collection.size();
@@ -939,7 +972,7 @@
     // The following methods are included for better performance.
 
     @Override
-    public boolean remove(Object key) {
+    public boolean remove(@CheckForNull Object key) {
       int count = 0;
       Collection<V> collection = map().remove(key);
       if (collection != null) {
@@ -961,7 +994,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       return this == object || this.map().keySet().equals(object);
     }
 
@@ -983,32 +1016,35 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return sortedMap().comparator();
     }
 
     @Override
+    @ParametricNullness
     public K first() {
       return sortedMap().firstKey();
     }
 
     @Override
-    public SortedSet<K> headSet(K toElement) {
+    public SortedSet<K> headSet(@ParametricNullness K toElement) {
       return new SortedKeySet(sortedMap().headMap(toElement));
     }
 
     @Override
+    @ParametricNullness
     public K last() {
       return sortedMap().lastKey();
     }
 
     @Override
-    public SortedSet<K> subSet(K fromElement, K toElement) {
+    public SortedSet<K> subSet(@ParametricNullness K fromElement, @ParametricNullness K toElement) {
       return new SortedKeySet(sortedMap().subMap(fromElement, toElement));
     }
 
     @Override
-    public SortedSet<K> tailSet(K fromElement) {
+    public SortedSet<K> tailSet(@ParametricNullness K fromElement) {
       return new SortedKeySet(sortedMap().tailMap(fromElement));
     }
   }
@@ -1025,31 +1061,37 @@
     }
 
     @Override
-    public K lower(K k) {
+    @CheckForNull
+    public K lower(@ParametricNullness K k) {
       return sortedMap().lowerKey(k);
     }
 
     @Override
-    public K floor(K k) {
+    @CheckForNull
+    public K floor(@ParametricNullness K k) {
       return sortedMap().floorKey(k);
     }
 
     @Override
-    public K ceiling(K k) {
+    @CheckForNull
+    public K ceiling(@ParametricNullness K k) {
       return sortedMap().ceilingKey(k);
     }
 
     @Override
-    public K higher(K k) {
+    @CheckForNull
+    public K higher(@ParametricNullness K k) {
       return sortedMap().higherKey(k);
     }
 
     @Override
+    @CheckForNull
     public K pollFirst() {
       return Iterators.pollNext(iterator());
     }
 
     @Override
+    @CheckForNull
     public K pollLast() {
       return Iterators.pollNext(descendingIterator());
     }
@@ -1065,40 +1107,44 @@
     }
 
     @Override
-    public NavigableSet<K> headSet(K toElement) {
+    public NavigableSet<K> headSet(@ParametricNullness K toElement) {
       return headSet(toElement, false);
     }
 
     @Override
-    public NavigableSet<K> headSet(K toElement, boolean inclusive) {
+    public NavigableSet<K> headSet(@ParametricNullness K toElement, boolean inclusive) {
       return new NavigableKeySet(sortedMap().headMap(toElement, inclusive));
     }
 
     @Override
-    public NavigableSet<K> subSet(K fromElement, K toElement) {
+    public NavigableSet<K> subSet(
+        @ParametricNullness K fromElement, @ParametricNullness K toElement) {
       return subSet(fromElement, true, toElement, false);
     }
 
     @Override
     public NavigableSet<K> subSet(
-        K fromElement, boolean fromInclusive, K toElement, boolean toInclusive) {
+        @ParametricNullness K fromElement,
+        boolean fromInclusive,
+        @ParametricNullness K toElement,
+        boolean toInclusive) {
       return new NavigableKeySet(
           sortedMap().subMap(fromElement, fromInclusive, toElement, toInclusive));
     }
 
     @Override
-    public NavigableSet<K> tailSet(K fromElement) {
+    public NavigableSet<K> tailSet(@ParametricNullness K fromElement) {
       return tailSet(fromElement, true);
     }
 
     @Override
-    public NavigableSet<K> tailSet(K fromElement, boolean inclusive) {
+    public NavigableSet<K> tailSet(@ParametricNullness K fromElement, boolean inclusive) {
       return new NavigableKeySet(sortedMap().tailMap(fromElement, inclusive));
     }
   }
 
   /** Removes all values for the provided key. */
-  private void removeValuesForKey(Object key) {
+  private void removeValuesForKey(@CheckForNull Object key) {
     Collection<V> collection = Maps.safeRemove(map, key);
 
     if (collection != null) {
@@ -1108,10 +1154,10 @@
     }
   }
 
-  private abstract class Itr<T> implements Iterator<T> {
+  private abstract class Itr<T extends @Nullable Object> implements Iterator<T> {
     final Iterator<Entry<K, Collection<V>>> keyIterator;
-    @NullableDecl K key;
-    @NullableDecl Collection<V> collection;
+    @CheckForNull K key;
+    @CheckForNull Collection<V> collection;
     Iterator<V> valueIterator;
 
     Itr() {
@@ -1121,7 +1167,7 @@
       valueIterator = Iterators.emptyModifiableIterator();
     }
 
-    abstract T output(K key, V value);
+    abstract T output(@ParametricNullness K key, @ParametricNullness V value);
 
     @Override
     public boolean hasNext() {
@@ -1136,13 +1182,21 @@
         collection = mapEntry.getValue();
         valueIterator = collection.iterator();
       }
-      return output(key, valueIterator.next());
+      /*
+       * uncheckedCastNullableTToT is safe: The first call to this method always enters the !hasNext() case and
+       * populates key, after which it's never cleared.
+       */
+      return output(uncheckedCastNullableTToT(key), valueIterator.next());
     }
 
     @Override
     public void remove() {
       valueIterator.remove();
-      if (collection.isEmpty()) {
+      /*
+       * requireNonNull is safe because we've already initialized `collection`. If we hadn't, then
+       * valueIterator.remove() would have failed.
+       */
+      if (requireNonNull(collection).isEmpty()) {
         keyIterator.remove();
       }
       totalSize--;
@@ -1169,7 +1223,8 @@
   Iterator<V> valueIterator() {
     return new Itr<V>() {
       @Override
-      V output(K key, V value) {
+      @ParametricNullness
+      V output(@ParametricNullness K key, @ParametricNullness V value) {
         return value;
       }
     };
@@ -1221,7 +1276,7 @@
   Iterator<Entry<K, V>> entryIterator() {
     return new Itr<Entry<K, V>>() {
       @Override
-      Entry<K, V> output(K key, V value) {
+      Entry<K, V> output(@ParametricNullness K key, @ParametricNullness V value) {
         return Maps.immutableEntry(key, value);
       }
     };
@@ -1262,12 +1317,13 @@
     // The following methods are included for performance.
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return Maps.safeContainsKey(submap, key);
     }
 
     @Override
-    public Collection<V> get(Object key) {
+    @CheckForNull
+    public Collection<V> get(@CheckForNull Object key) {
       Collection<V> collection = Maps.safeGet(submap, key);
       if (collection == null) {
         return null;
@@ -1288,7 +1344,8 @@
     }
 
     @Override
-    public Collection<V> remove(Object key) {
+    @CheckForNull
+    public Collection<V> remove(@CheckForNull Object key) {
       Collection<V> collection = submap.remove(key);
       if (collection == null) {
         return null;
@@ -1302,7 +1359,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       return this == object || submap.equals(object);
     }
 
@@ -1345,16 +1402,17 @@
       // The following methods are included for performance.
 
       @Override
-      public boolean contains(Object o) {
+      public boolean contains(@CheckForNull Object o) {
         return Collections2.safeContains(submap.entrySet(), o);
       }
 
       @Override
-      public boolean remove(Object o) {
+      public boolean remove(@CheckForNull Object o) {
         if (!contains(o)) {
           return false;
         }
-        Entry<?, ?> entry = (Entry<?, ?>) o;
+        // requireNonNull is safe because of the contains check.
+        Entry<?, ?> entry = requireNonNull((Entry<?, ?>) o);
         removeValuesForKey(entry.getKey());
         return true;
       }
@@ -1363,7 +1421,7 @@
     /** Iterator across all keys and value collections. */
     class AsMapIterator implements Iterator<Entry<K, Collection<V>>> {
       final Iterator<Entry<K, Collection<V>>> delegateIterator = submap.entrySet().iterator();
-      @NullableDecl Collection<V> collection;
+      @CheckForNull Collection<V> collection;
 
       @Override
       public boolean hasNext() {
@@ -1379,7 +1437,7 @@
 
       @Override
       public void remove() {
-        checkRemove(collection != null);
+        checkState(collection != null, "no calls to next() since the last call to remove()");
         delegateIterator.remove();
         totalSize -= collection.size();
         collection.clear();
@@ -1399,36 +1457,40 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return sortedMap().comparator();
     }
 
     @Override
+    @ParametricNullness
     public K firstKey() {
       return sortedMap().firstKey();
     }
 
     @Override
+    @ParametricNullness
     public K lastKey() {
       return sortedMap().lastKey();
     }
 
     @Override
-    public SortedMap<K, Collection<V>> headMap(K toKey) {
+    public SortedMap<K, Collection<V>> headMap(@ParametricNullness K toKey) {
       return new SortedAsMap(sortedMap().headMap(toKey));
     }
 
     @Override
-    public SortedMap<K, Collection<V>> subMap(K fromKey, K toKey) {
+    public SortedMap<K, Collection<V>> subMap(
+        @ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return new SortedAsMap(sortedMap().subMap(fromKey, toKey));
     }
 
     @Override
-    public SortedMap<K, Collection<V>> tailMap(K fromKey) {
+    public SortedMap<K, Collection<V>> tailMap(@ParametricNullness K fromKey) {
       return new SortedAsMap(sortedMap().tailMap(fromKey));
     }
 
-    @NullableDecl SortedSet<K> sortedKeySet;
+    @CheckForNull SortedSet<K> sortedKeySet;
 
     // returns a SortedSet, even though returning a Set would be sufficient to
     // satisfy the SortedMap.keySet() interface
@@ -1456,71 +1518,84 @@
     }
 
     @Override
-    public Entry<K, Collection<V>> lowerEntry(K key) {
+    @CheckForNull
+    public Entry<K, Collection<V>> lowerEntry(@ParametricNullness K key) {
       Entry<K, Collection<V>> entry = sortedMap().lowerEntry(key);
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
-    public K lowerKey(K key) {
+    @CheckForNull
+    public K lowerKey(@ParametricNullness K key) {
       return sortedMap().lowerKey(key);
     }
 
     @Override
-    public Entry<K, Collection<V>> floorEntry(K key) {
+    @CheckForNull
+    public Entry<K, Collection<V>> floorEntry(@ParametricNullness K key) {
       Entry<K, Collection<V>> entry = sortedMap().floorEntry(key);
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
-    public K floorKey(K key) {
+    @CheckForNull
+    public K floorKey(@ParametricNullness K key) {
       return sortedMap().floorKey(key);
     }
 
     @Override
-    public Entry<K, Collection<V>> ceilingEntry(K key) {
+    @CheckForNull
+    public Entry<K, Collection<V>> ceilingEntry(@ParametricNullness K key) {
       Entry<K, Collection<V>> entry = sortedMap().ceilingEntry(key);
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
-    public K ceilingKey(K key) {
+    @CheckForNull
+    public K ceilingKey(@ParametricNullness K key) {
       return sortedMap().ceilingKey(key);
     }
 
     @Override
-    public Entry<K, Collection<V>> higherEntry(K key) {
+    @CheckForNull
+    public Entry<K, Collection<V>> higherEntry(@ParametricNullness K key) {
       Entry<K, Collection<V>> entry = sortedMap().higherEntry(key);
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
-    public K higherKey(K key) {
+    @CheckForNull
+    public K higherKey(@ParametricNullness K key) {
       return sortedMap().higherKey(key);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, Collection<V>> firstEntry() {
       Entry<K, Collection<V>> entry = sortedMap().firstEntry();
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, Collection<V>> lastEntry() {
       Entry<K, Collection<V>> entry = sortedMap().lastEntry();
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, Collection<V>> pollFirstEntry() {
       return pollAsMapEntry(entrySet().iterator());
     }
 
     @Override
+    @CheckForNull
     public Entry<K, Collection<V>> pollLastEntry() {
       return pollAsMapEntry(descendingMap().entrySet().iterator());
     }
 
+    @CheckForNull
     Entry<K, Collection<V>> pollAsMapEntry(Iterator<Entry<K, Collection<V>>> entryIterator) {
       if (!entryIterator.hasNext()) {
         return null;
@@ -1558,33 +1633,38 @@
     }
 
     @Override
-    public NavigableMap<K, Collection<V>> subMap(K fromKey, K toKey) {
+    public NavigableMap<K, Collection<V>> subMap(
+        @ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return subMap(fromKey, true, toKey, false);
     }
 
     @Override
     public NavigableMap<K, Collection<V>> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return new NavigableAsMap(sortedMap().subMap(fromKey, fromInclusive, toKey, toInclusive));
     }
 
     @Override
-    public NavigableMap<K, Collection<V>> headMap(K toKey) {
+    public NavigableMap<K, Collection<V>> headMap(@ParametricNullness K toKey) {
       return headMap(toKey, false);
     }
 
     @Override
-    public NavigableMap<K, Collection<V>> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, Collection<V>> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return new NavigableAsMap(sortedMap().headMap(toKey, inclusive));
     }
 
     @Override
-    public NavigableMap<K, Collection<V>> tailMap(K fromKey) {
+    public NavigableMap<K, Collection<V>> tailMap(@ParametricNullness K fromKey) {
       return tailMap(fromKey, true);
     }
 
     @Override
-    public NavigableMap<K, Collection<V>> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, Collection<V>> tailMap(
+        @ParametricNullness K fromKey, boolean inclusive) {
       return new NavigableAsMap(sortedMap().tailMap(fromKey, inclusive));
     }
   }
diff --git a/android/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java b/android/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java
index 3ff472a..8c71e68 100644
--- a/android/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java
+++ b/android/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java
@@ -31,11 +31,12 @@
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Basic implementation of {@code Multiset<E>} backed by an instance of {@code
- * AbstractObjectCountMap<E>}.
+ * ObjectCountHashMap<E>}.
  *
  * <p>For serialization to work, the subclass must specify explicit {@code readObject} and {@code
  * writeObject} methods.
@@ -43,19 +44,21 @@
  * @author Kevin Bourrillion
  */
 @GwtCompatible(emulated = true)
-abstract class AbstractMapBasedMultiset<E> extends AbstractMultiset<E> implements Serializable {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractMapBasedMultiset<E extends @Nullable Object> extends AbstractMultiset<E>
+    implements Serializable {
 
   transient ObjectCountHashMap<E> backingMap;
   transient long size;
 
   AbstractMapBasedMultiset(int distinctElements) {
-    init(distinctElements);
+    backingMap = newBackingMap(distinctElements);
   }
 
-  abstract void init(int distinctElements);
+  abstract ObjectCountHashMap<E> newBackingMap(int distinctElements);
 
   @Override
-  public final int count(@NullableDecl Object element) {
+  public final int count(@CheckForNull Object element) {
     return backingMap.get(element);
   }
 
@@ -69,7 +72,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public final int add(@NullableDecl E element, int occurrences) {
+  public final int add(@ParametricNullness E element, int occurrences) {
     if (occurrences == 0) {
       return count(element);
     }
@@ -90,7 +93,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public final int remove(@NullableDecl Object element, int occurrences) {
+  public final int remove(@CheckForNull Object element, int occurrences) {
     if (occurrences == 0) {
       return count(element);
     }
@@ -114,7 +117,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public final int setCount(@NullableDecl E element, int count) {
+  public final int setCount(@ParametricNullness E element, int count) {
     checkNonnegative(count, "count");
     int oldCount = (count == 0) ? backingMap.remove(element) : backingMap.put(element, count);
     size += (count - oldCount);
@@ -122,7 +125,7 @@
   }
 
   @Override
-  public final boolean setCount(@NullableDecl E element, int oldCount, int newCount) {
+  public final boolean setCount(@ParametricNullness E element, int oldCount, int newCount) {
     checkNonnegative(oldCount, "oldCount");
     checkNonnegative(newCount, "newCount");
     int entryIndex = backingMap.indexOf(element);
@@ -160,11 +163,12 @@
    * Skeleton of per-entry iterators. We could push this down and win a few bytes, but it's complex
    * enough it's not especially worth it.
    */
-  abstract class Itr<T> implements Iterator<T> {
+  abstract class Itr<T extends @Nullable Object> implements Iterator<T> {
     int entryIndex = backingMap.firstIndex();
     int toRemove = -1;
     int expectedModCount = backingMap.modCount;
 
+    @ParametricNullness
     abstract T result(int entryIndex);
 
     private void checkForConcurrentModification() {
@@ -180,6 +184,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T next() {
       if (!hasNext()) {
         throw new NoSuchElementException();
@@ -205,6 +210,7 @@
   final Iterator<E> elementIterator() {
     return new Itr<E>() {
       @Override
+      @ParametricNullness
       E result(int entryIndex) {
         return backingMap.getKey(entryIndex);
       }
@@ -258,7 +264,7 @@
   private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
     stream.defaultReadObject();
     int distinctElements = Serialization.readCount(stream);
-    init(ObjectCountHashMap.DEFAULT_SIZE);
+    backingMap = newBackingMap(ObjectCountHashMap.DEFAULT_SIZE);
     Serialization.populateMultiset(this, stream, distinctElements);
   }
 
diff --git a/android/guava/src/com/google/common/collect/AbstractMapEntry.java b/android/guava/src/com/google/common/collect/AbstractMapEntry.java
index 27ea432..e9accf0 100644
--- a/android/guava/src/com/google/common/collect/AbstractMapEntry.java
+++ b/android/guava/src/com/google/common/collect/AbstractMapEntry.java
@@ -19,7 +19,8 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Objects;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of the {@code equals}, {@code hashCode}, and {@code toString} methods of {@code
@@ -28,21 +29,26 @@
  * @author Jared Levy
  */
 @GwtCompatible
-abstract class AbstractMapEntry<K, V> implements Entry<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractMapEntry<K extends @Nullable Object, V extends @Nullable Object>
+    implements Entry<K, V> {
 
   @Override
+  @ParametricNullness
   public abstract K getKey();
 
   @Override
+  @ParametricNullness
   public abstract V getValue();
 
   @Override
-  public V setValue(V value) {
+  @ParametricNullness
+  public V setValue(@ParametricNullness V value) {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Entry) {
       Entry<?, ?> that = (Entry<?, ?>) object;
       return Objects.equal(this.getKey(), that.getKey())
diff --git a/android/guava/src/com/google/common/collect/AbstractMultimap.java b/android/guava/src/com/google/common/collect/AbstractMultimap.java
index 5d03ec9..17e84a6 100644
--- a/android/guava/src/com/google/common/collect/AbstractMultimap.java
+++ b/android/guava/src/com/google/common/collect/AbstractMultimap.java
@@ -20,6 +20,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.WeakOuter;
 import java.util.AbstractCollection;
 import java.util.Collection;
@@ -27,7 +28,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A skeleton {@code Multimap} implementation, not necessarily in terms of a {@code Map}.
@@ -35,14 +37,16 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class AbstractMultimap<K, V> implements Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    implements Multimap<K, V> {
   @Override
   public boolean isEmpty() {
     return size() == 0;
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     for (Collection<V> collection : asMap().values()) {
       if (collection.contains(value)) {
         return true;
@@ -53,27 +57,27 @@
   }
 
   @Override
-  public boolean containsEntry(@NullableDecl Object key, @NullableDecl Object value) {
+  public boolean containsEntry(@CheckForNull Object key, @CheckForNull Object value) {
     Collection<V> collection = asMap().get(key);
     return collection != null && collection.contains(value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean remove(@NullableDecl Object key, @NullableDecl Object value) {
+  public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
     Collection<V> collection = asMap().get(key);
     return collection != null && collection.remove(value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean put(@NullableDecl K key, @NullableDecl V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     return get(key).add(value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean putAll(@NullableDecl K key, Iterable<? extends V> values) {
+  public boolean putAll(@ParametricNullness K key, Iterable<? extends V> values) {
     checkNotNull(values);
     // make sure we only call values.iterator() once
     // and we only call get(key) if values is nonempty
@@ -98,14 +102,14 @@
 
   @CanIgnoreReturnValue
   @Override
-  public Collection<V> replaceValues(@NullableDecl K key, Iterable<? extends V> values) {
+  public Collection<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     checkNotNull(values);
     Collection<V> result = removeAll(key);
     putAll(key, values);
     return result;
   }
 
-  @NullableDecl private transient Collection<Entry<K, V>> entries;
+  @LazyInit @CheckForNull private transient Collection<Entry<K, V>> entries;
 
   @Override
   public Collection<Entry<K, V>> entries() {
@@ -136,14 +140,14 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       return Sets.equalsImpl(this, obj);
     }
   }
 
   abstract Iterator<Entry<K, V>> entryIterator();
 
-  @NullableDecl private transient Set<K> keySet;
+  @LazyInit @CheckForNull private transient Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -153,7 +157,7 @@
 
   abstract Set<K> createKeySet();
 
-  @NullableDecl private transient Multiset<K> keys;
+  @LazyInit @CheckForNull private transient Multiset<K> keys;
 
   @Override
   public Multiset<K> keys() {
@@ -163,7 +167,7 @@
 
   abstract Multiset<K> createKeys();
 
-  @NullableDecl private transient Collection<V> values;
+  @LazyInit @CheckForNull private transient Collection<V> values;
 
   @Override
   public Collection<V> values() {
@@ -186,7 +190,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return AbstractMultimap.this.containsValue(o);
     }
 
@@ -200,7 +204,7 @@
     return Maps.valueIterator(entries().iterator());
   }
 
-  @NullableDecl private transient Map<K, Collection<V>> asMap;
+  @LazyInit @CheckForNull private transient Map<K, Collection<V>> asMap;
 
   @Override
   public Map<K, Collection<V>> asMap() {
@@ -213,7 +217,7 @@
   // Comparison and hashing
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return Multimaps.equalsImpl(this, object);
   }
 
diff --git a/android/guava/src/com/google/common/collect/AbstractMultiset.java b/android/guava/src/com/google/common/collect/AbstractMultiset.java
index c0a7f5e..8203e44 100644
--- a/android/guava/src/com/google/common/collect/AbstractMultiset.java
+++ b/android/guava/src/com/google/common/collect/AbstractMultiset.java
@@ -26,7 +26,8 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * This class provides a skeletal implementation of the {@link Multiset} interface. A new multiset
@@ -42,7 +43,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class AbstractMultiset<E> extends AbstractCollection<E> implements Multiset<E> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractMultiset<E extends @Nullable Object> extends AbstractCollection<E>
+    implements Multiset<E> {
   // Query Operations
 
   @Override
@@ -51,45 +54,45 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object element) {
+  public boolean contains(@CheckForNull Object element) {
     return count(element) > 0;
   }
 
   // Modification Operations
   @CanIgnoreReturnValue
   @Override
-  public final boolean add(@NullableDecl E element) {
+  public final boolean add(@ParametricNullness E element) {
     add(element, 1);
     return true;
   }
 
   @CanIgnoreReturnValue
   @Override
-  public int add(@NullableDecl E element, int occurrences) {
+  public int add(@ParametricNullness E element, int occurrences) {
     throw new UnsupportedOperationException();
   }
 
   @CanIgnoreReturnValue
   @Override
-  public final boolean remove(@NullableDecl Object element) {
+  public final boolean remove(@CheckForNull Object element) {
     return remove(element, 1) > 0;
   }
 
   @CanIgnoreReturnValue
   @Override
-  public int remove(@NullableDecl Object element, int occurrences) {
+  public int remove(@CheckForNull Object element, int occurrences) {
     throw new UnsupportedOperationException();
   }
 
   @CanIgnoreReturnValue
   @Override
-  public int setCount(@NullableDecl E element, int count) {
+  public int setCount(@ParametricNullness E element, int count) {
     return setCountImpl(this, element, count);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean setCount(@NullableDecl E element, int oldCount, int newCount) {
+  public boolean setCount(@ParametricNullness E element, int oldCount, int newCount) {
     return setCountImpl(this, element, oldCount, newCount);
   }
 
@@ -124,7 +127,7 @@
 
   // Views
 
-  @LazyInit @NullableDecl private transient Set<E> elementSet;
+  @LazyInit @CheckForNull private transient Set<E> elementSet;
 
   @Override
   public Set<E> elementSet() {
@@ -158,7 +161,7 @@
 
   abstract Iterator<E> elementIterator();
 
-  @LazyInit @NullableDecl private transient Set<Entry<E>> entrySet;
+  @LazyInit @CheckForNull private transient Set<Entry<E>> entrySet;
 
   @Override
   public Set<Entry<E>> entrySet() {
@@ -204,7 +207,7 @@
    * and if, for each element, the two multisets have the same count.
    */
   @Override
-  public final boolean equals(@NullableDecl Object object) {
+  public final boolean equals(@CheckForNull Object object) {
     return Multisets.equalsImpl(this, object);
   }
 
diff --git a/android/guava/src/com/google/common/collect/AbstractNavigableMap.java b/android/guava/src/com/google/common/collect/AbstractNavigableMap.java
index e5259e8..47048d0 100644
--- a/android/guava/src/com/google/common/collect/AbstractNavigableMap.java
+++ b/android/guava/src/com/google/common/collect/AbstractNavigableMap.java
@@ -24,7 +24,8 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.SortedMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Skeletal implementation of {@link NavigableMap}.
@@ -32,38 +33,40 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
-abstract class AbstractNavigableMap<K, V> extends IteratorBasedAbstractMap<K, V>
-    implements NavigableMap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractNavigableMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends IteratorBasedAbstractMap<K, V> implements NavigableMap<K, V> {
 
   @Override
-  @NullableDecl
-  public abstract V get(@NullableDecl Object key);
+  @CheckForNull
+  public abstract V get(@CheckForNull Object key);
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public Entry<K, V> firstEntry() {
     return Iterators.getNext(entryIterator(), null);
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public Entry<K, V> lastEntry() {
     return Iterators.getNext(descendingEntryIterator(), null);
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public Entry<K, V> pollFirstEntry() {
     return Iterators.pollNext(entryIterator());
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public Entry<K, V> pollLastEntry() {
     return Iterators.pollNext(descendingEntryIterator());
   }
 
   @Override
+  @ParametricNullness
   public K firstKey() {
     Entry<K, V> entry = firstEntry();
     if (entry == null) {
@@ -74,6 +77,7 @@
   }
 
   @Override
+  @ParametricNullness
   public K lastKey() {
     Entry<K, V> entry = lastEntry();
     if (entry == null) {
@@ -84,63 +88,67 @@
   }
 
   @Override
-  @NullableDecl
-  public Entry<K, V> lowerEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> lowerEntry(@ParametricNullness K key) {
     return headMap(key, false).lastEntry();
   }
 
   @Override
-  @NullableDecl
-  public Entry<K, V> floorEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> floorEntry(@ParametricNullness K key) {
     return headMap(key, true).lastEntry();
   }
 
   @Override
-  @NullableDecl
-  public Entry<K, V> ceilingEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> ceilingEntry(@ParametricNullness K key) {
     return tailMap(key, true).firstEntry();
   }
 
   @Override
-  @NullableDecl
-  public Entry<K, V> higherEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> higherEntry(@ParametricNullness K key) {
     return tailMap(key, false).firstEntry();
   }
 
   @Override
-  public K lowerKey(K key) {
+  @CheckForNull
+  public K lowerKey(@ParametricNullness K key) {
     return Maps.keyOrNull(lowerEntry(key));
   }
 
   @Override
-  public K floorKey(K key) {
+  @CheckForNull
+  public K floorKey(@ParametricNullness K key) {
     return Maps.keyOrNull(floorEntry(key));
   }
 
   @Override
-  public K ceilingKey(K key) {
+  @CheckForNull
+  public K ceilingKey(@ParametricNullness K key) {
     return Maps.keyOrNull(ceilingEntry(key));
   }
 
   @Override
-  public K higherKey(K key) {
+  @CheckForNull
+  public K higherKey(@ParametricNullness K key) {
     return Maps.keyOrNull(higherEntry(key));
   }
 
   abstract Iterator<Entry<K, V>> descendingEntryIterator();
 
   @Override
-  public SortedMap<K, V> subMap(K fromKey, K toKey) {
+  public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
     return subMap(fromKey, true, toKey, false);
   }
 
   @Override
-  public SortedMap<K, V> headMap(K toKey) {
+  public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
     return headMap(toKey, false);
   }
 
   @Override
-  public SortedMap<K, V> tailMap(K fromKey) {
+  public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
     return tailMap(fromKey, true);
   }
 
diff --git a/android/guava/src/com/google/common/collect/AbstractRangeSet.java b/android/guava/src/com/google/common/collect/AbstractRangeSet.java
index 42ae893..032be3d 100644
--- a/android/guava/src/com/google/common/collect/AbstractRangeSet.java
+++ b/android/guava/src/com/google/common/collect/AbstractRangeSet.java
@@ -15,7 +15,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A skeletal implementation of {@code RangeSet}.
@@ -23,6 +23,7 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class AbstractRangeSet<C extends Comparable> implements RangeSet<C> {
   AbstractRangeSet() {}
 
@@ -32,6 +33,7 @@
   }
 
   @Override
+  @CheckForNull
   public abstract Range<C> rangeContaining(C value);
 
   @Override
@@ -102,7 +104,7 @@
   public abstract boolean encloses(Range<C> otherRange);
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     } else if (obj instanceof RangeSet) {
diff --git a/android/guava/src/com/google/common/collect/AbstractSequentialIterator.java b/android/guava/src/com/google/common/collect/AbstractSequentialIterator.java
index bda0692..172fe35 100644
--- a/android/guava/src/com/google/common/collect/AbstractSequentialIterator.java
+++ b/android/guava/src/com/google/common/collect/AbstractSequentialIterator.java
@@ -18,7 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides a skeletal implementation of the {@code Iterator} interface for sequences
@@ -40,14 +40,15 @@
  * @since 12.0 (in Guava as {@code AbstractLinkedIterator} since 8.0)
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractSequentialIterator<T> extends UnmodifiableIterator<T> {
-  @NullableDecl private T nextOrNull;
+  @CheckForNull private T nextOrNull;
 
   /**
    * Creates a new iterator with the given first element, or, if {@code firstOrNull} is null,
    * creates a new empty iterator.
    */
-  protected AbstractSequentialIterator(@NullableDecl T firstOrNull) {
+  protected AbstractSequentialIterator(@CheckForNull T firstOrNull) {
     this.nextOrNull = firstOrNull;
   }
 
@@ -56,7 +57,7 @@
    * remain. This method is invoked during each call to {@link #next()} in order to compute the
    * result of a <i>future</i> call to {@code next()}.
    */
-  @NullableDecl
+  @CheckForNull
   protected abstract T computeNext(T previous);
 
   @Override
@@ -66,13 +67,11 @@
 
   @Override
   public final T next() {
-    if (!hasNext()) {
+    if (nextOrNull == null) {
       throw new NoSuchElementException();
     }
-    try {
-      return nextOrNull;
-    } finally {
-      nextOrNull = computeNext(nextOrNull);
-    }
+    T oldNext = nextOrNull;
+    nextOrNull = computeNext(oldNext);
+    return oldNext;
   }
 }
diff --git a/android/guava/src/com/google/common/collect/AbstractSetMultimap.java b/android/guava/src/com/google/common/collect/AbstractSetMultimap.java
index 2779d1c..90aa9dc 100644
--- a/android/guava/src/com/google/common/collect/AbstractSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/AbstractSetMultimap.java
@@ -23,7 +23,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Basic implementation of the {@link SetMultimap} interface. It's a wrapper around {@link
@@ -33,8 +34,9 @@
  * @author Jared Levy
  */
 @GwtCompatible
-abstract class AbstractSetMultimap<K, V> extends AbstractMapBasedMultimap<K, V>
-    implements SetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMapBasedMultimap<K, V> implements SetMultimap<K, V> {
   /**
    * Creates a new multimap that uses the provided map.
    *
@@ -53,12 +55,13 @@
   }
 
   @Override
-  <E> Collection<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+  <E extends @Nullable Object> Collection<E> unmodifiableCollectionSubclass(
+      Collection<E> collection) {
     return Collections.unmodifiableSet((Set<E>) collection);
   }
 
   @Override
-  Collection<V> wrapCollection(K key, Collection<V> collection) {
+  Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
     return new WrappedSet(key, (Set<V>) collection);
   }
 
@@ -71,7 +74,7 @@
    * {@link Set}, instead of the {@link Collection} specified in the {@link Multimap} interface.
    */
   @Override
-  public Set<V> get(@NullableDecl K key) {
+  public Set<V> get(@ParametricNullness K key) {
     return (Set<V>) super.get(key);
   }
 
@@ -94,7 +97,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public Set<V> removeAll(@NullableDecl Object key) {
+  public Set<V> removeAll(@CheckForNull Object key) {
     return (Set<V>) super.removeAll(key);
   }
 
@@ -108,7 +111,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public Set<V> replaceValues(@NullableDecl K key, Iterable<? extends V> values) {
+  public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (Set<V>) super.replaceValues(key, values);
   }
 
@@ -133,7 +136,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public boolean put(@NullableDecl K key, @NullableDecl V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     return super.put(key, value);
   }
 
@@ -144,7 +147,7 @@
    * Equality does not depend on the ordering of keys or values.
    */
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return super.equals(object);
   }
 
diff --git a/android/guava/src/com/google/common/collect/AbstractSortedKeySortedSetMultimap.java b/android/guava/src/com/google/common/collect/AbstractSortedKeySortedSetMultimap.java
index 0ee6edb..676936f 100644
--- a/android/guava/src/com/google/common/collect/AbstractSortedKeySortedSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/AbstractSortedKeySortedSetMultimap.java
@@ -21,6 +21,7 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Basic implementation of a {@link SortedSetMultimap} with a sorted key set.
@@ -31,7 +32,10 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class AbstractSortedKeySortedSetMultimap<K, V> extends AbstractSortedSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractSortedKeySortedSetMultimap<
+        K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractSortedSetMultimap<K, V> {
 
   AbstractSortedKeySortedSetMultimap(SortedMap<K, Collection<V>> map) {
     super(map);
diff --git a/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java b/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java
index 091bb8c..fd4fce2 100644
--- a/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/AbstractSortedMultiset.java
@@ -21,7 +21,8 @@
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.NavigableSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * This class provides a skeletal implementation of the {@link SortedMultiset} interface.
@@ -33,7 +34,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(emulated = true)
-abstract class AbstractSortedMultiset<E> extends AbstractMultiset<E> implements SortedMultiset<E> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractSortedMultiset<E extends @Nullable Object> extends AbstractMultiset<E>
+    implements SortedMultiset<E> {
   @GwtTransient final Comparator<? super E> comparator;
 
   // needed for serialization
@@ -62,18 +65,21 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     Iterator<Entry<E>> entryIterator = entryIterator();
     return entryIterator.hasNext() ? entryIterator.next() : null;
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     Iterator<Entry<E>> entryIterator = descendingEntryIterator();
     return entryIterator.hasNext() ? entryIterator.next() : null;
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollFirstEntry() {
     Iterator<Entry<E>> entryIterator = entryIterator();
     if (entryIterator.hasNext()) {
@@ -86,6 +92,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollLastEntry() {
     Iterator<Entry<E>> entryIterator = descendingEntryIterator();
     if (entryIterator.hasNext()) {
@@ -99,9 +106,9 @@
 
   @Override
   public SortedMultiset<E> subMultiset(
-      @NullableDecl E fromElement,
+      @ParametricNullness E fromElement,
       BoundType fromBoundType,
-      @NullableDecl E toElement,
+      @ParametricNullness E toElement,
       BoundType toBoundType) {
     // These are checked elsewhere, but NullPointerTester wants them checked eagerly.
     checkNotNull(fromBoundType);
@@ -115,7 +122,7 @@
     return Multisets.iteratorImpl(descendingMultiset());
   }
 
-  @NullableDecl private transient SortedMultiset<E> descendingMultiset;
+  @CheckForNull private transient SortedMultiset<E> descendingMultiset;
 
   @Override
   public SortedMultiset<E> descendingMultiset() {
diff --git a/android/guava/src/com/google/common/collect/AbstractSortedSetMultimap.java b/android/guava/src/com/google/common/collect/AbstractSortedSetMultimap.java
index 6254a6e..3231613 100644
--- a/android/guava/src/com/google/common/collect/AbstractSortedSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/AbstractSortedSetMultimap.java
@@ -23,7 +23,8 @@
 import java.util.Map;
 import java.util.NavigableSet;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Basic implementation of the {@link SortedSetMultimap} interface. It's a wrapper around {@link
@@ -33,8 +34,9 @@
  * @author Jared Levy
  */
 @GwtCompatible
-abstract class AbstractSortedSetMultimap<K, V> extends AbstractSetMultimap<K, V>
-    implements SortedSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractSortedSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractSetMultimap<K, V> implements SortedSetMultimap<K, V> {
   /**
    * Creates a new multimap that uses the provided map.
    *
@@ -53,7 +55,8 @@
   }
 
   @Override
-  <E> SortedSet<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+  <E extends @Nullable Object> SortedSet<E> unmodifiableCollectionSubclass(
+      Collection<E> collection) {
     if (collection instanceof NavigableSet) {
       return Sets.unmodifiableNavigableSet((NavigableSet<E>) collection);
     } else {
@@ -62,7 +65,7 @@
   }
 
   @Override
-  Collection<V> wrapCollection(K key, Collection<V> collection) {
+  Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
     if (collection instanceof NavigableSet) {
       return new WrappedNavigableSet(key, (NavigableSet<V>) collection, null);
     } else {
@@ -83,7 +86,7 @@
    * Multimap} interface.
    */
   @Override
-  public SortedSet<V> get(@NullableDecl K key) {
+  public SortedSet<V> get(@ParametricNullness K key) {
     return (SortedSet<V>) super.get(key);
   }
 
@@ -96,7 +99,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public SortedSet<V> removeAll(@NullableDecl Object key) {
+  public SortedSet<V> removeAll(@CheckForNull Object key) {
     return (SortedSet<V>) super.removeAll(key);
   }
 
@@ -112,7 +115,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public SortedSet<V> replaceValues(@NullableDecl K key, Iterable<? extends V> values) {
+  public SortedSet<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (SortedSet<V>) super.replaceValues(key, values);
   }
 
diff --git a/android/guava/src/com/google/common/collect/AbstractTable.java b/android/guava/src/com/google/common/collect/AbstractTable.java
index 7cb34a6..fe1d4e7 100644
--- a/android/guava/src/com/google/common/collect/AbstractTable.java
+++ b/android/guava/src/com/google/common/collect/AbstractTable.java
@@ -24,7 +24,8 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Skeletal, implementation-agnostic implementation of the {@link Table} interface.
@@ -32,15 +33,18 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class AbstractTable<R, C, V> implements Table<R, C, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractTable<
+        R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+    implements Table<R, C, V> {
 
   @Override
-  public boolean containsRow(@NullableDecl Object rowKey) {
+  public boolean containsRow(@CheckForNull Object rowKey) {
     return Maps.safeContainsKey(rowMap(), rowKey);
   }
 
   @Override
-  public boolean containsColumn(@NullableDecl Object columnKey) {
+  public boolean containsColumn(@CheckForNull Object columnKey) {
     return Maps.safeContainsKey(columnMap(), columnKey);
   }
 
@@ -55,7 +59,7 @@
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     for (Map<C, V> row : rowMap().values()) {
       if (row.containsValue(value)) {
         return true;
@@ -65,13 +69,14 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+  public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Map<C, V> row = Maps.safeGet(rowMap(), rowKey);
     return row != null && Maps.safeContainsKey(row, columnKey);
   }
 
   @Override
-  public V get(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+  @CheckForNull
+  public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Map<C, V> row = Maps.safeGet(rowMap(), rowKey);
     return (row == null) ? null : Maps.safeGet(row, columnKey);
   }
@@ -88,14 +93,17 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+  @CheckForNull
+  public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Map<C, V> row = Maps.safeGet(rowMap(), rowKey);
     return (row == null) ? null : Maps.safeRemove(row, columnKey);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public V put(R rowKey, C columnKey, V value) {
+  @CheckForNull
+  public V put(
+      @ParametricNullness R rowKey, @ParametricNullness C columnKey, @ParametricNullness V value) {
     return row(rowKey).put(columnKey, value);
   }
 
@@ -106,7 +114,7 @@
     }
   }
 
-  @LazyInit @NullableDecl private transient Set<Cell<R, C, V>> cellSet;
+  @LazyInit @CheckForNull private transient Set<Cell<R, C, V>> cellSet;
 
   @Override
   public Set<Cell<R, C, V>> cellSet() {
@@ -123,7 +131,7 @@
   @WeakOuter
   class CellSet extends AbstractSet<Cell<R, C, V>> {
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Cell) {
         Cell<?, ?, ?> cell = (Cell<?, ?, ?>) o;
         Map<C, V> row = Maps.safeGet(rowMap(), cell.getRowKey());
@@ -135,7 +143,7 @@
     }
 
     @Override
-    public boolean remove(@NullableDecl Object o) {
+    public boolean remove(@CheckForNull Object o) {
       if (o instanceof Cell) {
         Cell<?, ?, ?> cell = (Cell<?, ?, ?>) o;
         Map<C, V> row = Maps.safeGet(rowMap(), cell.getRowKey());
@@ -162,7 +170,7 @@
     }
   }
 
-  @LazyInit @NullableDecl private transient Collection<V> values;
+  @LazyInit @CheckForNull private transient Collection<V> values;
 
   @Override
   public Collection<V> values() {
@@ -177,6 +185,7 @@
   Iterator<V> valuesIterator() {
     return new TransformedIterator<Cell<R, C, V>, V>(cellSet().iterator()) {
       @Override
+      @ParametricNullness
       V transform(Cell<R, C, V> cell) {
         return cell.getValue();
       }
@@ -191,7 +200,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return containsValue(o);
     }
 
@@ -207,7 +216,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     return Tables.equalsImpl(this, obj);
   }
 
diff --git a/android/guava/src/com/google/common/collect/AllEqualOrdering.java b/android/guava/src/com/google/common/collect/AllEqualOrdering.java
index bbcd19e..f6ca6fa 100644
--- a/android/guava/src/com/google/common/collect/AllEqualOrdering.java
+++ b/android/guava/src/com/google/common/collect/AllEqualOrdering.java
@@ -19,7 +19,8 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.List;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An ordering that treats all references as equals, even nulls.
@@ -27,27 +28,29 @@
  * @author Emily Soldal
  */
 @GwtCompatible(serializable = true)
-final class AllEqualOrdering extends Ordering<Object> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class AllEqualOrdering extends Ordering<@Nullable Object> implements Serializable {
   static final AllEqualOrdering INSTANCE = new AllEqualOrdering();
 
   @Override
-  public int compare(@NullableDecl Object left, @NullableDecl Object right) {
+  public int compare(@CheckForNull Object left, @CheckForNull Object right) {
     return 0;
   }
 
   @Override
-  public <E> List<E> sortedCopy(Iterable<E> iterable) {
+  public <E extends @Nullable Object> List<E> sortedCopy(Iterable<E> iterable) {
     return Lists.newArrayList(iterable);
   }
 
   @Override
-  public <E> ImmutableList<E> immutableSortedCopy(Iterable<E> iterable) {
+  @SuppressWarnings("nullness") // unsafe: see supertype
+  public <E extends @Nullable Object> ImmutableList<E> immutableSortedCopy(Iterable<E> iterable) {
     return ImmutableList.copyOf(iterable);
   }
 
   @SuppressWarnings("unchecked")
   @Override
-  public <S> Ordering<S> reverse() {
+  public <S extends @Nullable Object> Ordering<S> reverse() {
     return (Ordering<S>) this;
   }
 
diff --git a/android/guava/src/com/google/common/collect/ArrayListMultimap.java b/android/guava/src/com/google/common/collect/ArrayListMultimap.java
index 1faf476..33f4c75 100644
--- a/android/guava/src/com/google/common/collect/ArrayListMultimap.java
+++ b/android/guava/src/com/google/common/collect/ArrayListMultimap.java
@@ -29,6 +29,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@code Multimap} that uses an {@code ArrayList} to store the values for a given
@@ -59,7 +60,8 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public final class ArrayListMultimap<K, V>
+@ElementTypesAreNonnullByDefault
+public final class ArrayListMultimap<K extends @Nullable Object, V extends @Nullable Object>
     extends ArrayListMultimapGwtSerializationDependencies<K, V> {
   // Default from ArrayList
   private static final int DEFAULT_VALUES_PER_KEY = 3;
@@ -72,7 +74,8 @@
    * <p>This method will soon be deprecated in favor of {@code
    * MultimapBuilder.hashKeys().arrayListValues().build()}.
    */
-  public static <K, V> ArrayListMultimap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ArrayListMultimap<K, V> create() {
     return new ArrayListMultimap<>();
   }
 
@@ -88,7 +91,8 @@
    * @throws IllegalArgumentException if {@code expectedKeys} or {@code expectedValuesPerKey} is
    *     negative
    */
-  public static <K, V> ArrayListMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ArrayListMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
     return new ArrayListMultimap<>(expectedKeys, expectedValuesPerKey);
   }
 
@@ -100,7 +104,8 @@
    *
    * @param multimap the multimap whose contents are copied to this multimap
    */
-  public static <K, V> ArrayListMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ArrayListMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
     return new ArrayListMultimap<>(multimap);
   }
 
diff --git a/android/guava/src/com/google/common/collect/ArrayTable.java b/android/guava/src/com/google/common/collect/ArrayTable.java
index c9af17f..ebc9fa0 100644
--- a/android/guava/src/com/google/common/collect/ArrayTable.java
+++ b/android/guava/src/com/google/common/collect/ArrayTable.java
@@ -19,6 +19,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkElementIndex;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Collections.emptyMap;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -26,6 +27,7 @@
 import com.google.common.base.Objects;
 import com.google.common.collect.Maps.IteratorBasedAbstractMap;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.Serializable;
 import java.lang.reflect.Array;
@@ -34,11 +36,22 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Fixed-size {@link Table} implementation backed by a two-dimensional array.
  *
+ * <p><b>Warning:</b> {@code ArrayTable} is rarely the {@link Table} implementation you want. First,
+ * it requires that the complete universe of rows and columns be specified at construction time.
+ * Second, it is always backed by an array large enough to hold a value for every possible
+ * combination of row and column keys. (This is rarely optimal unless the table is extremely dense.)
+ * Finally, every possible combination of row and column keys is always considered to have a value
+ * associated with it: It is not possible to "remove" a value, only to replace it with {@code null},
+ * which will still appear when iterating over the table's contents in a foreach loop or a call to a
+ * null-hostile method like {@link ImmutableTable#copyOf}. For alternatives, please see <a
+ * href="https://github.com/google/guava/wiki/NewCollectionTypesExplained#table">the wiki</a>.
+ *
  * <p>The allowed row and column keys must be supplied when the table is created. The table always
  * contains a mapping for every row key / column pair. The value corresponding to a given row and
  * column is null unless another value is provided.
@@ -77,7 +90,9 @@
  */
 @Beta
 @GwtCompatible(emulated = true)
-public final class ArrayTable<R, C, V> extends AbstractTable<R, C, V> implements Serializable {
+@ElementTypesAreNonnullByDefault
+public final class ArrayTable<R, C, V> extends AbstractTable<R, C, @Nullable V>
+    implements Serializable {
 
   /**
    * Creates an {@code ArrayTable} filled with {@code null}.
@@ -117,8 +132,8 @@
    *
    * @throws NullPointerException if {@code table} has a null key
    */
-  public static <R, C, V> ArrayTable<R, C, V> create(Table<R, C, V> table) {
-    return (table instanceof ArrayTable<?, ?, ?>)
+  public static <R, C, V> ArrayTable<R, C, V> create(Table<R, C, ? extends @Nullable V> table) {
+    return (table instanceof ArrayTable)
         ? new ArrayTable<R, C, V>((ArrayTable<R, C, V>) table)
         : new ArrayTable<R, C, V>(table);
   }
@@ -129,7 +144,7 @@
   // TODO(jlevy): Add getters returning rowKeyToIndex and columnKeyToIndex?
   private final ImmutableMap<R, Integer> rowKeyToIndex;
   private final ImmutableMap<C, Integer> columnKeyToIndex;
-  private final V[][] array;
+  private final @Nullable V[][] array;
 
   private ArrayTable(Iterable<? extends R> rowKeys, Iterable<? extends C> columnKeys) {
     this.rowList = ImmutableList.copyOf(rowKeys);
@@ -146,13 +161,14 @@
     columnKeyToIndex = Maps.indexMap(columnList);
 
     @SuppressWarnings("unchecked")
-    V[][] tmpArray = (V[][]) new Object[rowList.size()][columnList.size()];
+    @Nullable
+    V[][] tmpArray = (@Nullable V[][]) new Object[rowList.size()][columnList.size()];
     array = tmpArray;
     // Necessary because in GWT the arrays are initialized with "undefined" instead of null.
     eraseAll();
   }
 
-  private ArrayTable(Table<R, C, V> table) {
+  private ArrayTable(Table<R, C, ? extends @Nullable V> table) {
     this(table.rowKeySet(), table.columnKeySet());
     putAll(table);
   }
@@ -163,14 +179,16 @@
     rowKeyToIndex = table.rowKeyToIndex;
     columnKeyToIndex = table.columnKeyToIndex;
     @SuppressWarnings("unchecked")
-    V[][] copy = (V[][]) new Object[rowList.size()][columnList.size()];
+    @Nullable
+    V[][] copy = (@Nullable V[][]) new Object[rowList.size()][columnList.size()];
     array = copy;
     for (int i = 0; i < rowList.size(); i++) {
       System.arraycopy(table.array[i], 0, copy[i], 0, table.array[i].length);
     }
   }
 
-  private abstract static class ArrayMap<K, V> extends IteratorBasedAbstractMap<K, V> {
+  private abstract static class ArrayMap<K, V extends @Nullable Object>
+      extends IteratorBasedAbstractMap<K, V> {
     private final ImmutableMap<K, Integer> keyIndex;
 
     private ArrayMap(ImmutableMap<K, Integer> keyIndex) {
@@ -188,11 +206,11 @@
 
     abstract String getKeyRole();
 
-    @NullableDecl
+    @ParametricNullness
     abstract V getValue(int index);
 
-    @NullableDecl
-    abstract V setValue(int index, V newValue);
+    @ParametricNullness
+    abstract V setValue(int index, @ParametricNullness V newValue);
 
     @Override
     public int size() {
@@ -213,12 +231,14 @@
         }
 
         @Override
+        @ParametricNullness
         public V getValue() {
           return ArrayMap.this.getValue(index);
         }
 
         @Override
-        public V setValue(V value) {
+        @ParametricNullness
+        public V setValue(@ParametricNullness V value) {
           return ArrayMap.this.setValue(index, value);
         }
       };
@@ -237,12 +257,13 @@
     // TODO(lowasser): consider an optimized values() implementation
 
     @Override
-    public boolean containsKey(@NullableDecl Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return keyIndex.containsKey(key);
     }
 
+    @CheckForNull
     @Override
-    public V get(@NullableDecl Object key) {
+    public V get(@CheckForNull Object key) {
       Integer index = keyIndex.get(key);
       if (index == null) {
         return null;
@@ -252,7 +273,8 @@
     }
 
     @Override
-    public V put(K key, V value) {
+    @CheckForNull
+    public V put(K key, @ParametricNullness V value) {
       Integer index = keyIndex.get(key);
       if (index == null) {
         throw new IllegalArgumentException(
@@ -262,7 +284,8 @@
     }
 
     @Override
-    public V remove(Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       throw new UnsupportedOperationException();
     }
 
@@ -300,6 +323,7 @@
    *     or equal to the number of allowed row keys, or {@code columnIndex} is greater than or equal
    *     to the number of allowed column keys
    */
+  @CheckForNull
   public V at(int rowIndex, int columnIndex) {
     // In GWT array access never throws IndexOutOfBoundsException.
     checkElementIndex(rowIndex, rowList.size());
@@ -321,7 +345,8 @@
    *     to the number of allowed column keys
    */
   @CanIgnoreReturnValue
-  public V set(int rowIndex, int columnIndex, @NullableDecl V value) {
+  @CheckForNull
+  public V set(int rowIndex, int columnIndex, @CheckForNull V value) {
     // In GWT array access never throws IndexOutOfBoundsException.
     checkElementIndex(rowIndex, rowList.size());
     checkElementIndex(columnIndex, columnList.size());
@@ -340,9 +365,10 @@
    * @param valueClass class of values stored in the returned array
    */
   @GwtIncompatible // reflection
-  public V[][] toArray(Class<V> valueClass) {
+  public @Nullable V[][] toArray(Class<V> valueClass) {
     @SuppressWarnings("unchecked") // TODO: safe?
-    V[][] copy = (V[][]) Array.newInstance(valueClass, rowList.size(), columnList.size());
+    @Nullable
+    V[][] copy = (@Nullable V[][]) Array.newInstance(valueClass, rowList.size(), columnList.size());
     for (int i = 0; i < rowList.size(); i++) {
       System.arraycopy(array[i], 0, copy[i], 0, array[i].length);
     }
@@ -355,6 +381,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link #eraseAll}
    */
+  @DoNotCall("Always throws UnsupportedOperationException")
   @Override
   @Deprecated
   public void clear() {
@@ -363,7 +390,7 @@
 
   /** Associates the value {@code null} with every pair of allowed row and column keys. */
   public void eraseAll() {
-    for (V[] row : array) {
+    for (@Nullable V[] row : array) {
       Arrays.fill(row, null);
     }
   }
@@ -373,7 +400,7 @@
    * constructed.
    */
   @Override
-  public boolean contains(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+  public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return containsRow(rowKey) && containsColumn(columnKey);
   }
 
@@ -382,7 +409,7 @@
    * table was constructed.
    */
   @Override
-  public boolean containsColumn(@NullableDecl Object columnKey) {
+  public boolean containsColumn(@CheckForNull Object columnKey) {
     return columnKeyToIndex.containsKey(columnKey);
   }
 
@@ -391,13 +418,13 @@
    * constructed.
    */
   @Override
-  public boolean containsRow(@NullableDecl Object rowKey) {
+  public boolean containsRow(@CheckForNull Object rowKey) {
     return rowKeyToIndex.containsKey(rowKey);
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
-    for (V[] row : array) {
+  public boolean containsValue(@CheckForNull Object value) {
+    for (@Nullable V[] row : array) {
       for (V element : row) {
         if (Objects.equal(value, element)) {
           return true;
@@ -408,7 +435,8 @@
   }
 
   @Override
-  public V get(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+  @CheckForNull
+  public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Integer rowIndex = rowKeyToIndex.get(rowKey);
     Integer columnIndex = columnKeyToIndex.get(columnKey);
     return (rowIndex == null || columnIndex == null) ? null : at(rowIndex, columnIndex);
@@ -430,7 +458,8 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public V put(R rowKey, C columnKey, @NullableDecl V value) {
+  @CheckForNull
+  public V put(R rowKey, C columnKey, @CheckForNull V value) {
     checkNotNull(rowKey);
     checkNotNull(columnKey);
     Integer rowIndex = rowKeyToIndex.get(rowKey);
@@ -456,7 +485,7 @@
    *     in {@link #rowKeySet()} or {@link #columnKeySet()}
    */
   @Override
-  public void putAll(Table<? extends R, ? extends C, ? extends V> table) {
+  public void putAll(Table<? extends R, ? extends C, ? extends @Nullable V> table) {
     super.putAll(table);
   }
 
@@ -466,10 +495,12 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link #erase}
    */
+  @DoNotCall("Always throws UnsupportedOperationException")
   @CanIgnoreReturnValue
   @Override
   @Deprecated
-  public V remove(Object rowKey, Object columnKey) {
+  @CheckForNull
+  public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     throw new UnsupportedOperationException();
   }
 
@@ -487,7 +518,8 @@
    *     for the keys
    */
   @CanIgnoreReturnValue
-  public V erase(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+  @CheckForNull
+  public V erase(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Integer rowIndex = rowKeyToIndex.get(rowKey);
     Integer columnIndex = columnKeyToIndex.get(columnKey);
     if (rowIndex == null || columnIndex == null) {
@@ -515,22 +547,22 @@
    * @return set of table cells consisting of row key / column key / value triplets
    */
   @Override
-  public Set<Cell<R, C, V>> cellSet() {
+  public Set<Cell<R, C, @Nullable V>> cellSet() {
     return super.cellSet();
   }
 
   @Override
-  Iterator<Cell<R, C, V>> cellIterator() {
-    return new AbstractIndexedListIterator<Cell<R, C, V>>(size()) {
+  Iterator<Cell<R, C, @Nullable V>> cellIterator() {
+    return new AbstractIndexedListIterator<Cell<R, C, @Nullable V>>(size()) {
       @Override
-      protected Cell<R, C, V> get(final int index) {
+      protected Cell<R, C, @Nullable V> get(final int index) {
         return getCell(index);
       }
     };
   }
 
-  private Cell<R, C, V> getCell(final int index) {
-    return new Tables.AbstractCell<R, C, V>() {
+  private Cell<R, C, @Nullable V> getCell(final int index) {
+    return new Tables.AbstractCell<R, C, @Nullable V>() {
       final int rowIndex = index / columnList.size();
       final int columnIndex = index % columnList.size();
 
@@ -545,12 +577,14 @@
       }
 
       @Override
+      @CheckForNull
       public V getValue() {
         return at(rowIndex, columnIndex);
       }
     };
   }
 
+  @CheckForNull
   private V getValue(int index) {
     int rowIndex = index / columnList.size();
     int columnIndex = index % columnList.size();
@@ -569,13 +603,17 @@
    * @return the corresponding map from row keys to values
    */
   @Override
-  public Map<R, V> column(C columnKey) {
+  public Map<R, @Nullable V> column(C columnKey) {
     checkNotNull(columnKey);
     Integer columnIndex = columnKeyToIndex.get(columnKey);
-    return (columnIndex == null) ? ImmutableMap.<R, V>of() : new Column(columnIndex);
+    if (columnIndex == null) {
+      return emptyMap();
+    } else {
+      return new Column(columnIndex);
+    }
   }
 
-  private class Column extends ArrayMap<R, V> {
+  private class Column extends ArrayMap<R, @Nullable V> {
     final int columnIndex;
 
     Column(int columnIndex) {
@@ -589,12 +627,14 @@
     }
 
     @Override
+    @CheckForNull
     V getValue(int index) {
       return at(index, columnIndex);
     }
 
     @Override
-    V setValue(int index, V newValue) {
+    @CheckForNull
+    V setValue(int index, @CheckForNull V newValue) {
       return set(index, columnIndex, newValue);
     }
   }
@@ -610,16 +650,16 @@
     return columnKeyToIndex.keySet();
   }
 
-  @NullableDecl private transient ColumnMap columnMap;
+  @CheckForNull private transient ColumnMap columnMap;
 
   @Override
-  public Map<C, Map<R, V>> columnMap() {
+  public Map<C, Map<R, @Nullable V>> columnMap() {
     ColumnMap map = columnMap;
     return (map == null) ? columnMap = new ColumnMap() : map;
   }
 
   @WeakOuter
-  private class ColumnMap extends ArrayMap<C, Map<R, V>> {
+  private class ColumnMap extends ArrayMap<C, Map<R, @Nullable V>> {
     private ColumnMap() {
       super(columnKeyToIndex);
     }
@@ -630,17 +670,18 @@
     }
 
     @Override
-    Map<R, V> getValue(int index) {
+    Map<R, @Nullable V> getValue(int index) {
       return new Column(index);
     }
 
     @Override
-    Map<R, V> setValue(int index, Map<R, V> newValue) {
+    Map<R, @Nullable V> setValue(int index, Map<R, @Nullable V> newValue) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Map<R, V> put(C key, Map<R, V> value) {
+    @CheckForNull
+    public Map<R, @Nullable V> put(C key, Map<R, @Nullable V> value) {
       throw new UnsupportedOperationException();
     }
   }
@@ -657,13 +698,17 @@
    * @return the corresponding map from column keys to values
    */
   @Override
-  public Map<C, V> row(R rowKey) {
+  public Map<C, @Nullable V> row(R rowKey) {
     checkNotNull(rowKey);
     Integer rowIndex = rowKeyToIndex.get(rowKey);
-    return (rowIndex == null) ? ImmutableMap.<C, V>of() : new Row(rowIndex);
+    if (rowIndex == null) {
+      return emptyMap();
+    } else {
+      return new Row(rowIndex);
+    }
   }
 
-  private class Row extends ArrayMap<C, V> {
+  private class Row extends ArrayMap<C, @Nullable V> {
     final int rowIndex;
 
     Row(int rowIndex) {
@@ -677,12 +722,14 @@
     }
 
     @Override
+    @CheckForNull
     V getValue(int index) {
       return at(rowIndex, index);
     }
 
     @Override
-    V setValue(int index, V newValue) {
+    @CheckForNull
+    V setValue(int index, @CheckForNull V newValue) {
       return set(rowIndex, index, newValue);
     }
   }
@@ -698,16 +745,16 @@
     return rowKeyToIndex.keySet();
   }
 
-  @NullableDecl private transient RowMap rowMap;
+  @CheckForNull private transient RowMap rowMap;
 
   @Override
-  public Map<R, Map<C, V>> rowMap() {
+  public Map<R, Map<C, @Nullable V>> rowMap() {
     RowMap map = rowMap;
     return (map == null) ? rowMap = new RowMap() : map;
   }
 
   @WeakOuter
-  private class RowMap extends ArrayMap<R, Map<C, V>> {
+  private class RowMap extends ArrayMap<R, Map<C, @Nullable V>> {
     private RowMap() {
       super(rowKeyToIndex);
     }
@@ -718,17 +765,18 @@
     }
 
     @Override
-    Map<C, V> getValue(int index) {
+    Map<C, @Nullable V> getValue(int index) {
       return new Row(index);
     }
 
     @Override
-    Map<C, V> setValue(int index, Map<C, V> newValue) {
+    Map<C, @Nullable V> setValue(int index, Map<C, @Nullable V> newValue) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Map<C, V> put(R key, Map<C, V> value) {
+    @CheckForNull
+    public Map<C, @Nullable V> put(R key, Map<C, @Nullable V> value) {
       throw new UnsupportedOperationException();
     }
   }
@@ -743,14 +791,15 @@
    * @return collection of values
    */
   @Override
-  public Collection<V> values() {
+  public Collection<@Nullable V> values() {
     return super.values();
   }
 
   @Override
-  Iterator<V> valuesIterator() {
-    return new AbstractIndexedListIterator<V>(size()) {
+  Iterator<@Nullable V> valuesIterator() {
+    return new AbstractIndexedListIterator<@Nullable V>(size()) {
       @Override
+      @CheckForNull
       protected V get(int index) {
         return getValue(index);
       }
diff --git a/android/guava/src/com/google/common/collect/BaseImmutableMultimap.java b/android/guava/src/com/google/common/collect/BaseImmutableMultimap.java
index 6ebdf14..2e69c2a 100644
--- a/android/guava/src/com/google/common/collect/BaseImmutableMultimap.java
+++ b/android/guava/src/com/google/common/collect/BaseImmutableMultimap.java
@@ -22,4 +22,5 @@
  * retaining additional implementation details of {@link ImmutableMultimap}.
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 abstract class BaseImmutableMultimap<K, V> extends AbstractMultimap<K, V> {}
diff --git a/android/guava/src/com/google/common/collect/BiMap.java b/android/guava/src/com/google/common/collect/BiMap.java
index 0fd75c0..12eb4e3 100644
--- a/android/guava/src/com/google/common/collect/BiMap.java
+++ b/android/guava/src/com/google/common/collect/BiMap.java
@@ -20,7 +20,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A bimap (or "bidirectional map") is a map that preserves the uniqueness of its values as well as
@@ -28,13 +29,14 @@
  * bimap containing the same entries as this bimap but with reversed keys and values.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap"> {@code BiMap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap">{@code BiMap}</a>.
  *
  * @author Kevin Bourrillion
  * @since 2.0
  */
 @GwtCompatible
-public interface BiMap<K, V> extends Map<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface BiMap<K extends @Nullable Object, V extends @Nullable Object> extends Map<K, V> {
   // Modification Operations
 
   /**
@@ -46,8 +48,8 @@
    */
   @CanIgnoreReturnValue
   @Override
-  @NullableDecl
-  V put(@NullableDecl K key, @NullableDecl V value);
+  @CheckForNull
+  V put(@ParametricNullness K key, @ParametricNullness V value);
 
   /**
    * An alternate form of {@code put} that silently removes any existing entry with the value {@code
@@ -62,12 +64,14 @@
    *
    * @param key the key with which the specified value is to be associated
    * @param value the value to be associated with the specified key
-   * @return the value which was previously associated with the key, which may be {@code null}, or
-   *     {@code null} if there was no previous entry
+   * @return the value that was previously associated with the key, or {@code null} if there was no
+   *     previous entry. (If the bimap contains null values, then {@code forcePut}, like {@code
+   *     put}, returns {@code null} both if the key is absent and if it is present with a null
+   *     value.)
    */
   @CanIgnoreReturnValue
-  @NullableDecl
-  V forcePut(@NullableDecl K key, @NullableDecl V value);
+  @CheckForNull
+  V forcePut(@ParametricNullness K key, @ParametricNullness V value);
 
   // Bulk Operations
 
diff --git a/android/guava/src/com/google/common/collect/BoundType.java b/android/guava/src/com/google/common/collect/BoundType.java
index ce03802..00ac08c 100644
--- a/android/guava/src/com/google/common/collect/BoundType.java
+++ b/android/guava/src/com/google/common/collect/BoundType.java
@@ -24,6 +24,7 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public enum BoundType {
   /** The endpoint value <i>is not</i> considered part of the set ("exclusive"). */
   OPEN(false),
@@ -39,8 +40,4 @@
   static BoundType forBoolean(boolean inclusive) {
     return inclusive ? CLOSED : OPEN;
   }
-
-  BoundType flip() {
-    return forBoolean(!inclusive);
-  }
 }
diff --git a/android/guava/src/com/google/common/collect/ByFunctionOrdering.java b/android/guava/src/com/google/common/collect/ByFunctionOrdering.java
index 9e8671b..43ebddd 100644
--- a/android/guava/src/com/google/common/collect/ByFunctionOrdering.java
+++ b/android/guava/src/com/google/common/collect/ByFunctionOrdering.java
@@ -22,14 +22,17 @@
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An ordering that orders elements by applying an order to the result of a function on those
  * elements.
  */
 @GwtCompatible(serializable = true)
-final class ByFunctionOrdering<F, T> extends Ordering<F> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class ByFunctionOrdering<F extends @Nullable Object, T extends @Nullable Object>
+    extends Ordering<F> implements Serializable {
   final Function<F, ? extends T> function;
   final Ordering<T> ordering;
 
@@ -39,12 +42,12 @@
   }
 
   @Override
-  public int compare(F left, F right) {
+  public int compare(@ParametricNullness F left, @ParametricNullness F right) {
     return ordering.compare(function.apply(left), function.apply(right));
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/collect/CartesianList.java b/android/guava/src/com/google/common/collect/CartesianList.java
index 63c7f1a..475b3f2 100644
--- a/android/guava/src/com/google/common/collect/CartesianList.java
+++ b/android/guava/src/com/google/common/collect/CartesianList.java
@@ -22,7 +22,7 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@link Lists#cartesianProduct(List)}.
@@ -30,6 +30,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class CartesianList<E> extends AbstractList<List<E>> implements RandomAccess {
 
   private final transient ImmutableList<List<E>> axes;
@@ -67,7 +68,7 @@
   }
 
   @Override
-  public int indexOf(Object o) {
+  public int indexOf(@CheckForNull Object o) {
     if (!(o instanceof List)) {
       return -1;
     }
@@ -89,7 +90,7 @@
   }
 
   @Override
-  public int lastIndexOf(Object o) {
+  public int lastIndexOf(@CheckForNull Object o) {
     if (!(o instanceof List)) {
       return -1;
     }
@@ -140,7 +141,7 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object object) {
+  public boolean contains(@CheckForNull Object object) {
     if (!(object instanceof List)) {
       return false;
     }
diff --git a/android/guava/src/com/google/common/collect/ClassToInstanceMap.java b/android/guava/src/com/google/common/collect/ClassToInstanceMap.java
index 8d454c0..9bd826f 100644
--- a/android/guava/src/com/google/common/collect/ClassToInstanceMap.java
+++ b/android/guava/src/com/google/common/collect/ClassToInstanceMap.java
@@ -20,7 +20,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A map, each entry of which maps a Java <a href="http://tinyurl.com/2cmwkz">raw type</a> to an
@@ -30,8 +30,19 @@
  * <p>Like any other {@code Map<Class, Object>}, this map may contain entries for primitive types,
  * and a primitive type and its corresponding wrapper type may map to different values.
  *
+ * <p>This class's support for {@code null} requires some explanation: From release 31.0 onward,
+ * Guava specifies the nullness of its types through annotations. In the case of {@code
+ * ClassToInstanceMap}, it specifies that both the key and value types are restricted to
+ * non-nullable types. This specification is reasonable for <i>keys</i>, which must be non-null
+ * classes. This is in contrast to the specification for <i>values</i>: Null values <i>are</i>
+ * supported by the implementation {@link MutableClassToInstanceMap}, even though that
+ * implementation and this interface specify otherwise. Thus, if you use a nullness checker, you can
+ * safely suppress any warnings it produces when you write null values into a {@code
+ * MutableClassToInstanceMap}. Just be sure to be prepared for null values when reading from it,
+ * since nullness checkers will assume that vaules are non-null then, too.
+ *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#classtoinstancemap"> {@code
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#classtoinstancemap">{@code
  * ClassToInstanceMap}</a>.
  *
  * <p>To map a generic type to an instance of that type, use {@link
@@ -43,12 +54,18 @@
  */
 @DoNotMock("Use ImmutableClassToInstanceMap or MutableClassToInstanceMap")
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
+// If we ever support non-null projections (https://github.com/jspecify/jspecify/issues/86), we
+// we might annotate this as...
+// ClassToInstanceMap<B extends @Nullable Object> extends Map<Class<? extends @Nonnull B>, B>
+// ...and change its methods similarly (<T extends @Nonnull B> or Class<@Nonnull T>).
 public interface ClassToInstanceMap<B> extends Map<Class<? extends B>, B> {
   /**
    * Returns the value the specified class is mapped to, or {@code null} if no entry for this class
    * is present. This will only return a value that was bound to this specific class, not a value
    * that may have been bound to a subtype.
    */
+  @CheckForNull
   <T extends B> T getInstance(Class<T> type);
 
   /**
@@ -59,5 +76,6 @@
    *     null} if there was no previous entry.
    */
   @CanIgnoreReturnValue
-  <T extends B> T putInstance(Class<T> type, @NullableDecl T value);
+  @CheckForNull
+  <T extends B> T putInstance(Class<T> type, T value);
 }
diff --git a/android/guava/src/com/google/common/collect/CollectPreconditions.java b/android/guava/src/com/google/common/collect/CollectPreconditions.java
index 98b30c6..c649b03 100644
--- a/android/guava/src/com/google/common/collect/CollectPreconditions.java
+++ b/android/guava/src/com/google/common/collect/CollectPreconditions.java
@@ -23,6 +23,7 @@
 
 /** Precondition checks useful in collection implementations. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class CollectPreconditions {
 
   static void checkEntryNotNull(Object key, Object value) {
diff --git a/android/guava/src/com/google/common/collect/Collections2.java b/android/guava/src/com/google/common/collect/Collections2.java
index 56b7a5b..1e651b5 100644
--- a/android/guava/src/com/google/common/collect/Collections2.java
+++ b/android/guava/src/com/google/common/collect/Collections2.java
@@ -19,6 +19,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -35,7 +36,8 @@
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides static methods for working with {@code Collection} instances.
@@ -51,6 +53,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Collections2 {
   private Collections2() {}
 
@@ -81,7 +84,8 @@
    */
   // TODO(kevinb): how can we omit that Iterables link when building gwt
   // javadoc?
-  public static <E> Collection<E> filter(Collection<E> unfiltered, Predicate<? super E> predicate) {
+  public static <E extends @Nullable Object> Collection<E> filter(
+      Collection<E> unfiltered, Predicate<? super E> predicate) {
     if (unfiltered instanceof FilteredCollection) {
       // Support clear(), removeAll(), and retainAll() when filtering a filtered
       // collection.
@@ -95,7 +99,7 @@
    * Delegates to {@link Collection#contains}. Returns {@code false} if the {@code contains} method
    * throws a {@code ClassCastException} or {@code NullPointerException}.
    */
-  static boolean safeContains(Collection<?> collection, @NullableDecl Object object) {
+  static boolean safeContains(Collection<?> collection, @CheckForNull Object object) {
     checkNotNull(collection);
     try {
       return collection.contains(object);
@@ -108,7 +112,7 @@
    * Delegates to {@link Collection#remove}. Returns {@code false} if the {@code remove} method
    * throws a {@code ClassCastException} or {@code NullPointerException}.
    */
-  static boolean safeRemove(Collection<?> collection, @NullableDecl Object object) {
+  static boolean safeRemove(Collection<?> collection, @CheckForNull Object object) {
     checkNotNull(collection);
     try {
       return collection.remove(object);
@@ -117,7 +121,7 @@
     }
   }
 
-  static class FilteredCollection<E> extends AbstractCollection<E> {
+  static class FilteredCollection<E extends @Nullable Object> extends AbstractCollection<E> {
     final Collection<E> unfiltered;
     final Predicate<? super E> predicate;
 
@@ -132,7 +136,7 @@
     }
 
     @Override
-    public boolean add(E element) {
+    public boolean add(@ParametricNullness E element) {
       checkArgument(predicate.apply(element));
       return unfiltered.add(element);
     }
@@ -151,7 +155,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object element) {
+    public boolean contains(@CheckForNull Object element) {
       if (safeContains(unfiltered, element)) {
         @SuppressWarnings("unchecked") // element is in unfiltered, so it must be an E
         E e = (E) element;
@@ -176,7 +180,7 @@
     }
 
     @Override
-    public boolean remove(Object element) {
+    public boolean remove(@CheckForNull Object element) {
       return contains(element) && unfiltered.remove(element);
     }
 
@@ -220,13 +224,14 @@
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       // creating an ArrayList so filtering happens once
       return Lists.newArrayList(iterator()).toArray();
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return Lists.newArrayList(iterator()).toArray(array);
     }
   }
@@ -250,12 +255,13 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link java.util.stream.Stream#map Stream.map}.
    */
-  public static <F, T> Collection<T> transform(
+  public static <F extends @Nullable Object, T extends @Nullable Object> Collection<T> transform(
       Collection<F> fromCollection, Function<? super F, T> function) {
     return new TransformedCollection<>(fromCollection, function);
   }
 
-  static class TransformedCollection<F, T> extends AbstractCollection<T> {
+  static class TransformedCollection<F extends @Nullable Object, T extends @Nullable Object>
+      extends AbstractCollection<T> {
     final Collection<F> fromCollection;
     final Function<? super F, ? extends T> function;
 
@@ -466,7 +472,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object obj) {
+    public boolean contains(@CheckForNull Object obj) {
       if (obj instanceof List) {
         List<?> list = (List<?>) obj;
         return isPermutation(inputList, list);
@@ -481,7 +487,7 @@
   }
 
   private static final class OrderedPermutationIterator<E> extends AbstractIterator<List<E>> {
-    @NullableDecl List<E> nextPermutation;
+    @CheckForNull List<E> nextPermutation;
     final Comparator<? super E> comparator;
 
     OrderedPermutationIterator(List<E> list, Comparator<? super E> comparator) {
@@ -490,6 +496,7 @@
     }
 
     @Override
+    @CheckForNull
     protected List<E> computeNext() {
       if (nextPermutation == null) {
         return endOfData();
@@ -505,6 +512,11 @@
         nextPermutation = null;
         return;
       }
+      /*
+       * requireNonNull is safe because we don't clear nextPermutation until we're done calling this
+       * method.
+       */
+      requireNonNull(nextPermutation);
 
       int l = findNextL(j);
       Collections.swap(nextPermutation, j, l);
@@ -513,6 +525,11 @@
     }
 
     int findNextJ() {
+      /*
+       * requireNonNull is safe because we don't clear nextPermutation until we're done calling this
+       * method.
+       */
+      requireNonNull(nextPermutation);
       for (int k = nextPermutation.size() - 2; k >= 0; k--) {
         if (comparator.compare(nextPermutation.get(k), nextPermutation.get(k + 1)) < 0) {
           return k;
@@ -522,6 +539,11 @@
     }
 
     int findNextL(int j) {
+      /*
+       * requireNonNull is safe because we don't clear nextPermutation until we're done calling this
+       * method.
+       */
+      requireNonNull(nextPermutation);
       E ak = nextPermutation.get(j);
       for (int l = nextPermutation.size() - 1; l > j; l--) {
         if (comparator.compare(ak, nextPermutation.get(l)) < 0) {
@@ -577,7 +599,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object obj) {
+    public boolean contains(@CheckForNull Object obj) {
       if (obj instanceof List) {
         List<?> list = (List<?>) obj;
         return isPermutation(inputList, list);
@@ -608,6 +630,7 @@
     }
 
     @Override
+    @CheckForNull
     protected List<E> computeNext() {
       if (j <= 0) {
         return endOfData();
diff --git a/android/guava/src/com/google/common/collect/CompactHashMap.java b/android/guava/src/com/google/common/collect/CompactHashMap.java
index 1fa4f96..e70596d 100644
--- a/android/guava/src/com/google/common/collect/CompactHashMap.java
+++ b/android/guava/src/com/google/common/collect/CompactHashMap.java
@@ -19,6 +19,9 @@
 import static com.google.common.collect.CollectPreconditions.checkRemove;
 import static com.google.common.collect.CompactHashing.UNSET;
 import static com.google.common.collect.Hashing.smearedHash;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static com.google.common.collect.NullnessCasts.unsafeNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -43,7 +46,8 @@
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * CompactHashMap is an implementation of a Map. All optional operations (put and remove) are
@@ -72,7 +76,9 @@
  * @author Jon Noack
  */
 @GwtIncompatible // not worth using in GWT for now
-class CompactHashMap<K, V> extends AbstractMap<K, V> implements Serializable {
+@ElementTypesAreNonnullByDefault
+class CompactHashMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMap<K, V> implements Serializable {
   /*
    * TODO: Make this a drop-in replacement for j.u. versions, actually drop them in, and test the
    * world. Figure out what sort of space-time tradeoff we're actually going to get here with the
@@ -82,7 +88,8 @@
    */
 
   /** Creates an empty {@code CompactHashMap} instance. */
-  public static <K, V> CompactHashMap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      CompactHashMap<K, V> create() {
     return new CompactHashMap<>();
   }
 
@@ -95,7 +102,8 @@
    *     elements without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <K, V> CompactHashMap<K, V> createWithExpectedSize(int expectedSize) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      CompactHashMap<K, V> createWithExpectedSize(int expectedSize) {
     return new CompactHashMap<>(expectedSize);
   }
 
@@ -115,6 +123,46 @@
    */
   private static final int MAX_HASH_BUCKET_LENGTH = 9;
 
+  // The way the `table`, `entries`, `keys`, and `values` arrays work together is as follows.
+  //
+  // The `table` array always has a size that is a power of 2. The hashcode of a key in the map
+  // is masked in order to correspond to the current table size. For example, if the table size
+  // is 128 then the mask is 127 == 0x7f, keeping the bottom 7 bits of the hash value.
+  // If a key hashes to 0x89abcdef the mask reduces it to 0x89abcdef & 0x7f == 0x6f. We'll call this
+  // the "short hash".
+  //
+  // The `keys`, `values`, and `entries` arrays always have the same size as each other. They can be
+  // seen as fields of an imaginary `Entry` object like this:
+  //
+  // class Entry {
+  //    int hash;
+  //    Entry next;
+  //    K key;
+  //    V value;
+  // }
+  //
+  // The imaginary `hash` and `next` values are combined into a single `int` value in the `entries`
+  // array. The top bits of this value are the remaining bits of the hash value that were not used
+  // in the short hash. We saw that a mask of 0x7f would keep the 7-bit value 0x6f from a full
+  // hashcode of 0x89abcdef. The imaginary `hash` value would then be the remaining top 25 bits,
+  // 0x89abcd80. To this is added (or'd) the `next` value, which is an index within `entries`
+  // (and therefore within `keys` and `values`) of another entry that has the same short hash
+  // value. In our example, it would be another entry for a key whose short hash is also 0x6f.
+  //
+  // Essentially, then, `table[h]` gives us the start of a linked list in `entries`, where every
+  // element of the list has the short hash value h.
+  //
+  // A wrinkle here is that the value 0 (called UNSET in the code) is used as the equivalent of a
+  // null pointer. If `table[h] == 0` that means there are no keys in the map whose short hash is h.
+  // If the `next` bits in `entries[i]` are 0 that means there are no further entries for the given
+  // short hash. But 0 is also a valid index in `entries`, so we add 1 to these indices before
+  // putting them in `table` or in `next` bits, and subtract 1 again when we need an index value.
+  //
+  // The elements of `keys`, `values`, and `entries` are added sequentially, so that elements 0 to
+  // `size() - 1` are used and remaining elements are not. This makes iteration straightforward.
+  // Removing an entry generally involves moving the last element of each array to where the removed
+  // entry was, and adjusting index links accordingly.
+
   /**
    * The hashtable object. This can be either:
    *
@@ -134,7 +182,7 @@
    *   <li>null, if no entries have yet been added to the map
    * </ul>
    */
-  @NullableDecl private transient Object table;
+  @CheckForNull private transient Object table;
 
   /**
    * Contains the logical entries, in the range of [0, size()). The high bits of each int are the
@@ -144,32 +192,38 @@
    *
    * <pre>
    * hash  = aaaaaaaa
-   * mask  = 0000ffff
-   * next  = 0000bbbb
-   * entry = aaaabbbb
+   * mask  = 00000fff
+   * next  = 00000bbb
+   * entry = aaaaabbb
    * </pre>
    *
    * <p>The pointers in [size(), entries.length) are all "null" (UNSET).
    */
-  @VisibleForTesting @NullableDecl transient int[] entries;
+  @VisibleForTesting @CheckForNull transient int[] entries;
 
   /**
    * The keys of the entries in the map, in the range of [0, size()). The keys in [size(),
    * keys.length) are all {@code null}.
    */
-  @VisibleForTesting @NullableDecl transient Object[] keys;
+  @VisibleForTesting @CheckForNull transient @Nullable Object[] keys;
 
   /**
    * The values of the entries in the map, in the range of [0, size()). The values in [size(),
    * values.length) are all {@code null}.
    */
-  @VisibleForTesting @NullableDecl transient Object[] values;
+  @VisibleForTesting @CheckForNull transient @Nullable Object[] values;
 
   /**
    * Keeps track of metadata like the number of hash table bits and modifications of this data
    * structure (to make it possible to throw ConcurrentModificationException in the iterator). Note
    * that we choose not to make this volatile, so we do less of a "best effort" to track such
    * errors, for better performance.
+   *
+   * <p>For a new instance, where the arrays above have not yet been allocated, the value of {@code
+   * metadata} is the size that the arrays should be allocated with. Once the arrays have been
+   * allocated, the value of {@code metadata} combines the number of bits in the "short hash", in
+   * its bottom {@value CompactHashing#HASH_TABLE_BITS_MAX_BITS} bits, with a modification count in
+   * the remaining bits that is used to detect concurrent modification during iteration.
    */
   private transient int metadata;
 
@@ -223,7 +277,7 @@
 
   @SuppressWarnings("unchecked")
   @VisibleForTesting
-  @NullableDecl
+  @CheckForNull
   Map<K, V> delegateOrNull() {
     if (table instanceof Map) {
       return (Map<K, V>) table;
@@ -235,13 +289,12 @@
     return new LinkedHashMap<>(tableSize, 1.0f);
   }
 
-  @SuppressWarnings("unchecked")
   @VisibleForTesting
   @CanIgnoreReturnValue
   Map<K, V> convertToHashFloodingResistantImplementation() {
     Map<K, V> newDelegate = createHashFloodingResistantDelegate(hashTableMask() + 1);
     for (int i = firstEntryIndex(); i >= 0; i = getSuccessor(i)) {
-      newDelegate.put((K) keys[i], (V) values[i]);
+      newDelegate.put(key(i), value(i));
     }
     this.table = newDelegate;
     this.entries = null;
@@ -277,31 +330,31 @@
 
   @CanIgnoreReturnValue
   @Override
-  @NullableDecl
-  public V put(@NullableDecl K key, @NullableDecl V value) {
+  @CheckForNull
+  public V put(@ParametricNullness K key, @ParametricNullness V value) {
     if (needsAllocArrays()) {
       allocArrays();
     }
-    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.put(key, value);
     }
-    int[] entries = this.entries;
-    Object[] keys = this.keys;
-    Object[] values = this.values;
+    int[] entries = requireEntries();
+    @Nullable Object[] keys = requireKeys();
+    @Nullable Object[] values = requireValues();
 
     int newEntryIndex = this.size; // current size, and pointer to the entry to be appended
     int newSize = newEntryIndex + 1;
     int hash = smearedHash(key);
     int mask = hashTableMask();
     int tableIndex = hash & mask;
-    int next = CompactHashing.tableGet(table, tableIndex);
+    int next = CompactHashing.tableGet(requireTable(), tableIndex);
     if (next == UNSET) { // uninitialized bucket
       if (newSize > mask) {
         // Resize and add new entry
         mask = resizeTable(mask, CompactHashing.newCapacity(mask), hash, newEntryIndex);
       } else {
-        CompactHashing.tableSet(table, tableIndex, newEntryIndex + 1);
+        CompactHashing.tableSet(requireTable(), tableIndex, newEntryIndex + 1);
       }
     } else {
       int entryIndex;
@@ -314,7 +367,6 @@
         if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
             && Objects.equal(key, keys[entryIndex])) {
           @SuppressWarnings("unchecked") // known to be a V
-          @NullableDecl
           V oldValue = (V) values[entryIndex];
 
           values[entryIndex] = value;
@@ -346,15 +398,16 @@
   /**
    * Creates a fresh entry with the specified object at the specified position in the entry arrays.
    */
-  void insertEntry(int entryIndex, @NullableDecl K key, @NullableDecl V value, int hash, int mask) {
-    this.entries[entryIndex] = CompactHashing.maskCombine(hash, UNSET, mask);
-    this.keys[entryIndex] = key;
-    this.values[entryIndex] = value;
+  void insertEntry(
+      int entryIndex, @ParametricNullness K key, @ParametricNullness V value, int hash, int mask) {
+    this.setEntry(entryIndex, CompactHashing.maskCombine(hash, UNSET, mask));
+    this.setKey(entryIndex, key);
+    this.setValue(entryIndex, value);
   }
 
   /** Resizes the entries storage if necessary. */
   private void resizeMeMaybe(int newSize) {
-    int entriesSize = entries.length;
+    int entriesSize = requireEntries().length;
     if (newSize > entriesSize) {
       // 1.5x but round up to nearest odd (this is optimal for memory consumption on Android)
       int newCapacity =
@@ -370,13 +423,13 @@
    * the current capacity.
    */
   void resizeEntries(int newCapacity) {
-    this.entries = Arrays.copyOf(entries, newCapacity);
-    this.keys = Arrays.copyOf(keys, newCapacity);
-    this.values = Arrays.copyOf(values, newCapacity);
+    this.entries = Arrays.copyOf(requireEntries(), newCapacity);
+    this.keys = Arrays.copyOf(requireKeys(), newCapacity);
+    this.values = Arrays.copyOf(requireValues(), newCapacity);
   }
 
   @CanIgnoreReturnValue
-  private int resizeTable(int mask, int newCapacity, int targetHash, int targetEntryIndex) {
+  private int resizeTable(int oldMask, int newCapacity, int targetHash, int targetEntryIndex) {
     Object newTable = CompactHashing.createTable(newCapacity);
     int newMask = newCapacity - 1;
 
@@ -385,25 +438,35 @@
       CompactHashing.tableSet(newTable, targetHash & newMask, targetEntryIndex + 1);
     }
 
-    Object table = this.table;
-    int[] entries = this.entries;
+    Object oldTable = requireTable();
+    int[] entries = requireEntries();
 
-    // Loop over current hashtable
-    for (int tableIndex = 0; tableIndex <= mask; tableIndex++) {
-      int next = CompactHashing.tableGet(table, tableIndex);
-      while (next != UNSET) {
-        int entryIndex = next - 1;
-        int entry = entries[entryIndex];
+    // Loop over `oldTable` to construct its replacement, ``newTable`. The entries do not move, so
+    // the `keys` and `values` arrays do not need to change. But because the "short hash" now has a
+    // different number of bits, we must rewrite each element of `entries` so that its contribution
+    // to the full hashcode reflects the change, and so that its `next` link corresponds to the new
+    // linked list of entries with the new short hash.
+    for (int oldTableIndex = 0; oldTableIndex <= oldMask; oldTableIndex++) {
+      int oldNext = CompactHashing.tableGet(oldTable, oldTableIndex);
+      // Each element of `oldTable` is the head of a (possibly empty) linked list of elements in
+      // `entries`. The `oldNext` loop is going to traverse that linked list.
+      // We need to rewrite the `next` link of each of the elements so that it is in the appropriate
+      // linked list starting from `newTable`. In general, each element from the old linked list
+      // belongs to a different linked list from `newTable`. We insert each element in turn at the
+      // head of its appropriate `newTable` linked list.
+      while (oldNext != UNSET) {
+        int entryIndex = oldNext - 1;
+        int oldEntry = entries[entryIndex];
 
-        // Rebuild hash using entry hashPrefix and tableIndex ("hashSuffix")
-        int hash = CompactHashing.getHashPrefix(entry, mask) | tableIndex;
+        // Rebuild the full 32-bit hash using entry hashPrefix and oldTableIndex ("hashSuffix").
+        int hash = CompactHashing.getHashPrefix(oldEntry, oldMask) | oldTableIndex;
 
         int newTableIndex = hash & newMask;
         int newNext = CompactHashing.tableGet(newTable, newTableIndex);
-        CompactHashing.tableSet(newTable, newTableIndex, next);
+        CompactHashing.tableSet(newTable, newTableIndex, oldNext);
         entries[entryIndex] = CompactHashing.maskCombine(hash, newNext, newMask);
 
-        next = CompactHashing.getNext(entry, mask);
+        oldNext = CompactHashing.getNext(oldEntry, oldMask);
       }
     }
 
@@ -412,22 +475,22 @@
     return newMask;
   }
 
-  private int indexOf(@NullableDecl Object key) {
+  private int indexOf(@CheckForNull Object key) {
     if (needsAllocArrays()) {
       return -1;
     }
     int hash = smearedHash(key);
     int mask = hashTableMask();
-    int next = CompactHashing.tableGet(table, hash & mask);
+    int next = CompactHashing.tableGet(requireTable(), hash & mask);
     if (next == UNSET) {
       return -1;
     }
     int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
     do {
       int entryIndex = next - 1;
-      int entry = entries[entryIndex];
+      int entry = entry(entryIndex);
       if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
-          && Objects.equal(key, keys[entryIndex])) {
+          && Objects.equal(key, key(entryIndex))) {
         return entryIndex;
       }
       next = CompactHashing.getNext(entry, mask);
@@ -436,15 +499,15 @@
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
-    @NullableDecl Map<K, V> delegate = delegateOrNull();
+  public boolean containsKey(@CheckForNull Object key) {
+    Map<K, V> delegate = delegateOrNull();
     return (delegate != null) ? delegate.containsKey(key) : indexOf(key) != -1;
   }
 
-  @SuppressWarnings("unchecked") // known to be a V
   @Override
-  public V get(@NullableDecl Object key) {
-    @NullableDecl Map<K, V> delegate = delegateOrNull();
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.get(key);
     }
@@ -453,15 +516,15 @@
       return null;
     }
     accessEntry(index);
-    return (V) values[index];
+    return value(index);
   }
 
   @CanIgnoreReturnValue
   @SuppressWarnings("unchecked") // known to be a V
   @Override
-  @NullableDecl
-  public V remove(@NullableDecl Object key) {
-    @NullableDecl Map<K, V> delegate = delegateOrNull();
+  @CheckForNull
+  public V remove(@CheckForNull Object key) {
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.remove(key);
     }
@@ -469,20 +532,25 @@
     return (oldValue == NOT_FOUND) ? null : (V) oldValue;
   }
 
-  @NullableDecl
-  private Object removeHelper(@NullableDecl Object key) {
+  private @Nullable Object removeHelper(@CheckForNull Object key) {
     if (needsAllocArrays()) {
       return NOT_FOUND;
     }
     int mask = hashTableMask();
     int index =
         CompactHashing.remove(
-            key, /* value= */ null, mask, table, entries, keys, /* values= */ null);
+            key,
+            /* value= */ null,
+            mask,
+            requireTable(),
+            requireEntries(),
+            requireKeys(),
+            /* values= */ null);
     if (index == -1) {
       return NOT_FOUND;
     }
 
-    @NullableDecl Object oldValue = values[index];
+    Object oldValue = value(index);
 
     moveLastEntry(index, mask);
     size--;
@@ -495,10 +563,14 @@
    * Moves the last entry in the entry array into {@code dstIndex}, and nulls out its old position.
    */
   void moveLastEntry(int dstIndex, int mask) {
+    Object table = requireTable();
+    int[] entries = requireEntries();
+    @Nullable Object[] keys = requireKeys();
+    @Nullable Object[] values = requireValues();
     int srcIndex = size() - 1;
     if (dstIndex < srcIndex) {
       // move last entry to deleted spot
-      @NullableDecl Object key = keys[srcIndex];
+      Object key = keys[srcIndex];
       keys[dstIndex] = key;
       values[dstIndex] = values[srcIndex];
       keys[srcIndex] = null;
@@ -551,7 +623,7 @@
     return indexBeforeRemove - 1;
   }
 
-  private abstract class Itr<T> implements Iterator<T> {
+  private abstract class Itr<T extends @Nullable Object> implements Iterator<T> {
     int expectedMetadata = metadata;
     int currentIndex = firstEntryIndex();
     int indexToRemove = -1;
@@ -561,9 +633,11 @@
       return currentIndex >= 0;
     }
 
+    @ParametricNullness
     abstract T getOutput(int entry);
 
     @Override
+    @ParametricNullness
     public T next() {
       checkForConcurrentModification();
       if (!hasNext()) {
@@ -580,7 +654,7 @@
       checkForConcurrentModification();
       checkRemove(indexToRemove >= 0);
       incrementExpectedModCount();
-      CompactHashMap.this.remove(keys[indexToRemove]);
+      CompactHashMap.this.remove(key(indexToRemove));
       currentIndex = adjustAfterRemove(currentIndex, indexToRemove);
       indexToRemove = -1;
     }
@@ -596,7 +670,7 @@
     }
   }
 
-  @NullableDecl private transient Set<K> keySetView;
+  @CheckForNull private transient Set<K> keySetView;
 
   @Override
   public Set<K> keySet() {
@@ -615,13 +689,13 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return CompactHashMap.this.containsKey(o);
     }
 
     @Override
-    public boolean remove(@NullableDecl Object o) {
-      @NullableDecl Map<K, V> delegate = delegateOrNull();
+    public boolean remove(@CheckForNull Object o) {
+      Map<K, V> delegate = delegateOrNull();
       return (delegate != null)
           ? delegate.keySet().remove(o)
           : CompactHashMap.this.removeHelper(o) != NOT_FOUND;
@@ -639,20 +713,20 @@
   }
 
   Iterator<K> keySetIterator() {
-    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.keySet().iterator();
     }
     return new Itr<K>() {
-      @SuppressWarnings("unchecked") // known to be a K
       @Override
+      @ParametricNullness
       K getOutput(int entry) {
-        return (K) keys[entry];
+        return key(entry);
       }
     };
   }
 
-  @NullableDecl private transient Set<Entry<K, V>> entrySetView;
+  @CheckForNull private transient Set<Entry<K, V>> entrySetView;
 
   @Override
   public Set<Entry<K, V>> entrySet() {
@@ -682,21 +756,21 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
-      @NullableDecl Map<K, V> delegate = delegateOrNull();
+    public boolean contains(@CheckForNull Object o) {
+      Map<K, V> delegate = delegateOrNull();
       if (delegate != null) {
         return delegate.entrySet().contains(o);
       } else if (o instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) o;
         int index = indexOf(entry.getKey());
-        return index != -1 && Objects.equal(values[index], entry.getValue());
+        return index != -1 && Objects.equal(value(index), entry.getValue());
       }
       return false;
     }
 
     @Override
-    public boolean remove(@NullableDecl Object o) {
-      @NullableDecl Map<K, V> delegate = delegateOrNull();
+    public boolean remove(@CheckForNull Object o) {
+      Map<K, V> delegate = delegateOrNull();
       if (delegate != null) {
         return delegate.entrySet().remove(o);
       } else if (o instanceof Entry) {
@@ -707,7 +781,13 @@
         int mask = hashTableMask();
         int index =
             CompactHashing.remove(
-                entry.getKey(), entry.getValue(), mask, table, entries, keys, values);
+                entry.getKey(),
+                entry.getValue(),
+                mask,
+                requireTable(),
+                requireEntries(),
+                requireKeys(),
+                requireValues());
         if (index == -1) {
           return false;
         }
@@ -723,7 +803,7 @@
   }
 
   Iterator<Entry<K, V>> entrySetIterator() {
-    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.entrySet().iterator();
     }
@@ -736,18 +816,17 @@
   }
 
   final class MapEntry extends AbstractMapEntry<K, V> {
-    @NullableDecl private final K key;
+    @ParametricNullness private final K key;
 
     private int lastKnownIndex;
 
-    @SuppressWarnings("unchecked") // known to be a K
     MapEntry(int index) {
-      this.key = (K) keys[index];
+      this.key = key(index);
       this.lastKnownIndex = index;
     }
 
-    @NullableDecl
     @Override
+    @ParametricNullness
     public K getKey() {
       return key;
     }
@@ -755,37 +834,48 @@
     private void updateLastKnownIndex() {
       if (lastKnownIndex == -1
           || lastKnownIndex >= size()
-          || !Objects.equal(key, keys[lastKnownIndex])) {
+          || !Objects.equal(key, key(lastKnownIndex))) {
         lastKnownIndex = indexOf(key);
       }
     }
 
-    @SuppressWarnings("unchecked") // known to be a V
     @Override
-    @NullableDecl
+    @ParametricNullness
     public V getValue() {
-      @NullableDecl Map<K, V> delegate = delegateOrNull();
+      Map<K, V> delegate = delegateOrNull();
       if (delegate != null) {
-        return delegate.get(key);
+        /*
+         * The cast is safe because the entry is present in the map. Or, if it has been removed by a
+         * concurrent modification, behavior is undefined.
+         */
+        return uncheckedCastNullableTToT(delegate.get(key));
       }
       updateLastKnownIndex();
-      return (lastKnownIndex == -1) ? null : (V) values[lastKnownIndex];
+      /*
+       * If the entry has been removed from the map, we return null, even though that might not be a
+       * valid value. That's the best we can do, short of holding a reference to the most recently
+       * seen value. And while we *could* do that, we aren't required to: Map.Entry explicitly says
+       * that behavior is undefined when the backing map is modified through another API. (It even
+       * permits us to throw IllegalStateException. Maybe we should have done that, but we probably
+       * shouldn't change now for fear of breaking people.)
+       */
+      return (lastKnownIndex == -1) ? unsafeNull() : value(lastKnownIndex);
     }
 
-    @SuppressWarnings("unchecked") // known to be a V
     @Override
-    public V setValue(V value) {
-      @NullableDecl Map<K, V> delegate = delegateOrNull();
+    @ParametricNullness
+    public V setValue(@ParametricNullness V value) {
+      Map<K, V> delegate = delegateOrNull();
       if (delegate != null) {
-        return delegate.put(key, value);
+        return uncheckedCastNullableTToT(delegate.put(key, value)); // See discussion in getValue().
       }
       updateLastKnownIndex();
       if (lastKnownIndex == -1) {
         put(key, value);
-        return null;
+        return unsafeNull(); // See discussion in getValue().
       } else {
-        V old = (V) values[lastKnownIndex];
-        values[lastKnownIndex] = value;
+        V old = value(lastKnownIndex);
+        CompactHashMap.this.setValue(lastKnownIndex, value);
         return old;
       }
     }
@@ -793,7 +883,7 @@
 
   @Override
   public int size() {
-    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     return (delegate != null) ? delegate.size() : size;
   }
 
@@ -803,20 +893,20 @@
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
-    @NullableDecl Map<K, V> delegate = delegateOrNull();
+  public boolean containsValue(@CheckForNull Object value) {
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.containsValue(value);
     }
     for (int i = 0; i < size; i++) {
-      if (Objects.equal(value, values[i])) {
+      if (Objects.equal(value, value(i))) {
         return true;
       }
     }
     return false;
   }
 
-  @NullableDecl private transient Collection<V> valuesView;
+  @CheckForNull private transient Collection<V> valuesView;
 
   @Override
   public Collection<V> values() {
@@ -846,15 +936,15 @@
   }
 
   Iterator<V> valuesIterator() {
-    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.values().iterator();
     }
     return new Itr<V>() {
-      @SuppressWarnings("unchecked") // known to be a V
       @Override
+      @ParametricNullness
       V getOutput(int entry) {
-        return (V) values[entry];
+        return value(entry);
       }
     };
   }
@@ -867,7 +957,7 @@
     if (needsAllocArrays()) {
       return;
     }
-    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       Map<K, V> newDelegate = createHashFloodingResistantDelegate(size());
       newDelegate.putAll(delegate);
@@ -875,7 +965,7 @@
       return;
     }
     int size = this.size;
-    if (size < entries.length) {
+    if (size < requireEntries().length) {
       resizeEntries(size);
     }
     int minimumTableSize = CompactHashing.tableSize(size);
@@ -891,7 +981,7 @@
       return;
     }
     incrementModCount();
-    @NullableDecl Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       metadata =
           Ints.constrainToRange(size(), CompactHashing.DEFAULT_SIZE, CompactHashing.MAX_SIZE);
@@ -899,10 +989,10 @@
       table = null;
       size = 0;
     } else {
-      Arrays.fill(keys, 0, size, null);
-      Arrays.fill(values, 0, size, null);
-      CompactHashing.tableClear(table);
-      Arrays.fill(entries, 0, size, 0);
+      Arrays.fill(requireKeys(), 0, size, null);
+      Arrays.fill(requireValues(), 0, size, null);
+      CompactHashing.tableClear(requireTable());
+      Arrays.fill(requireEntries(), 0, size, 0);
       this.size = 0;
     }
   }
@@ -932,4 +1022,66 @@
       put(key, value);
     }
   }
+
+  /*
+   * The following methods are safe to call as long as both of the following hold:
+   *
+   * - allocArrays() has been called. Callers can confirm this by checking needsAllocArrays().
+   *
+   * - The map has not switched to delegating to a java.util implementation to mitigate hash
+   *   flooding. Callers can confirm this by null-checking delegateOrNull().
+   *
+   * In an ideal world, we would document why we know those things are true every time we call these
+   * methods. But that is a bit too painful....
+   */
+
+  private Object requireTable() {
+    return requireNonNull(table);
+  }
+
+  private int[] requireEntries() {
+    return requireNonNull(entries);
+  }
+
+  private @Nullable Object[] requireKeys() {
+    return requireNonNull(keys);
+  }
+
+  private @Nullable Object[] requireValues() {
+    return requireNonNull(values);
+  }
+
+  /*
+   * The following methods are safe to call as long as the conditions in the *previous* comment are
+   * met *and* the index is less than size().
+   *
+   * (The above explains when these methods are safe from a `nullness` perspective. From an
+   * `unchecked` perspective, they're safe because we put only K/V elements into each array.)
+   */
+
+  @SuppressWarnings("unchecked")
+  private K key(int i) {
+    return (K) requireKeys()[i];
+  }
+
+  @SuppressWarnings("unchecked")
+  private V value(int i) {
+    return (V) requireValues()[i];
+  }
+
+  private int entry(int i) {
+    return requireEntries()[i];
+  }
+
+  private void setKey(int i, K key) {
+    requireKeys()[i] = key;
+  }
+
+  private void setValue(int i, V value) {
+    requireValues()[i] = value;
+  }
+
+  private void setEntry(int i, int value) {
+    requireEntries()[i] = value;
+  }
 }
diff --git a/android/guava/src/com/google/common/collect/CompactHashSet.java b/android/guava/src/com/google/common/collect/CompactHashSet.java
index d4c585c..08c7294 100644
--- a/android/guava/src/com/google/common/collect/CompactHashSet.java
+++ b/android/guava/src/com/google/common/collect/CompactHashSet.java
@@ -19,6 +19,7 @@
 import static com.google.common.collect.CollectPreconditions.checkRemove;
 import static com.google.common.collect.CompactHashing.UNSET;
 import static com.google.common.collect.Hashing.smearedHash;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -40,7 +41,8 @@
 import java.util.LinkedHashSet;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * CompactHashSet is an implementation of a Set. All optional operations (adding and removing) are
@@ -70,11 +72,12 @@
  * @author Jon Noack
  */
 @GwtIncompatible // not worth using in GWT for now
-class CompactHashSet<E> extends AbstractSet<E> implements Serializable {
+@ElementTypesAreNonnullByDefault
+class CompactHashSet<E extends @Nullable Object> extends AbstractSet<E> implements Serializable {
   // TODO(user): cache all field accesses in local vars
 
   /** Creates an empty {@code CompactHashSet} instance. */
-  public static <E> CompactHashSet<E> create() {
+  public static <E extends @Nullable Object> CompactHashSet<E> create() {
     return new CompactHashSet<>();
   }
 
@@ -85,7 +88,8 @@
    * @param collection the elements that the set should contain
    * @return a new {@code CompactHashSet} containing those elements (minus duplicates)
    */
-  public static <E> CompactHashSet<E> create(Collection<? extends E> collection) {
+  public static <E extends @Nullable Object> CompactHashSet<E> create(
+      Collection<? extends E> collection) {
     CompactHashSet<E> set = createWithExpectedSize(collection.size());
     set.addAll(collection);
     return set;
@@ -99,7 +103,7 @@
    * @return a new {@code CompactHashSet} containing those elements (minus duplicates)
    */
   @SafeVarargs
-  public static <E> CompactHashSet<E> create(E... elements) {
+  public static <E extends @Nullable Object> CompactHashSet<E> create(E... elements) {
     CompactHashSet<E> set = createWithExpectedSize(elements.length);
     Collections.addAll(set, elements);
     return set;
@@ -114,7 +118,8 @@
    *     elements without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <E> CompactHashSet<E> createWithExpectedSize(int expectedSize) {
+  public static <E extends @Nullable Object> CompactHashSet<E> createWithExpectedSize(
+      int expectedSize) {
     return new CompactHashSet<>(expectedSize);
   }
 
@@ -132,6 +137,10 @@
    */
   private static final int MAX_HASH_BUCKET_LENGTH = 9;
 
+  // See CompactHashMap for a detailed description of how the following fields work. That
+  // description talks about `keys`, `values`, and `entries`; here the `keys` and `values` arrays
+  // are replaced by a single `elements` array but everything else works similarly.
+
   /**
    * The hashtable object. This can be either:
    *
@@ -151,7 +160,7 @@
    *   <li>null, if no entries have yet been added to the map
    * </ul>
    */
-  @NullableDecl private transient Object table;
+  @CheckForNull private transient Object table;
 
   /**
    * Contains the logical entries, in the range of [0, size()). The high bits of each int are the
@@ -161,20 +170,20 @@
    *
    * <pre>
    * hash  = aaaaaaaa
-   * mask  = 0000ffff
-   * next  = 0000bbbb
-   * entry = aaaabbbb
+   * mask  = 00000fff
+   * next  = 00000bbb
+   * entry = aaaaabbb
    * </pre>
    *
    * <p>The pointers in [size(), entries.length) are all "null" (UNSET).
    */
-  @NullableDecl private transient int[] entries;
+  @CheckForNull private transient int[] entries;
 
   /**
    * The elements contained in the set, in the range of [0, size()). The elements in [size(),
    * elements.length) are all {@code null}.
    */
-  @VisibleForTesting @NullableDecl transient Object[] elements;
+  @VisibleForTesting @CheckForNull transient @Nullable Object[] elements;
 
   /**
    * Keeps track of metadata like the number of hash table bits and modifications of this data
@@ -233,7 +242,7 @@
 
   @SuppressWarnings("unchecked")
   @VisibleForTesting
-  @NullableDecl
+  @CheckForNull
   Set<E> delegateOrNull() {
     if (table instanceof Set) {
       return (Set<E>) table;
@@ -245,13 +254,12 @@
     return new LinkedHashSet<>(tableSize, 1.0f);
   }
 
-  @SuppressWarnings("unchecked")
   @VisibleForTesting
   @CanIgnoreReturnValue
   Set<E> convertToHashFloodingResistantImplementation() {
     Set<E> newDelegate = createHashFloodingResistantDelegate(hashTableMask() + 1);
     for (int i = firstEntryIndex(); i >= 0; i = getSuccessor(i)) {
-      newDelegate.add((E) elements[i]);
+      newDelegate.add(element(i));
     }
     this.table = newDelegate;
     this.entries = null;
@@ -283,29 +291,29 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean add(@NullableDecl E object) {
+  public boolean add(@ParametricNullness E object) {
     if (needsAllocArrays()) {
       allocArrays();
     }
-    @NullableDecl Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.add(object);
     }
-    int[] entries = this.entries;
-    Object[] elements = this.elements;
+    int[] entries = requireEntries();
+    @Nullable Object[] elements = requireElements();
 
     int newEntryIndex = this.size; // current size, and pointer to the entry to be appended
     int newSize = newEntryIndex + 1;
     int hash = smearedHash(object);
     int mask = hashTableMask();
     int tableIndex = hash & mask;
-    int next = CompactHashing.tableGet(table, tableIndex);
+    int next = CompactHashing.tableGet(requireTable(), tableIndex);
     if (next == UNSET) { // uninitialized bucket
       if (newSize > mask) {
         // Resize and add new entry
         mask = resizeTable(mask, CompactHashing.newCapacity(mask), hash, newEntryIndex);
       } else {
-        CompactHashing.tableSet(table, tableIndex, newEntryIndex + 1);
+        CompactHashing.tableSet(requireTable(), tableIndex, newEntryIndex + 1);
       }
     } else {
       int entryIndex;
@@ -344,14 +352,14 @@
   /**
    * Creates a fresh entry with the specified object at the specified position in the entry arrays.
    */
-  void insertEntry(int entryIndex, @NullableDecl E object, int hash, int mask) {
-    this.entries[entryIndex] = CompactHashing.maskCombine(hash, UNSET, mask);
-    this.elements[entryIndex] = object;
+  void insertEntry(int entryIndex, @ParametricNullness E object, int hash, int mask) {
+    setEntry(entryIndex, CompactHashing.maskCombine(hash, UNSET, mask));
+    setElement(entryIndex, object);
   }
 
   /** Resizes the entries storage if necessary. */
   private void resizeMeMaybe(int newSize) {
-    int entriesSize = entries.length;
+    int entriesSize = requireEntries().length;
     if (newSize > entriesSize) {
       // 1.5x but round up to nearest odd (this is optimal for memory consumption on Android)
       int newCapacity =
@@ -367,12 +375,12 @@
    * the current capacity.
    */
   void resizeEntries(int newCapacity) {
-    this.entries = Arrays.copyOf(entries, newCapacity);
-    this.elements = Arrays.copyOf(elements, newCapacity);
+    this.entries = Arrays.copyOf(requireEntries(), newCapacity);
+    this.elements = Arrays.copyOf(requireElements(), newCapacity);
   }
 
   @CanIgnoreReturnValue
-  private int resizeTable(int mask, int newCapacity, int targetHash, int targetEntryIndex) {
+  private int resizeTable(int oldMask, int newCapacity, int targetHash, int targetEntryIndex) {
     Object newTable = CompactHashing.createTable(newCapacity);
     int newMask = newCapacity - 1;
 
@@ -381,25 +389,25 @@
       CompactHashing.tableSet(newTable, targetHash & newMask, targetEntryIndex + 1);
     }
 
-    Object table = this.table;
-    int[] entries = this.entries;
+    Object oldTable = requireTable();
+    int[] entries = requireEntries();
 
     // Loop over current hashtable
-    for (int tableIndex = 0; tableIndex <= mask; tableIndex++) {
-      int next = CompactHashing.tableGet(table, tableIndex);
-      while (next != UNSET) {
-        int entryIndex = next - 1;
-        int entry = entries[entryIndex];
+    for (int oldTableIndex = 0; oldTableIndex <= oldMask; oldTableIndex++) {
+      int oldNext = CompactHashing.tableGet(oldTable, oldTableIndex);
+      while (oldNext != UNSET) {
+        int entryIndex = oldNext - 1;
+        int oldEntry = entries[entryIndex];
 
         // Rebuild hash using entry hashPrefix and tableIndex ("hashSuffix")
-        int hash = CompactHashing.getHashPrefix(entry, mask) | tableIndex;
+        int hash = CompactHashing.getHashPrefix(oldEntry, oldMask) | oldTableIndex;
 
         int newTableIndex = hash & newMask;
         int newNext = CompactHashing.tableGet(newTable, newTableIndex);
-        CompactHashing.tableSet(newTable, newTableIndex, next);
+        CompactHashing.tableSet(newTable, newTableIndex, oldNext);
         entries[entryIndex] = CompactHashing.maskCombine(hash, newNext, newMask);
 
-        next = CompactHashing.getNext(entry, mask);
+        oldNext = CompactHashing.getNext(oldEntry, oldMask);
       }
     }
 
@@ -409,26 +417,26 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object object) {
+  public boolean contains(@CheckForNull Object object) {
     if (needsAllocArrays()) {
       return false;
     }
-    @NullableDecl Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.contains(object);
     }
     int hash = smearedHash(object);
     int mask = hashTableMask();
-    int next = CompactHashing.tableGet(table, hash & mask);
+    int next = CompactHashing.tableGet(requireTable(), hash & mask);
     if (next == UNSET) {
       return false;
     }
     int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
     do {
       int entryIndex = next - 1;
-      int entry = entries[entryIndex];
+      int entry = entry(entryIndex);
       if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
-          && Objects.equal(object, elements[entryIndex])) {
+          && Objects.equal(object, element(entryIndex))) {
         return true;
       }
       next = CompactHashing.getNext(entry, mask);
@@ -438,18 +446,24 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean remove(@NullableDecl Object object) {
+  public boolean remove(@CheckForNull Object object) {
     if (needsAllocArrays()) {
       return false;
     }
-    @NullableDecl Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.remove(object);
     }
     int mask = hashTableMask();
     int index =
         CompactHashing.remove(
-            object, /* value= */ null, mask, table, entries, elements, /* values= */ null);
+            object,
+            /* value= */ null,
+            mask,
+            requireTable(),
+            requireEntries(),
+            requireElements(),
+            /* values= */ null);
     if (index == -1) {
       return false;
     }
@@ -465,10 +479,13 @@
    * Moves the last entry in the entry array into {@code dstIndex}, and nulls out its old position.
    */
   void moveLastEntry(int dstIndex, int mask) {
+    Object table = requireTable();
+    int[] entries = requireEntries();
+    @Nullable Object[] elements = requireElements();
     int srcIndex = size() - 1;
     if (dstIndex < srcIndex) {
       // move last entry to deleted spot
-      @NullableDecl Object object = elements[srcIndex];
+      Object object = elements[srcIndex];
       elements[dstIndex] = object;
       elements[srcIndex] = null;
 
@@ -520,7 +537,7 @@
 
   @Override
   public Iterator<E> iterator() {
-    @NullableDecl Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.iterator();
     }
@@ -534,15 +551,15 @@
         return currentIndex >= 0;
       }
 
-      @SuppressWarnings("unchecked") // known to be Es
       @Override
+      @ParametricNullness
       public E next() {
         checkForConcurrentModification();
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
         indexToRemove = currentIndex;
-        E result = (E) elements[currentIndex];
+        E result = element(currentIndex);
         currentIndex = getSuccessor(currentIndex);
         return result;
       }
@@ -552,7 +569,7 @@
         checkForConcurrentModification();
         checkRemove(indexToRemove >= 0);
         incrementExpectedModCount();
-        CompactHashSet.this.remove(elements[indexToRemove]);
+        CompactHashSet.this.remove(element(indexToRemove));
         currentIndex = adjustAfterRemove(currentIndex, indexToRemove);
         indexToRemove = -1;
       }
@@ -571,7 +588,7 @@
 
   @Override
   public int size() {
-    @NullableDecl Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     return (delegate != null) ? delegate.size() : size;
   }
 
@@ -581,27 +598,28 @@
   }
 
   @Override
-  public Object[] toArray() {
+  public @Nullable Object[] toArray() {
     if (needsAllocArrays()) {
       return new Object[0];
     }
-    @NullableDecl Set<E> delegate = delegateOrNull();
-    return (delegate != null) ? delegate.toArray() : Arrays.copyOf(elements, size);
+    Set<E> delegate = delegateOrNull();
+    return (delegate != null) ? delegate.toArray() : Arrays.copyOf(requireElements(), size);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public <T> T[] toArray(T[] a) {
+  @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+  public <T extends @Nullable Object> T[] toArray(T[] a) {
     if (needsAllocArrays()) {
       if (a.length > 0) {
         a[0] = null;
       }
       return a;
     }
-    @NullableDecl Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     return (delegate != null)
         ? delegate.toArray(a)
-        : ObjectArrays.toArrayImpl(elements, 0, size, a);
+        : ObjectArrays.toArrayImpl(requireElements(), 0, size, a);
   }
 
   /**
@@ -612,7 +630,7 @@
     if (needsAllocArrays()) {
       return;
     }
-    @NullableDecl Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       Set<E> newDelegate = createHashFloodingResistantDelegate(size());
       newDelegate.addAll(delegate);
@@ -620,7 +638,7 @@
       return;
     }
     int size = this.size;
-    if (size < entries.length) {
+    if (size < requireEntries().length) {
       resizeEntries(size);
     }
     int minimumTableSize = CompactHashing.tableSize(size);
@@ -636,7 +654,7 @@
       return;
     }
     incrementModCount();
-    @NullableDecl Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       metadata =
           Ints.constrainToRange(size(), CompactHashing.DEFAULT_SIZE, CompactHashing.MAX_SIZE);
@@ -644,9 +662,9 @@
       table = null;
       size = 0;
     } else {
-      Arrays.fill(elements, 0, size, null);
-      CompactHashing.tableClear(table);
-      Arrays.fill(entries, 0, size, 0);
+      Arrays.fill(requireElements(), 0, size, null);
+      CompactHashing.tableClear(requireTable());
+      Arrays.fill(requireEntries(), 0, size, 0);
       this.size = 0;
     }
   }
@@ -672,4 +690,38 @@
       add(element);
     }
   }
+
+  /*
+   * For discussion of the safety of the following methods, see the comments near the end of
+   * CompactHashMap.
+   */
+
+  private Object requireTable() {
+    return requireNonNull(table);
+  }
+
+  private int[] requireEntries() {
+    return requireNonNull(entries);
+  }
+
+  private @Nullable Object[] requireElements() {
+    return requireNonNull(elements);
+  }
+
+  @SuppressWarnings("unchecked")
+  private E element(int i) {
+    return (E) requireElements()[i];
+  }
+
+  private int entry(int i) {
+    return requireEntries()[i];
+  }
+
+  private void setElement(int i, E value) {
+    requireElements()[i] = value;
+  }
+
+  private void setEntry(int i, int value) {
+    requireEntries()[i] = value;
+  }
 }
diff --git a/android/guava/src/com/google/common/collect/CompactHashing.java b/android/guava/src/com/google/common/collect/CompactHashing.java
index 7e83a05..a8fe902 100644
--- a/android/guava/src/com/google/common/collect/CompactHashing.java
+++ b/android/guava/src/com/google/common/collect/CompactHashing.java
@@ -20,7 +20,8 @@
 import com.google.common.base.Objects;
 import com.google.common.primitives.Ints;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Helper classes and static methods for implementing compact hash-based collections.
@@ -28,6 +29,7 @@
  * @author Jon Noack
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class CompactHashing {
   private CompactHashing() {}
 
@@ -96,6 +98,11 @@
     }
   }
 
+  /**
+   * Returns {@code table[index]}, where {@code table} is actually a {@code byte[]}, {@code
+   * short[]}, or {@code int[]}. When it is a {@code byte[]} or {@code short[]}, the returned value
+   * is unsigned, so the range of possible returned values is 0–255 or 0–65535, respectively.
+   */
   static int tableGet(Object table, int index) {
     if (table instanceof byte[]) {
       return ((byte[]) table)[index] & BYTE_MASK; // unsigned read
@@ -106,6 +113,13 @@
     }
   }
 
+  /**
+   * Sets {@code table[index]} to {@code entry}, where {@code table} is actually a {@code byte[]},
+   * {@code short[]}, or {@code int[]}. The value of {@code entry} should fit in the size of the
+   * assigned array element, when seen as an unsigned value. So if {@code table} is a {@code byte[]}
+   * then we should have {@code 0 ≤ entry ≤ 255}, and if {@code table} is a {@code short[]} then we
+   * should have {@code 0 ≤ entry ≤ 65535}. It is the caller's responsibility to ensure this.
+   */
   static void tableSet(Object table, int index, int entry) {
     if (table instanceof byte[]) {
       ((byte[]) table)[index] = (byte) entry; // unsigned write
@@ -143,13 +157,13 @@
   }
 
   static int remove(
-      @NullableDecl Object key,
-      @NullableDecl Object value,
+      @CheckForNull Object key,
+      @CheckForNull Object value,
       int mask,
       Object table,
       int[] entries,
-      Object[] keys,
-      @NullableDecl Object[] values) {
+      @Nullable Object[] keys,
+      @CheckForNull @Nullable Object[] values) {
     int hash = Hashing.smearedHash(key);
     int tableIndex = hash & mask;
     int next = tableGet(table, tableIndex);
diff --git a/android/guava/src/com/google/common/collect/CompactLinkedHashMap.java b/android/guava/src/com/google/common/collect/CompactLinkedHashMap.java
index 9135524..fb648a7 100644
--- a/android/guava/src/com/google/common/collect/CompactLinkedHashMap.java
+++ b/android/guava/src/com/google/common/collect/CompactLinkedHashMap.java
@@ -16,13 +16,16 @@
 
 package com.google.common.collect;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * CompactLinkedHashMap is an implementation of a Map with insertion or LRU iteration order,
@@ -45,11 +48,14 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible // not worth using in GWT for now
-class CompactLinkedHashMap<K, V> extends CompactHashMap<K, V> {
+@ElementTypesAreNonnullByDefault
+class CompactLinkedHashMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends CompactHashMap<K, V> {
   // TODO(lowasser): implement removeEldestEntry so this can be used as a drop-in replacement
 
   /** Creates an empty {@code CompactLinkedHashMap} instance. */
-  public static <K, V> CompactLinkedHashMap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      CompactLinkedHashMap<K, V> create() {
     return new CompactLinkedHashMap<>();
   }
 
@@ -62,7 +68,8 @@
    *     expectedSize} elements without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <K, V> CompactLinkedHashMap<K, V> createWithExpectedSize(int expectedSize) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      CompactLinkedHashMap<K, V> createWithExpectedSize(int expectedSize) {
     return new CompactLinkedHashMap<>(expectedSize);
   }
 
@@ -77,7 +84,7 @@
    * <p>A node with "prev" pointer equal to {@code ENDPOINT} is the first node in the linked list,
    * and a node with "next" pointer equal to {@code ENDPOINT} is the last node.
    */
-  @VisibleForTesting @NullableDecl transient long[] links;
+  @CheckForNull @VisibleForTesting transient long[] links;
 
   /** Pointer to the first node in the linked list, or {@code ENDPOINT} if there are no entries. */
   private transient int firstEntry;
@@ -127,23 +134,29 @@
     return result;
   }
 
+  /*
+   * For discussion of the safety of the following methods for operating on predecessors and
+   * successors, see the comments near the end of CompactHashMap, noting that the methods here call
+   * link(), which is defined at the end of this file.
+   */
+
   private int getPredecessor(int entry) {
-    return ((int) (links[entry] >>> 32)) - 1;
+    return ((int) (link(entry) >>> 32)) - 1;
   }
 
   @Override
   int getSuccessor(int entry) {
-    return ((int) links[entry]) - 1;
+    return ((int) link(entry)) - 1;
   }
 
   private void setSuccessor(int entry, int succ) {
     long succMask = (~0L) >>> 32;
-    links[entry] = (links[entry] & ~succMask) | ((succ + 1) & succMask);
+    setLink(entry, (link(entry) & ~succMask) | ((succ + 1) & succMask));
   }
 
   private void setPredecessor(int entry, int pred) {
     long predMask = ~0L << 32;
-    links[entry] = (links[entry] & ~predMask) | ((long) (pred + 1) << 32);
+    setLink(entry, (link(entry) & ~predMask) | ((long) (pred + 1) << 32));
   }
 
   private void setSucceeds(int pred, int succ) {
@@ -161,7 +174,8 @@
   }
 
   @Override
-  void insertEntry(int entryIndex, @NullableDecl K key, @NullableDecl V value, int hash, int mask) {
+  void insertEntry(
+      int entryIndex, @ParametricNullness K key, @ParametricNullness V value, int hash, int mask) {
     super.insertEntry(entryIndex, key, value, hash, mask);
     setSucceeds(lastEntry, entryIndex);
     setSucceeds(entryIndex, ENDPOINT);
@@ -189,13 +203,13 @@
       setSucceeds(getPredecessor(srcIndex), dstIndex);
       setSucceeds(dstIndex, getSuccessor(srcIndex));
     }
-    links[srcIndex] = 0;
+    setLink(srcIndex, 0);
   }
 
   @Override
   void resizeEntries(int newCapacity) {
     super.resizeEntries(newCapacity);
-    links = Arrays.copyOf(links, newCapacity);
+    links = Arrays.copyOf(requireLinks(), newCapacity);
   }
 
   @Override
@@ -220,4 +234,27 @@
     }
     super.clear();
   }
+
+  /*
+   * For discussion of the safety of the following methods, see the comments near the end of
+   * CompactHashMap.
+   */
+
+  private long[] requireLinks() {
+    return requireNonNull(links);
+  }
+
+  private long link(int i) {
+    return requireLinks()[i];
+  }
+
+  private void setLink(int i, long value) {
+    requireLinks()[i] = value;
+  }
+
+  /*
+   * We don't define getPredecessor+getSuccessor and setPredecessor+setSuccessor here because
+   * they're defined above -- including logic to add and subtract 1 to map between the values stored
+   * in the predecessor/successor arrays and the indexes in the elements array that they identify.
+   */
 }
diff --git a/android/guava/src/com/google/common/collect/CompactLinkedHashSet.java b/android/guava/src/com/google/common/collect/CompactLinkedHashSet.java
index 4f9aa4a..21d4805 100644
--- a/android/guava/src/com/google/common/collect/CompactLinkedHashSet.java
+++ b/android/guava/src/com/google/common/collect/CompactLinkedHashSet.java
@@ -16,13 +16,16 @@
 
 package com.google.common.collect;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * CompactLinkedHashSet is an implementation of a Set, which a predictable iteration order that
@@ -46,10 +49,11 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible // not worth using in GWT for now
-class CompactLinkedHashSet<E> extends CompactHashSet<E> {
+@ElementTypesAreNonnullByDefault
+class CompactLinkedHashSet<E extends @Nullable Object> extends CompactHashSet<E> {
 
   /** Creates an empty {@code CompactLinkedHashSet} instance. */
-  public static <E> CompactLinkedHashSet<E> create() {
+  public static <E extends @Nullable Object> CompactLinkedHashSet<E> create() {
     return new CompactLinkedHashSet<>();
   }
 
@@ -60,7 +64,8 @@
    * @param collection the elements that the set should contain
    * @return a new {@code CompactLinkedHashSet} containing those elements (minus duplicates)
    */
-  public static <E> CompactLinkedHashSet<E> create(Collection<? extends E> collection) {
+  public static <E extends @Nullable Object> CompactLinkedHashSet<E> create(
+      Collection<? extends E> collection) {
     CompactLinkedHashSet<E> set = createWithExpectedSize(collection.size());
     set.addAll(collection);
     return set;
@@ -74,7 +79,7 @@
    * @return a new {@code CompactLinkedHashSet} containing those elements (minus duplicates)
    */
   @SafeVarargs
-  public static <E> CompactLinkedHashSet<E> create(E... elements) {
+  public static <E extends @Nullable Object> CompactLinkedHashSet<E> create(E... elements) {
     CompactLinkedHashSet<E> set = createWithExpectedSize(elements.length);
     Collections.addAll(set, elements);
     return set;
@@ -89,7 +94,8 @@
    *     expectedSize} elements without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <E> CompactLinkedHashSet<E> createWithExpectedSize(int expectedSize) {
+  public static <E extends @Nullable Object> CompactLinkedHashSet<E> createWithExpectedSize(
+      int expectedSize) {
     return new CompactLinkedHashSet<>(expectedSize);
   }
 
@@ -103,13 +109,13 @@
    * Pointer to the predecessor of an entry in insertion order. ENDPOINT indicates a node is the
    * first node in insertion order; all values at indices ≥ {@link #size()} are UNSET.
    */
-  @NullableDecl private transient int[] predecessor;
+  @CheckForNull private transient int[] predecessor;
 
   /**
    * Pointer to the successor of an entry in insertion order. ENDPOINT indicates a node is the last
    * node in insertion order; all values at indices ≥ {@link #size()} are UNSET.
    */
-  @NullableDecl private transient int[] successor;
+  @CheckForNull private transient int[] successor;
 
   /** Pointer to the first node in the linked list, or {@code ENDPOINT} if there are no entries. */
   private transient int firstEntry;
@@ -149,21 +155,27 @@
     return result;
   }
 
+  /*
+   * For discussion of the safety of the following methods for operating on predecessors and
+   * successors, see the comments near the end of CompactHashMap, noting that the methods here call
+   * requirePredecessors() and requireSuccessors(), which are defined at the end of this file.
+   */
+
   private int getPredecessor(int entry) {
-    return predecessor[entry] - 1;
+    return requirePredecessors()[entry] - 1;
   }
 
   @Override
   int getSuccessor(int entry) {
-    return successor[entry] - 1;
+    return requireSuccessors()[entry] - 1;
   }
 
   private void setSuccessor(int entry, int succ) {
-    successor[entry] = succ + 1;
+    requireSuccessors()[entry] = succ + 1;
   }
 
   private void setPredecessor(int entry, int pred) {
-    predecessor[entry] = pred + 1;
+    requirePredecessors()[entry] = pred + 1;
   }
 
   private void setSucceeds(int pred, int succ) {
@@ -181,7 +193,7 @@
   }
 
   @Override
-  void insertEntry(int entryIndex, @NullableDecl E object, int hash, int mask) {
+  void insertEntry(int entryIndex, @ParametricNullness E object, int hash, int mask) {
     super.insertEntry(entryIndex, object, hash, mask);
     setSucceeds(lastEntry, entryIndex);
     setSucceeds(entryIndex, ENDPOINT);
@@ -197,15 +209,15 @@
       setSucceeds(getPredecessor(srcIndex), dstIndex);
       setSucceeds(dstIndex, getSuccessor(srcIndex));
     }
-    predecessor[srcIndex] = 0;
-    successor[srcIndex] = 0;
+    requirePredecessors()[srcIndex] = 0;
+    requireSuccessors()[srcIndex] = 0;
   }
 
   @Override
   void resizeEntries(int newCapacity) {
     super.resizeEntries(newCapacity);
-    predecessor = Arrays.copyOf(predecessor, newCapacity);
-    successor = Arrays.copyOf(successor, newCapacity);
+    predecessor = Arrays.copyOf(requirePredecessors(), newCapacity);
+    successor = Arrays.copyOf(requireSuccessors(), newCapacity);
   }
 
   @Override
@@ -219,12 +231,13 @@
   }
 
   @Override
-  public Object[] toArray() {
+  public @Nullable Object[] toArray() {
     return ObjectArrays.toArrayImpl(this);
   }
 
   @Override
-  public <T> T[] toArray(T[] a) {
+  @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+  public <T extends @Nullable Object> T[] toArray(T[] a) {
     return ObjectArrays.toArrayImpl(this, a);
   }
 
@@ -235,10 +248,30 @@
     }
     this.firstEntry = ENDPOINT;
     this.lastEntry = ENDPOINT;
-    if (predecessor != null) {
+    // Either both arrays are null or neither is, but we check both to satisfy the nullness checker.
+    if (predecessor != null && successor != null) {
       Arrays.fill(predecessor, 0, size(), 0);
       Arrays.fill(successor, 0, size(), 0);
     }
     super.clear();
   }
+
+  /*
+   * For discussion of the safety of the following methods, see the comments near the end of
+   * CompactHashMap.
+   */
+
+  private int[] requirePredecessors() {
+    return requireNonNull(predecessor);
+  }
+
+  private int[] requireSuccessors() {
+    return requireNonNull(successor);
+  }
+
+  /*
+   * We don't define getPredecessor+getSuccessor and setPredecessor+setSuccessor here because
+   * they're defined above -- including logic to add and subtract 1 to map between the values stored
+   * in the predecessor/successor arrays and the indexes in the elements array that they identify.
+   */
 }
diff --git a/android/guava/src/com/google/common/collect/ComparatorOrdering.java b/android/guava/src/com/google/common/collect/ComparatorOrdering.java
index a408920..8b34070 100644
--- a/android/guava/src/com/google/common/collect/ComparatorOrdering.java
+++ b/android/guava/src/com/google/common/collect/ComparatorOrdering.java
@@ -21,11 +21,14 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.Comparator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering for a pre-existing comparator. */
 @GwtCompatible(serializable = true)
-final class ComparatorOrdering<T> extends Ordering<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class ComparatorOrdering<T extends @Nullable Object> extends Ordering<T>
+    implements Serializable {
   final Comparator<T> comparator;
 
   ComparatorOrdering(Comparator<T> comparator) {
@@ -33,12 +36,12 @@
   }
 
   @Override
-  public int compare(T a, T b) {
+  public int compare(@ParametricNullness T a, @ParametricNullness T b) {
     return comparator.compare(a, b);
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/collect/Comparators.java b/android/guava/src/com/google/common/collect/Comparators.java
index 555e5b8..6a5670c 100644
--- a/android/guava/src/com/google/common/collect/Comparators.java
+++ b/android/guava/src/com/google/common/collect/Comparators.java
@@ -22,7 +22,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides static methods for working with {@link Comparator} instances. For many other helpful
@@ -41,6 +41,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Comparators {
   private Comparators() {}
 
@@ -58,7 +59,8 @@
   // Note: 90% of the time we don't add type parameters or wildcards that serve only to "tweak" the
   // desired return type. However, *nested* generics introduce a special class of problems that we
   // think tip it over into being worthwhile.
-  public static <T, S extends T> Comparator<Iterable<S>> lexicographical(Comparator<T> comparator) {
+  public static <T extends @Nullable Object, S extends T> Comparator<Iterable<S>> lexicographical(
+      Comparator<T> comparator) {
     return new LexicographicalOrdering<S>(checkNotNull(comparator));
   }
 
@@ -67,7 +69,8 @@
    * equal to the element that preceded it, according to the specified comparator. Note that this is
    * always true when the iterable has fewer than two elements.
    */
-  public static <T> boolean isInOrder(Iterable<? extends T> iterable, Comparator<T> comparator) {
+  public static <T extends @Nullable Object> boolean isInOrder(
+      Iterable<? extends T> iterable, Comparator<T> comparator) {
     checkNotNull(comparator);
     Iterator<? extends T> it = iterable.iterator();
     if (it.hasNext()) {
@@ -88,7 +91,7 @@
    * greater than the element that preceded it, according to the specified comparator. Note that
    * this is always true when the iterable has fewer than two elements.
    */
-  public static <T> boolean isInStrictOrder(
+  public static <T extends @Nullable Object> boolean isInStrictOrder(
       Iterable<? extends T> iterable, Comparator<T> comparator) {
     checkNotNull(comparator);
     Iterator<? extends T> it = iterable.iterator();
@@ -139,7 +142,9 @@
    * @since 30.0
    */
   @Beta
-  public static <T> T min(@NullableDecl T a, @NullableDecl T b, Comparator<T> comparator) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T min(
+      @ParametricNullness T a, @ParametricNullness T b, Comparator<T> comparator) {
     return (comparator.compare(a, b) <= 0) ? a : b;
   }
 
@@ -177,7 +182,9 @@
    * @since 30.0
    */
   @Beta
-  public static <T> T max(@NullableDecl T a, @NullableDecl T b, Comparator<T> comparator) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T max(
+      @ParametricNullness T a, @ParametricNullness T b, Comparator<T> comparator) {
     return (comparator.compare(a, b) >= 0) ? a : b;
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ComparisonChain.java b/android/guava/src/com/google/common/collect/ComparisonChain.java
index 2f74896..32aeb4d 100644
--- a/android/guava/src/com/google/common/collect/ComparisonChain.java
+++ b/android/guava/src/com/google/common/collect/ComparisonChain.java
@@ -21,7 +21,7 @@
 import com.google.common.primitives.Ints;
 import com.google.common.primitives.Longs;
 import java.util.Comparator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A utility for performing a chained comparison statement. For example:
@@ -57,6 +57,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ComparisonChain {
   private ComparisonChain() {}
 
@@ -67,15 +68,15 @@
 
   private static final ComparisonChain ACTIVE =
       new ComparisonChain() {
-        @SuppressWarnings("unchecked")
+        @SuppressWarnings("unchecked") // unsafe; see discussion on supertype
         @Override
-        public ComparisonChain compare(Comparable left, Comparable right) {
-          return classify(left.compareTo(right));
+        public ComparisonChain compare(Comparable<?> left, Comparable<?> right) {
+          return classify(((Comparable<Object>) left).compareTo(right));
         }
 
         @Override
-        public <T> ComparisonChain compare(
-            @NullableDecl T left, @NullableDecl T right, Comparator<T> comparator) {
+        public <T extends @Nullable Object> ComparisonChain compare(
+            @ParametricNullness T left, @ParametricNullness T right, Comparator<T> comparator) {
           return classify(comparator.compare(left, right));
         }
 
@@ -131,13 +132,13 @@
     }
 
     @Override
-    public ComparisonChain compare(@NullableDecl Comparable left, @NullableDecl Comparable right) {
+    public ComparisonChain compare(Comparable<?> left, Comparable<?> right) {
       return this;
     }
 
     @Override
-    public <T> ComparisonChain compare(
-        @NullableDecl T left, @NullableDecl T right, @NullableDecl Comparator<T> comparator) {
+    public <T extends @Nullable Object> ComparisonChain compare(
+        @ParametricNullness T left, @ParametricNullness T right, Comparator<T> comparator) {
       return this;
     }
 
@@ -180,6 +181,18 @@
   /**
    * Compares two comparable objects as specified by {@link Comparable#compareTo}, <i>if</i> the
    * result of this comparison chain has not already been determined.
+   *
+   * <p>This method is declared to accept any 2 {@code Comparable} objects, even if they are not <a
+   * href="https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html">mutually
+   * comparable</a>. If you pass objects that are not mutually comparable, this method may throw an
+   * exception. (The reason for this decision is lost to time, but the reason <i>might</i> be that
+   * we wanted to support legacy classes that implement the raw type {@code Comparable} (instead of
+   * implementing {@code Comparable<Foo>}) without producing warnings. If so, we would prefer today
+   * to produce warnings in that case, and we may change this method to do so in the future. Support
+   * for raw {@code Comparable} types in Guava in general is tracked as <a
+   * href="https://github.com/google/guava/issues/989">#989</a>.)
+   *
+   * @throws ClassCastException if the parameters are not mutually comparable
    */
   public abstract ComparisonChain compare(Comparable<?> left, Comparable<?> right);
 
@@ -187,8 +200,8 @@
    * Compares two objects using a comparator, <i>if</i> the result of this comparison chain has not
    * already been determined.
    */
-  public abstract <T> ComparisonChain compare(
-      @NullableDecl T left, @NullableDecl T right, Comparator<T> comparator);
+  public abstract <T extends @Nullable Object> ComparisonChain compare(
+      @ParametricNullness T left, @ParametricNullness T right, Comparator<T> comparator);
 
   /**
    * Compares two {@code int} values as specified by {@link Ints#compare}, <i>if</i> the result of
diff --git a/android/guava/src/com/google/common/collect/CompoundOrdering.java b/android/guava/src/com/google/common/collect/CompoundOrdering.java
index e803acb..42feed3 100644
--- a/android/guava/src/com/google/common/collect/CompoundOrdering.java
+++ b/android/guava/src/com/google/common/collect/CompoundOrdering.java
@@ -20,10 +20,14 @@
 import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Comparator;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering that tries several comparators in order. */
 @GwtCompatible(serializable = true)
-final class CompoundOrdering<T> extends Ordering<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class CompoundOrdering<T extends @Nullable Object> extends Ordering<T>
+    implements Serializable {
   final Comparator<? super T>[] comparators;
 
   CompoundOrdering(Comparator<? super T> primary, Comparator<? super T> secondary) {
@@ -35,7 +39,7 @@
   }
 
   @Override
-  public int compare(T left, T right) {
+  public int compare(@ParametricNullness T left, @ParametricNullness T right) {
     for (int i = 0; i < comparators.length; i++) {
       int result = comparators[i].compare(left, right);
       if (result != 0) {
@@ -46,7 +50,7 @@
   }
 
   @Override
-  public boolean equals(Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/collect/ComputationException.java b/android/guava/src/com/google/common/collect/ComputationException.java
index dc569da..b05577c 100644
--- a/android/guava/src/com/google/common/collect/ComputationException.java
+++ b/android/guava/src/com/google/common/collect/ComputationException.java
@@ -17,7 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Wraps an exception that occurred during a computation.
@@ -34,9 +34,10 @@
  */
 @Deprecated
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class ComputationException extends RuntimeException {
   /** Creates a new instance with the given cause. */
-  public ComputationException(@NullableDecl Throwable cause) {
+  public ComputationException(@CheckForNull Throwable cause) {
     super(cause);
   }
 
diff --git a/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java b/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
index 8bdfca3..ab03ead 100644
--- a/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
+++ b/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
@@ -18,8 +18,8 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -41,7 +41,8 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A multiset that supports concurrent modifications and that provides atomic versions of most
@@ -56,6 +57,7 @@
  * @since 2.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ConcurrentHashMultiset<E> extends AbstractMultiset<E> implements Serializable {
 
   /*
@@ -137,7 +139,7 @@
    * @return the nonnegative number of occurrences of the element
    */
   @Override
-  public int count(@NullableDecl Object element) {
+  public int count(@CheckForNull Object element) {
     AtomicInteger existingCounter = Maps.safeGet(countMap, element);
     return (existingCounter == null) ? 0 : existingCounter.get();
   }
@@ -168,7 +170,8 @@
   }
 
   @Override
-  public <T> T[] toArray(T[] array) {
+  @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+  public <T extends @Nullable Object> T[] toArray(T[] array) {
     return snapshot().toArray(array);
   }
 
@@ -205,7 +208,7 @@
     if (occurrences == 0) {
       return count(element);
     }
-    CollectPreconditions.checkPositive(occurrences, "occurences");
+    CollectPreconditions.checkPositive(occurrences, "occurrences");
 
     while (true) {
       AtomicInteger existingCounter = Maps.safeGet(countMap, element);
@@ -261,17 +264,17 @@
    * if occurrences == 0. This satisfies both NullPointerTester and
    * CollectionRemoveTester.testRemove_nullAllowed, but it's not clear that it's
    * a good policy, especially because, in order for the test to pass, the
-   * parameter must be misleadingly annotated as @NullableDecl. I suspect that
-   * we'll want to remove @NullableDecl, add an eager checkNotNull, and loosen up
+   * parameter must be misleadingly annotated as @Nullable. I suspect that
+   * we'll want to remove @Nullable, add an eager checkNotNull, and loosen up
    * testRemove_nullAllowed.
    */
   @CanIgnoreReturnValue
   @Override
-  public int remove(@NullableDecl Object element, int occurrences) {
+  public int remove(@CheckForNull Object element, int occurrences) {
     if (occurrences == 0) {
       return count(element);
     }
-    CollectPreconditions.checkPositive(occurrences, "occurences");
+    CollectPreconditions.checkPositive(occurrences, "occurrences");
 
     AtomicInteger existingCounter = Maps.safeGet(countMap, element);
     if (existingCounter == null) {
@@ -308,11 +311,11 @@
    * @throws IllegalArgumentException if {@code occurrences} is negative
    */
   @CanIgnoreReturnValue
-  public boolean removeExactly(@NullableDecl Object element, int occurrences) {
+  public boolean removeExactly(@CheckForNull Object element, int occurrences) {
     if (occurrences == 0) {
       return true;
     }
-    CollectPreconditions.checkPositive(occurrences, "occurences");
+    CollectPreconditions.checkPositive(occurrences, "occurrences");
 
     AtomicInteger existingCounter = Maps.safeGet(countMap, element);
     if (existingCounter == null) {
@@ -454,7 +457,7 @@
       }
 
       @Override
-      public boolean contains(@NullableDecl Object object) {
+      public boolean contains(@CheckForNull Object object) {
         return object != null && Collections2.safeContains(delegate, object);
       }
 
@@ -464,7 +467,7 @@
       }
 
       @Override
-      public boolean remove(Object object) {
+      public boolean remove(@CheckForNull Object object) {
         return object != null && Collections2.safeRemove(delegate, object);
       }
 
@@ -507,6 +510,7 @@
               countMap.entrySet().iterator();
 
           @Override
+          @CheckForNull
           protected Entry<E> computeNext() {
             while (true) {
               if (!mapEntries.hasNext()) {
@@ -522,7 +526,7 @@
         };
 
     return new ForwardingIterator<Entry<E>>() {
-      @NullableDecl private Entry<E> last;
+      @CheckForNull private Entry<E> last;
 
       @Override
       protected Iterator<Entry<E>> delegate() {
@@ -537,7 +541,7 @@
 
       @Override
       public void remove() {
-        checkRemove(last != null);
+        checkState(last != null, "no calls to next() since the last call to remove()");
         ConcurrentHashMultiset.this.setCount(last.getElement(), 0);
         last = null;
       }
@@ -572,7 +576,8 @@
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return snapshot().toArray(array);
     }
 
diff --git a/android/guava/src/com/google/common/collect/ConsumingQueueIterator.java b/android/guava/src/com/google/common/collect/ConsumingQueueIterator.java
index 2f288f0..7721e12 100644
--- a/android/guava/src/com/google/common/collect/ConsumingQueueIterator.java
+++ b/android/guava/src/com/google/common/collect/ConsumingQueueIterator.java
@@ -17,29 +17,30 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtCompatible;
-import java.util.ArrayDeque;
-import java.util.Collections;
 import java.util.Queue;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An Iterator implementation which draws elements from a queue, removing them from the queue as it
  * iterates.
  */
 @GwtCompatible
-class ConsumingQueueIterator<T> extends AbstractIterator<T> {
+@ElementTypesAreNonnullByDefault
+final class ConsumingQueueIterator<T extends @Nullable Object> extends AbstractIterator<T> {
   private final Queue<T> queue;
 
-  ConsumingQueueIterator(T... elements) {
-    this.queue = new ArrayDeque<T>(elements.length);
-    Collections.addAll(queue, elements);
-  }
-
   ConsumingQueueIterator(Queue<T> queue) {
     this.queue = checkNotNull(queue);
   }
 
   @Override
+  @CheckForNull
   public T computeNext() {
-    return queue.isEmpty() ? endOfData() : queue.remove();
+    // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+    if (queue.isEmpty()) {
+      return endOfData();
+    }
+    return queue.remove();
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ContiguousSet.java b/android/guava/src/com/google/common/collect/ContiguousSet.java
index 6755be6..cd77042 100644
--- a/android/guava/src/com/google/common/collect/ContiguousSet.java
+++ b/android/guava/src/com/google/common/collect/ContiguousSet.java
@@ -16,10 +16,12 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.Collections;
 import java.util.NoSuchElementException;
 import java.util.Set;
@@ -48,6 +50,7 @@
  */
 @GwtCompatible(emulated = true)
 @SuppressWarnings("rawtypes") // allow ungenerified Comparable types
+@ElementTypesAreNonnullByDefault
 public abstract class ContiguousSet<C extends Comparable> extends ImmutableSortedSet<C> {
   /**
    * Returns a {@code ContiguousSet} containing the same values in the given domain {@linkplain
@@ -73,13 +76,19 @@
       throw new IllegalArgumentException(e);
     }
 
-    // Per class spec, we are allowed to throw CCE if necessary
-    boolean empty =
-        effectiveRange.isEmpty()
-            || Range.compareOrThrow(
-                    range.lowerBound.leastValueAbove(domain),
-                    range.upperBound.greatestValueBelow(domain))
-                > 0;
+    boolean empty;
+    if (effectiveRange.isEmpty()) {
+      empty = true;
+    } else {
+      /*
+       * requireNonNull is safe because the effectiveRange operations above would have thrown or
+       * effectiveRange.isEmpty() would have returned true.
+       */
+      C afterLower = requireNonNull(range.lowerBound.leastValueAbove(domain));
+      C beforeUpper = requireNonNull(range.upperBound.greatestValueBelow(domain));
+      // Per class spec, we are allowed to throw CCE if necessary
+      empty = Range.compareOrThrow(afterLower, beforeUpper) > 0;
+    }
 
     return empty
         ? new EmptyContiguousSet<C>(domain)
@@ -191,15 +200,14 @@
   /*
    * These methods perform most headSet, subSet, and tailSet logic, besides parameter validation.
    */
-  // TODO(kevinb): we can probably make these real @Overrides now
-  /* @Override */
+  @SuppressWarnings("MissingOverride") // Supermethod does not exist under GWT.
   abstract ContiguousSet<C> headSetImpl(C toElement, boolean inclusive);
 
-  /* @Override */
+  @SuppressWarnings("MissingOverride") // Supermethod does not exist under GWT.
   abstract ContiguousSet<C> subSetImpl(
       C fromElement, boolean fromInclusive, C toElement, boolean toInclusive);
 
-  /* @Override */
+  @SuppressWarnings("MissingOverride") // Supermethod does not exist under GWT.
   abstract ContiguousSet<C> tailSetImpl(C fromElement, boolean inclusive);
 
   /**
@@ -252,6 +260,7 @@
    * @deprecated Use {@link #create}.
    */
   @Deprecated
+  @DoNotCall("Always throws UnsupportedOperationException")
   public static <E> ImmutableSortedSet.Builder<E> builder() {
     throw new UnsupportedOperationException();
   }
diff --git a/android/guava/src/com/google/common/collect/Count.java b/android/guava/src/com/google/common/collect/Count.java
index 9a0ea41..7aa5550 100644
--- a/android/guava/src/com/google/common/collect/Count.java
+++ b/android/guava/src/com/google/common/collect/Count.java
@@ -16,7 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A mutable value of type {@code int}, for multisets to use in tracking counts of values.
@@ -24,6 +24,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class Count implements Serializable {
   private int value;
 
@@ -59,7 +60,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     return obj instanceof Count && ((Count) obj).value == value;
   }
 
diff --git a/android/guava/src/com/google/common/collect/Cut.java b/android/guava/src/com/google/common/collect/Cut.java
index b792d84..4a8d4c7 100644
--- a/android/guava/src/com/google/common/collect/Cut.java
+++ b/android/guava/src/com/google/common/collect/Cut.java
@@ -20,7 +20,7 @@
 import com.google.common.primitives.Booleans;
 import java.io.Serializable;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation detail for the internal structure of {@link Range} instances. Represents a unique
@@ -32,10 +32,11 @@
  * @author Kevin Bourrillion
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 abstract class Cut<C extends Comparable> implements Comparable<Cut<C>>, Serializable {
-  @NullableDecl final C endpoint;
+  final C endpoint;
 
-  Cut(@NullableDecl C endpoint) {
+  Cut(C endpoint) {
     this.endpoint = endpoint;
   }
 
@@ -53,8 +54,10 @@
 
   abstract void describeAsUpperBound(StringBuilder sb);
 
+  @CheckForNull
   abstract C leastValueAbove(DiscreteDomain<C> domain);
 
+  @CheckForNull
   abstract C greatestValueBelow(DiscreteDomain<C> domain);
 
   /*
@@ -88,14 +91,15 @@
 
   @SuppressWarnings("unchecked") // catching CCE
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj instanceof Cut) {
       // It might not really be a Cut<C>, but we'll catch a CCE if it's not
       Cut<C> that = (Cut<C>) obj;
       try {
         int compareResult = compareTo(that);
         return compareResult == 0;
-      } catch (ClassCastException ignored) {
+      } catch (ClassCastException wastNotComparableToOurType) {
+        return false;
       }
     }
     return false;
@@ -120,7 +124,13 @@
     private static final BelowAll INSTANCE = new BelowAll();
 
     private BelowAll() {
-      super(null);
+      /*
+       * No code ever sees this bogus value for `endpoint`: This class overrides both methods that
+       * use the `endpoint` field, compareTo() and endpoint(). Additionally, the main implementation
+       * of Cut.compareTo checks for belowAll before reading accessing `endpoint` on another Cut
+       * instance.
+       */
+      super("");
     }
 
     @Override
@@ -219,7 +229,8 @@
     private static final AboveAll INSTANCE = new AboveAll();
 
     private AboveAll() {
-      super(null);
+      // For discussion of "", see BelowAll.
+      super("");
     }
 
     @Override
@@ -326,7 +337,7 @@
         case CLOSED:
           return this;
         case OPEN:
-          @NullableDecl C previous = domain.previous(endpoint);
+          C previous = domain.previous(endpoint);
           return (previous == null) ? Cut.<C>belowAll() : new AboveValue<C>(previous);
         default:
           throw new AssertionError();
@@ -337,7 +348,7 @@
     Cut<C> withUpperBoundType(BoundType boundType, DiscreteDomain<C> domain) {
       switch (boundType) {
         case CLOSED:
-          @NullableDecl C previous = domain.previous(endpoint);
+          C previous = domain.previous(endpoint);
           return (previous == null) ? Cut.<C>aboveAll() : new AboveValue<C>(previous);
         case OPEN:
           return this;
@@ -362,6 +373,7 @@
     }
 
     @Override
+    @CheckForNull
     C greatestValueBelow(DiscreteDomain<C> domain) {
       return domain.previous(endpoint);
     }
@@ -409,7 +421,7 @@
         case OPEN:
           return this;
         case CLOSED:
-          @NullableDecl C next = domain.next(endpoint);
+          C next = domain.next(endpoint);
           return (next == null) ? Cut.<C>belowAll() : belowValue(next);
         default:
           throw new AssertionError();
@@ -420,7 +432,7 @@
     Cut<C> withUpperBoundType(BoundType boundType, DiscreteDomain<C> domain) {
       switch (boundType) {
         case OPEN:
-          @NullableDecl C next = domain.next(endpoint);
+          C next = domain.next(endpoint);
           return (next == null) ? Cut.<C>aboveAll() : belowValue(next);
         case CLOSED:
           return this;
@@ -440,6 +452,7 @@
     }
 
     @Override
+    @CheckForNull
     C leastValueAbove(DiscreteDomain<C> domain) {
       return domain.next(endpoint);
     }
diff --git a/android/guava/src/com/google/common/collect/DenseImmutableTable.java b/android/guava/src/com/google/common/collect/DenseImmutableTable.java
index 4e28c89..9de77c5 100644
--- a/android/guava/src/com/google/common/collect/DenseImmutableTable.java
+++ b/android/guava/src/com/google/common/collect/DenseImmutableTable.java
@@ -14,16 +14,20 @@
 
 package com.google.common.collect;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.ImmutableMap.IteratorBasedImmutableMap;
 import com.google.errorprone.annotations.Immutable;
 import com.google.j2objc.annotations.WeakOuter;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** A {@code RegularImmutableTable} optimized for dense data. */
 @GwtCompatible
 @Immutable(containerOf = {"R", "C", "V"})
+@ElementTypesAreNonnullByDefault
 final class DenseImmutableTable<R, C, V> extends RegularImmutableTable<R, C, V> {
   private final ImmutableMap<R, Integer> rowKeyToIndex;
   private final ImmutableMap<C, Integer> columnKeyToIndex;
@@ -37,7 +41,7 @@
   private final int[] columnCounts;
 
   @SuppressWarnings("Immutable") // We don't modify this after construction.
-  private final V[][] values;
+  private final @Nullable V[][] values;
 
   // For each cell in iteration order, the index of that cell's row key in the row key list.
   @SuppressWarnings("Immutable") // We don't modify this after construction.
@@ -52,7 +56,8 @@
       ImmutableSet<R> rowSpace,
       ImmutableSet<C> columnSpace) {
     @SuppressWarnings("unchecked")
-    V[][] array = (V[][]) new Object[rowSpace.size()][columnSpace.size()];
+    @Nullable
+    V[][] array = (@Nullable V[][]) new Object[rowSpace.size()][columnSpace.size()];
     this.values = array;
     this.rowKeyToIndex = Maps.indexMap(rowSpace);
     this.columnKeyToIndex = Maps.indexMap(columnSpace);
@@ -64,8 +69,9 @@
       Cell<R, C, V> cell = cellList.get(i);
       R rowKey = cell.getRowKey();
       C columnKey = cell.getColumnKey();
-      int rowIndex = rowKeyToIndex.get(rowKey);
-      int columnIndex = columnKeyToIndex.get(columnKey);
+      // The requireNonNull calls are safe because we construct the indexes with indexMap.
+      int rowIndex = requireNonNull(rowKeyToIndex.get(rowKey));
+      int columnIndex = requireNonNull(columnKeyToIndex.get(columnKey));
       V existingValue = values[rowIndex][columnIndex];
       checkNoDuplicate(rowKey, columnKey, existingValue, cell.getValue());
       values[rowIndex][columnIndex] = cell.getValue();
@@ -99,7 +105,7 @@
       return keyToIndex().keySet().asList().get(index);
     }
 
-    @NullableDecl
+    @CheckForNull
     abstract V getValue(int keyIndex);
 
     @Override
@@ -113,7 +119,8 @@
     }
 
     @Override
-    public V get(@NullableDecl Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       Integer keyIndex = keyToIndex().get(key);
       return (keyIndex == null) ? null : getValue(keyIndex);
     }
@@ -125,6 +132,7 @@
         private final int maxIndex = keyToIndex().size();
 
         @Override
+        @CheckForNull
         protected Entry<K, V> computeNext() {
           for (index++; index < maxIndex; index++) {
             V value = getValue(index);
@@ -152,6 +160,7 @@
     }
 
     @Override
+    @CheckForNull
     V getValue(int keyIndex) {
       return values[rowIndex][keyIndex];
     }
@@ -176,6 +185,7 @@
     }
 
     @Override
+    @CheckForNull
     V getValue(int keyIndex) {
       return values[keyIndex][columnIndex];
     }
@@ -245,7 +255,8 @@
   }
 
   @Override
-  public V get(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+  @CheckForNull
+  public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Integer rowIndex = rowKeyToIndex.get(rowKey);
     Integer columnIndex = columnKeyToIndex.get(columnKey);
     return ((rowIndex == null) || (columnIndex == null)) ? null : values[rowIndex][columnIndex];
@@ -262,13 +273,15 @@
     int columnIndex = cellColumnIndices[index];
     R rowKey = rowKeySet().asList().get(rowIndex);
     C columnKey = columnKeySet().asList().get(columnIndex);
-    V value = values[rowIndex][columnIndex];
+    // requireNonNull is safe because we use indexes that were populated by the constructor.
+    V value = requireNonNull(values[rowIndex][columnIndex]);
     return cellOf(rowKey, columnKey, value);
   }
 
   @Override
   V getValue(int index) {
-    return values[cellRowIndices[index]][cellColumnIndices[index]];
+    // requireNonNull is safe because we use indexes that were populated by the constructor.
+    return requireNonNull(values[cellRowIndices[index]][cellColumnIndices[index]]);
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/collect/DescendingImmutableSortedMultiset.java b/android/guava/src/com/google/common/collect/DescendingImmutableSortedMultiset.java
index 189acdb..181731c 100644
--- a/android/guava/src/com/google/common/collect/DescendingImmutableSortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/DescendingImmutableSortedMultiset.java
@@ -15,7 +15,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A descending wrapper around an {@code ImmutableSortedMultiset}
@@ -24,6 +24,7 @@
  */
 @SuppressWarnings("serial") // uses writeReplace, not default serialization
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class DescendingImmutableSortedMultiset<E> extends ImmutableSortedMultiset<E> {
   private final transient ImmutableSortedMultiset<E> forward;
 
@@ -32,16 +33,18 @@
   }
 
   @Override
-  public int count(@NullableDecl Object element) {
+  public int count(@CheckForNull Object element) {
     return forward.count(element);
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     return forward.lastEntry();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     return forward.firstEntry();
   }
diff --git a/android/guava/src/com/google/common/collect/DescendingImmutableSortedSet.java b/android/guava/src/com/google/common/collect/DescendingImmutableSortedSet.java
index 64e3e89..88c7d6b 100644
--- a/android/guava/src/com/google/common/collect/DescendingImmutableSortedSet.java
+++ b/android/guava/src/com/google/common/collect/DescendingImmutableSortedSet.java
@@ -17,7 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Skeletal implementation of {@link ImmutableSortedSet#descendingSet()}.
@@ -25,6 +25,7 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class DescendingImmutableSortedSet<E> extends ImmutableSortedSet<E> {
   private final ImmutableSortedSet<E> forward;
 
@@ -34,7 +35,7 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return forward.contains(object);
   }
 
@@ -83,27 +84,31 @@
   }
 
   @Override
+  @CheckForNull
   public E lower(E element) {
     return forward.higher(element);
   }
 
   @Override
+  @CheckForNull
   public E floor(E element) {
     return forward.ceiling(element);
   }
 
   @Override
+  @CheckForNull
   public E ceiling(E element) {
     return forward.floor(element);
   }
 
   @Override
+  @CheckForNull
   public E higher(E element) {
     return forward.lower(element);
   }
 
   @Override
-  int indexOf(@NullableDecl Object target) {
+  int indexOf(@CheckForNull Object target) {
     int index = forward.indexOf(target);
     if (index == -1) {
       return index;
diff --git a/android/guava/src/com/google/common/collect/DescendingMultiset.java b/android/guava/src/com/google/common/collect/DescendingMultiset.java
index 72a88af..ec5a1d0 100644
--- a/android/guava/src/com/google/common/collect/DescendingMultiset.java
+++ b/android/guava/src/com/google/common/collect/DescendingMultiset.java
@@ -22,7 +22,8 @@
 import java.util.Iterator;
 import java.util.NavigableSet;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A skeleton implementation of a descending multiset. Only needs {@code forwardMultiset()} and
@@ -31,10 +32,12 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(emulated = true)
-abstract class DescendingMultiset<E> extends ForwardingMultiset<E> implements SortedMultiset<E> {
+@ElementTypesAreNonnullByDefault
+abstract class DescendingMultiset<E extends @Nullable Object> extends ForwardingMultiset<E>
+    implements SortedMultiset<E> {
   abstract SortedMultiset<E> forwardMultiset();
 
-  @NullableDecl private transient Comparator<? super E> comparator;
+  @CheckForNull private transient Comparator<? super E> comparator;
 
   @Override
   public Comparator<? super E> comparator() {
@@ -45,7 +48,7 @@
     return result;
   }
 
-  @NullableDecl private transient NavigableSet<E> elementSet;
+  @CheckForNull private transient NavigableSet<E> elementSet;
 
   @Override
   public NavigableSet<E> elementSet() {
@@ -57,30 +60,35 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollFirstEntry() {
     return forwardMultiset().pollLastEntry();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollLastEntry() {
     return forwardMultiset().pollFirstEntry();
   }
 
   @Override
-  public SortedMultiset<E> headMultiset(E toElement, BoundType boundType) {
+  public SortedMultiset<E> headMultiset(@ParametricNullness E toElement, BoundType boundType) {
     return forwardMultiset().tailMultiset(toElement, boundType).descendingMultiset();
   }
 
   @Override
   public SortedMultiset<E> subMultiset(
-      E fromElement, BoundType fromBoundType, E toElement, BoundType toBoundType) {
+      @ParametricNullness E fromElement,
+      BoundType fromBoundType,
+      @ParametricNullness E toElement,
+      BoundType toBoundType) {
     return forwardMultiset()
         .subMultiset(toElement, toBoundType, fromElement, fromBoundType)
         .descendingMultiset();
   }
 
   @Override
-  public SortedMultiset<E> tailMultiset(E fromElement, BoundType boundType) {
+  public SortedMultiset<E> tailMultiset(@ParametricNullness E fromElement, BoundType boundType) {
     return forwardMultiset().headMultiset(fromElement, boundType).descendingMultiset();
   }
 
@@ -95,18 +103,20 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     return forwardMultiset().lastEntry();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     return forwardMultiset().firstEntry();
   }
 
   abstract Iterator<Entry<E>> entryIterator();
 
-  @NullableDecl private transient Set<Entry<E>> entrySet;
+  @CheckForNull private transient Set<Entry<E>> entrySet;
 
   @Override
   public Set<Entry<E>> entrySet() {
@@ -141,12 +151,13 @@
   }
 
   @Override
-  public Object[] toArray() {
+  public @Nullable Object[] toArray() {
     return standardToArray();
   }
 
   @Override
-  public <T> T[] toArray(T[] array) {
+  @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+  public <T extends @Nullable Object> T[] toArray(T[] array) {
     return standardToArray(array);
   }
 
diff --git a/android/guava/src/com/google/common/collect/DiscreteDomain.java b/android/guava/src/com/google/common/collect/DiscreteDomain.java
index 3777a6d..bce7062 100644
--- a/android/guava/src/com/google/common/collect/DiscreteDomain.java
+++ b/android/guava/src/com/google/common/collect/DiscreteDomain.java
@@ -25,6 +25,7 @@
 import java.io.Serializable;
 import java.math.BigInteger;
 import java.util.NoSuchElementException;
+import javax.annotation.CheckForNull;
 
 /**
  * A descriptor for a <i>discrete</i> {@code Comparable} domain such as all {@link Integer}
@@ -43,6 +44,7 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class DiscreteDomain<C extends Comparable> {
 
   /**
@@ -62,12 +64,14 @@
     }
 
     @Override
+    @CheckForNull
     public Integer next(Integer value) {
       int i = value;
       return (i == Integer.MAX_VALUE) ? null : i + 1;
     }
 
     @Override
+    @CheckForNull
     public Integer previous(Integer value) {
       int i = value;
       return (i == Integer.MIN_VALUE) ? null : i - 1;
@@ -123,12 +127,14 @@
     }
 
     @Override
+    @CheckForNull
     public Long next(Long value) {
       long l = value;
       return (l == Long.MAX_VALUE) ? null : l + 1;
     }
 
     @Override
+    @CheckForNull
     public Long previous(Long value) {
       long l = value;
       return (l == Long.MIN_VALUE) ? null : l - 1;
@@ -248,11 +254,16 @@
    * #next} on {@code origin} {@code distance} times.
    */
   C offset(C origin, long distance) {
+    C current = origin;
     checkNonnegative(distance, "distance");
     for (long i = 0; i < distance; i++) {
-      origin = next(origin);
+      current = next(current);
+      if (current == null) {
+        throw new IllegalArgumentException(
+            "overflowed computing offset(" + origin + ", " + distance + ")");
+      }
     }
-    return origin;
+    return current;
   }
 
   /**
@@ -263,6 +274,7 @@
    * @return the least value greater than {@code value}, or {@code null} if {@code value} is {@code
    *     maxValue()}
    */
+  @CheckForNull
   public abstract C next(C value);
 
   /**
@@ -273,6 +285,7 @@
    * @return the greatest value less than {@code value}, or {@code null} if {@code value} is {@code
    *     minValue()}
    */
+  @CheckForNull
   public abstract C previous(C value);
 
   /**
diff --git a/android/guava/src/com/google/common/collect/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/collect/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..e1c640f
--- /dev/null
+++ b/android/guava/src/com/google/common/collect/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.collect;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/collect/EmptyContiguousSet.java b/android/guava/src/com/google/common/collect/EmptyContiguousSet.java
index 8043ef7..f4fe33c 100644
--- a/android/guava/src/com/google/common/collect/EmptyContiguousSet.java
+++ b/android/guava/src/com/google/common/collect/EmptyContiguousSet.java
@@ -18,7 +18,7 @@
 import java.io.Serializable;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An empty contiguous set.
@@ -27,6 +27,7 @@
  */
 @GwtCompatible(emulated = true)
 @SuppressWarnings("rawtypes") // allow ungenerified Comparable types
+@ElementTypesAreNonnullByDefault
 final class EmptyContiguousSet<C extends Comparable> extends ContiguousSet<C> {
   EmptyContiguousSet(DiscreteDomain<C> domain) {
     super(domain);
@@ -79,13 +80,13 @@
   }
 
   @Override
-  public boolean contains(Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return false;
   }
 
   @GwtIncompatible // not used by GWT emulation
   @Override
-  int indexOf(Object target) {
+  int indexOf(@CheckForNull Object target) {
     return -1;
   }
 
@@ -121,7 +122,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Set) {
       Set<?> that = (Set<?>) object;
       return that.isEmpty();
diff --git a/android/guava/src/com/google/common/collect/EmptyImmutableListMultimap.java b/android/guava/src/com/google/common/collect/EmptyImmutableListMultimap.java
index 9b167fb..10d030f 100644
--- a/android/guava/src/com/google/common/collect/EmptyImmutableListMultimap.java
+++ b/android/guava/src/com/google/common/collect/EmptyImmutableListMultimap.java
@@ -24,6 +24,7 @@
  * @author Jared Levy
  */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 class EmptyImmutableListMultimap extends ImmutableListMultimap<Object, Object> {
   static final EmptyImmutableListMultimap INSTANCE = new EmptyImmutableListMultimap();
 
diff --git a/android/guava/src/com/google/common/collect/EmptyImmutableSetMultimap.java b/android/guava/src/com/google/common/collect/EmptyImmutableSetMultimap.java
index ec2ce2e..bd0a67a 100644
--- a/android/guava/src/com/google/common/collect/EmptyImmutableSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/EmptyImmutableSetMultimap.java
@@ -24,6 +24,7 @@
  * @author Mike Ward
  */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 class EmptyImmutableSetMultimap extends ImmutableSetMultimap<Object, Object> {
   static final EmptyImmutableSetMultimap INSTANCE = new EmptyImmutableSetMultimap();
 
diff --git a/android/guava/src/com/google/common/collect/EnumBiMap.java b/android/guava/src/com/google/common/collect/EnumBiMap.java
index f72b8b9..82aa052 100644
--- a/android/guava/src/com/google/common/collect/EnumBiMap.java
+++ b/android/guava/src/com/google/common/collect/EnumBiMap.java
@@ -38,6 +38,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class EnumBiMap<K extends Enum<K>, V extends Enum<V>> extends AbstractBiMap<K, V> {
   private transient Class<K> keyType;
   private transient Class<V> valueType;
diff --git a/android/guava/src/com/google/common/collect/EnumHashBiMap.java b/android/guava/src/com/google/common/collect/EnumHashBiMap.java
index 0a7e52e..f68bc4c 100644
--- a/android/guava/src/com/google/common/collect/EnumHashBiMap.java
+++ b/android/guava/src/com/google/common/collect/EnumHashBiMap.java
@@ -27,7 +27,8 @@
 import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@code BiMap} backed by an {@code EnumMap} instance for keys-to-values, and a {@code HashMap}
@@ -41,7 +42,9 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
-public final class EnumHashBiMap<K extends Enum<K>, V> extends AbstractBiMap<K, V> {
+@ElementTypesAreNonnullByDefault
+public final class EnumHashBiMap<K extends Enum<K>, V extends @Nullable Object>
+    extends AbstractBiMap<K, V> {
   private transient Class<K> keyType;
 
   /**
@@ -49,7 +52,8 @@
    *
    * @param keyType the key type
    */
-  public static <K extends Enum<K>, V> EnumHashBiMap<K, V> create(Class<K> keyType) {
+  public static <K extends Enum<K>, V extends @Nullable Object> EnumHashBiMap<K, V> create(
+      Class<K> keyType) {
     return new EnumHashBiMap<>(keyType);
   }
 
@@ -63,7 +67,8 @@
    * @throws IllegalArgumentException if map is not an {@code EnumBiMap} or an {@code EnumHashBiMap}
    *     instance and contains no mappings
    */
-  public static <K extends Enum<K>, V> EnumHashBiMap<K, V> create(Map<K, ? extends V> map) {
+  public static <K extends Enum<K>, V extends @Nullable Object> EnumHashBiMap<K, V> create(
+      Map<K, ? extends V> map) {
     EnumHashBiMap<K, V> bimap = create(EnumBiMap.inferKeyType(map));
     bimap.putAll(map);
     return bimap;
@@ -85,13 +90,19 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V put(K key, @NullableDecl V value) {
+  @SuppressWarnings("RedundantOverride") // b/192446478: RedundantOverride ignores some annotations.
+  // TODO(b/192446998): Remove this override after tools understand nullness better.
+  @CheckForNull
+  public V put(K key, @ParametricNullness V value) {
     return super.put(key, value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public V forcePut(K key, @NullableDecl V value) {
+  @SuppressWarnings("RedundantOverride") // b/192446478: RedundantOverride ignores some annotations.
+  // TODO(b/192446998): Remove this override after tools understand nullness better.
+  @CheckForNull
+  public V forcePut(K key, @ParametricNullness V value) {
     return super.forcePut(key, value);
   }
 
diff --git a/android/guava/src/com/google/common/collect/EnumMultiset.java b/android/guava/src/com/google/common/collect/EnumMultiset.java
index af0deef..0fed4ad 100644
--- a/android/guava/src/com/google/common/collect/EnumMultiset.java
+++ b/android/guava/src/com/google/common/collect/EnumMultiset.java
@@ -30,7 +30,7 @@
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Multiset implementation specialized for enum elements, supporting all single-element operations
@@ -44,6 +44,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class EnumMultiset<E extends Enum<E>> extends AbstractMultiset<E>
     implements Serializable {
   /** Creates an empty {@code EnumMultiset}. */
@@ -93,7 +94,7 @@
     this.counts = new int[enumConstants.length];
   }
 
-  private boolean isActuallyE(@NullableDecl Object o) {
+  private boolean isActuallyE(@CheckForNull Object o) {
     if (o instanceof Enum) {
       Enum<?> e = (Enum<?>) o;
       int index = e.ordinal();
@@ -106,7 +107,7 @@
    * Returns {@code element} cast to {@code E}, if it actually is a nonnull E. Otherwise, throws
    * either a NullPointerException or a ClassCastException as appropriate.
    */
-  void checkIsE(@NullableDecl Object element) {
+  private void checkIsE(Object element) {
     checkNotNull(element);
     if (!isActuallyE(element)) {
       throw new ClassCastException("Expected an " + type + " but got " + element);
@@ -124,8 +125,9 @@
   }
 
   @Override
-  public int count(@NullableDecl Object element) {
-    if (!isActuallyE(element)) {
+  public int count(@CheckForNull Object element) {
+    // isActuallyE checks for null, but we check explicitly to help nullness checkers.
+    if (element == null || !isActuallyE(element)) {
       return 0;
     }
     Enum<?> e = (Enum<?>) element;
@@ -156,8 +158,9 @@
   // Modification Operations
   @CanIgnoreReturnValue
   @Override
-  public int remove(@NullableDecl Object element, int occurrences) {
-    if (!isActuallyE(element)) {
+  public int remove(@CheckForNull Object element, int occurrences) {
+    // isActuallyE checks for null, but we check explicitly to help nullness checkers.
+    if (element == null || !isActuallyE(element)) {
       return 0;
     }
     Enum<?> e = (Enum<?>) element;
diff --git a/android/guava/src/com/google/common/collect/EvictingQueue.java b/android/guava/src/com/google/common/collect/EvictingQueue.java
index 37a65f3..45f59f3 100644
--- a/android/guava/src/com/google/common/collect/EvictingQueue.java
+++ b/android/guava/src/com/google/common/collect/EvictingQueue.java
@@ -45,6 +45,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class EvictingQueue<E> extends ForwardingQueue<E> implements Serializable {
 
   private final Queue<E> delegate;
@@ -126,17 +127,19 @@
   }
 
   @Override
-  public boolean contains(Object object) {
-    return delegate().contains(checkNotNull(object));
+  public Object[] toArray() {
+    /*
+     * If we could, we'd declare the no-arg `Collection.toArray()` to return "Object[] but elements
+     * have the same nullness as E." Since we can't, we declare it to return nullable elements, and
+     * we can override it in our non-null-guaranteeing subtypes to present a better signature to
+     * their users.
+     *
+     * However, the checker *we* use has this special knowledge about `Collection.toArray()` anyway,
+     * so in our implementation code, we can rely on that. That's why the expression below
+     * type-checks.
+     */
+    return super.toArray();
   }
 
-  @Override
-  @CanIgnoreReturnValue
-  public boolean remove(Object object) {
-    return delegate().remove(checkNotNull(object));
-  }
-
-  // TODO(kak): Do we want to checkNotNull each element in containsAll, removeAll, and retainAll?
-
   private static final long serialVersionUID = 0L;
 }
diff --git a/android/guava/src/com/google/common/collect/ExplicitOrdering.java b/android/guava/src/com/google/common/collect/ExplicitOrdering.java
index 710c1ae..383318a 100644
--- a/android/guava/src/com/google/common/collect/ExplicitOrdering.java
+++ b/android/guava/src/com/google/common/collect/ExplicitOrdering.java
@@ -19,10 +19,11 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.List;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /** An ordering that compares objects according to a given order. */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 final class ExplicitOrdering<T> extends Ordering<T> implements Serializable {
   final ImmutableMap<T, Integer> rankMap;
 
@@ -48,7 +49,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof ExplicitOrdering) {
       ExplicitOrdering<?> that = (ExplicitOrdering<?>) object;
       return this.rankMap.equals(that.rankMap);
diff --git a/android/guava/src/com/google/common/collect/FilteredEntryMultimap.java b/android/guava/src/com/google/common/collect/FilteredEntryMultimap.java
index 5860d88..3ff00b7 100644
--- a/android/guava/src/com/google/common/collect/FilteredEntryMultimap.java
+++ b/android/guava/src/com/google/common/collect/FilteredEntryMultimap.java
@@ -33,7 +33,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link Multimaps#filterEntries(Multimap, Predicate)}.
@@ -42,7 +43,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-class FilteredEntryMultimap<K, V> extends AbstractMultimap<K, V> implements FilteredMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+class FilteredEntryMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMultimap<K, V> implements FilteredMultimap<K, V> {
   final Multimap<K, V> unfiltered;
   final Predicate<? super Entry<K, V>> predicate;
 
@@ -66,24 +69,24 @@
     return entries().size();
   }
 
-  private boolean satisfies(K key, V value) {
+  private boolean satisfies(@ParametricNullness K key, @ParametricNullness V value) {
     return predicate.apply(Maps.immutableEntry(key, value));
   }
 
   final class ValuePredicate implements Predicate<V> {
-    private final K key;
+    @ParametricNullness private final K key;
 
-    ValuePredicate(K key) {
+    ValuePredicate(@ParametricNullness K key) {
       this.key = key;
     }
 
     @Override
-    public boolean apply(@NullableDecl V value) {
+    public boolean apply(@ParametricNullness V value) {
       return satisfies(key, value);
     }
   }
 
-  static <E> Collection<E> filterCollection(
+  static <E extends @Nullable Object> Collection<E> filterCollection(
       Collection<E> collection, Predicate<? super E> predicate) {
     if (collection instanceof Set) {
       return Sets.filter((Set<E>) collection, predicate);
@@ -93,12 +96,12 @@
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return asMap().get(key) != null;
   }
 
   @Override
-  public Collection<V> removeAll(@NullableDecl Object key) {
+  public Collection<V> removeAll(@CheckForNull Object key) {
     return MoreObjects.firstNonNull(asMap().remove(key), unmodifiableEmptyCollection());
   }
 
@@ -115,7 +118,7 @@
   }
 
   @Override
-  public Collection<V> get(final K key) {
+  public Collection<V> get(@ParametricNullness final K key) {
     return filterCollection(unfiltered.get(key), new ValuePredicate(key));
   }
 
@@ -166,7 +169,7 @@
   @WeakOuter
   class AsMap extends ViewCachingAbstractMap<K, Collection<V>> {
     @Override
-    public boolean containsKey(@NullableDecl Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return get(key) != null;
     }
 
@@ -176,7 +179,8 @@
     }
 
     @Override
-    public Collection<V> get(@NullableDecl Object key) {
+    @CheckForNull
+    public Collection<V> get(@CheckForNull Object key) {
       Collection<V> result = unfiltered.asMap().get(key);
       if (result == null) {
         return null;
@@ -188,7 +192,8 @@
     }
 
     @Override
-    public Collection<V> remove(@NullableDecl Object key) {
+    @CheckForNull
+    public Collection<V> remove(@CheckForNull Object key) {
       Collection<V> collection = unfiltered.asMap().get(key);
       if (collection == null) {
         return null;
@@ -232,7 +237,7 @@
         }
 
         @Override
-        public boolean remove(@NullableDecl Object o) {
+        public boolean remove(@CheckForNull Object o) {
           return AsMap.this.remove(o) != null;
         }
       }
@@ -255,6 +260,7 @@
                 unfiltered.asMap().entrySet().iterator();
 
             @Override
+            @CheckForNull
             protected Entry<K, Collection<V>> computeNext() {
               while (backingIterator.hasNext()) {
                 Entry<K, Collection<V>> entry = backingIterator.next();
@@ -297,7 +303,7 @@
         }
 
         @Override
-        public boolean remove(@NullableDecl Object o) {
+        public boolean remove(@CheckForNull Object o) {
           if (o instanceof Collection) {
             Collection<?> c = (Collection<?>) o;
             Iterator<Entry<K, Collection<V>>> entryIterator =
@@ -346,7 +352,7 @@
     }
 
     @Override
-    public int remove(@NullableDecl Object key, int occurrences) {
+    public int remove(@CheckForNull Object key, int occurrences) {
       checkNonnegative(occurrences, "occurrences");
       if (occurrences == 0) {
         return count(key);
diff --git a/android/guava/src/com/google/common/collect/FilteredEntrySetMultimap.java b/android/guava/src/com/google/common/collect/FilteredEntrySetMultimap.java
index 94740a4..20413f8 100644
--- a/android/guava/src/com/google/common/collect/FilteredEntrySetMultimap.java
+++ b/android/guava/src/com/google/common/collect/FilteredEntrySetMultimap.java
@@ -20,6 +20,8 @@
 import com.google.common.base.Predicate;
 import java.util.Map.Entry;
 import java.util.Set;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link Multimaps#filterEntries(SetMultimap, Predicate)}.
@@ -27,8 +29,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-final class FilteredEntrySetMultimap<K, V> extends FilteredEntryMultimap<K, V>
-    implements FilteredSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+final class FilteredEntrySetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends FilteredEntryMultimap<K, V> implements FilteredSetMultimap<K, V> {
 
   FilteredEntrySetMultimap(SetMultimap<K, V> unfiltered, Predicate<? super Entry<K, V>> predicate) {
     super(unfiltered, predicate);
@@ -40,17 +43,17 @@
   }
 
   @Override
-  public Set<V> get(K key) {
+  public Set<V> get(@ParametricNullness K key) {
     return (Set<V>) super.get(key);
   }
 
   @Override
-  public Set<V> removeAll(Object key) {
+  public Set<V> removeAll(@CheckForNull Object key) {
     return (Set<V>) super.removeAll(key);
   }
 
   @Override
-  public Set<V> replaceValues(K key, Iterable<? extends V> values) {
+  public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (Set<V>) super.replaceValues(key, values);
   }
 
diff --git a/android/guava/src/com/google/common/collect/FilteredKeyListMultimap.java b/android/guava/src/com/google/common/collect/FilteredKeyListMultimap.java
index 2a55225..c82c8da 100644
--- a/android/guava/src/com/google/common/collect/FilteredKeyListMultimap.java
+++ b/android/guava/src/com/google/common/collect/FilteredKeyListMultimap.java
@@ -19,7 +19,8 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Predicate;
 import java.util.List;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link Multimaps#filterKeys(ListMultimap, Predicate)}.
@@ -27,8 +28,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-final class FilteredKeyListMultimap<K, V> extends FilteredKeyMultimap<K, V>
-    implements ListMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+final class FilteredKeyListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends FilteredKeyMultimap<K, V> implements ListMultimap<K, V> {
   FilteredKeyListMultimap(ListMultimap<K, V> unfiltered, Predicate<? super K> keyPredicate) {
     super(unfiltered, keyPredicate);
   }
@@ -39,17 +41,17 @@
   }
 
   @Override
-  public List<V> get(K key) {
+  public List<V> get(@ParametricNullness K key) {
     return (List<V>) super.get(key);
   }
 
   @Override
-  public List<V> removeAll(@NullableDecl Object key) {
+  public List<V> removeAll(@CheckForNull Object key) {
     return (List<V>) super.removeAll(key);
   }
 
   @Override
-  public List<V> replaceValues(K key, Iterable<? extends V> values) {
+  public List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (List<V>) super.replaceValues(key, values);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/FilteredKeyMultimap.java b/android/guava/src/com/google/common/collect/FilteredKeyMultimap.java
index 2a3003d..68fad75 100644
--- a/android/guava/src/com/google/common/collect/FilteredKeyMultimap.java
+++ b/android/guava/src/com/google/common/collect/FilteredKeyMultimap.java
@@ -16,6 +16,8 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndex;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptySet;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Predicate;
@@ -28,7 +30,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link Multimaps#filterKeys(Multimap, Predicate)}.
@@ -36,7 +39,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-class FilteredKeyMultimap<K, V> extends AbstractMultimap<K, V> implements FilteredMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+class FilteredKeyMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMultimap<K, V> implements FilteredMultimap<K, V> {
   final Multimap<K, V> unfiltered;
   final Predicate<? super K> keyPredicate;
 
@@ -65,7 +70,7 @@
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     if (unfiltered.containsKey(key)) {
       @SuppressWarnings("unchecked") // k is equal to a K, if not one itself
       K k = (K) key;
@@ -75,15 +80,15 @@
   }
 
   @Override
-  public Collection<V> removeAll(Object key) {
+  public Collection<V> removeAll(@CheckForNull Object key) {
     return containsKey(key) ? unfiltered.removeAll(key) : unmodifiableEmptyCollection();
   }
 
   Collection<V> unmodifiableEmptyCollection() {
     if (unfiltered instanceof SetMultimap) {
-      return ImmutableSet.of();
+      return emptySet();
     } else {
-      return ImmutableList.of();
+      return emptyList();
     }
   }
 
@@ -98,7 +103,7 @@
   }
 
   @Override
-  public Collection<V> get(K key) {
+  public Collection<V> get(@ParametricNullness K key) {
     if (keyPredicate.apply(key)) {
       return unfiltered.get(key);
     } else if (unfiltered instanceof SetMultimap) {
@@ -108,15 +113,16 @@
     }
   }
 
-  static class AddRejectingSet<K, V> extends ForwardingSet<V> {
-    final K key;
+  static class AddRejectingSet<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingSet<V> {
+    @ParametricNullness final K key;
 
-    AddRejectingSet(K key) {
+    AddRejectingSet(@ParametricNullness K key) {
       this.key = key;
     }
 
     @Override
-    public boolean add(V element) {
+    public boolean add(@ParametricNullness V element) {
       throw new IllegalArgumentException("Key does not satisfy predicate: " + key);
     }
 
@@ -132,21 +138,22 @@
     }
   }
 
-  static class AddRejectingList<K, V> extends ForwardingList<V> {
-    final K key;
+  static class AddRejectingList<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingList<V> {
+    @ParametricNullness final K key;
 
-    AddRejectingList(K key) {
+    AddRejectingList(@ParametricNullness K key) {
       this.key = key;
     }
 
     @Override
-    public boolean add(V v) {
+    public boolean add(@ParametricNullness V v) {
       add(0, v);
       return true;
     }
 
     @Override
-    public void add(int index, V element) {
+    public void add(int index, @ParametricNullness V element) {
       checkPositionIndex(index, 0);
       throw new IllegalArgumentException("Key does not satisfy predicate: " + key);
     }
@@ -190,7 +197,7 @@
 
     @Override
     @SuppressWarnings("unchecked")
-    public boolean remove(@NullableDecl Object o) {
+    public boolean remove(@CheckForNull Object o) {
       if (o instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) o;
         if (unfiltered.containsKey(entry.getKey())
diff --git a/android/guava/src/com/google/common/collect/FilteredKeySetMultimap.java b/android/guava/src/com/google/common/collect/FilteredKeySetMultimap.java
index 1ec8e65..e492a5c 100644
--- a/android/guava/src/com/google/common/collect/FilteredKeySetMultimap.java
+++ b/android/guava/src/com/google/common/collect/FilteredKeySetMultimap.java
@@ -20,7 +20,8 @@
 import com.google.common.base.Predicate;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link Multimaps#filterKeys(SetMultimap, Predicate)}.
@@ -28,8 +29,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-final class FilteredKeySetMultimap<K, V> extends FilteredKeyMultimap<K, V>
-    implements FilteredSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+final class FilteredKeySetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends FilteredKeyMultimap<K, V> implements FilteredSetMultimap<K, V> {
 
   FilteredKeySetMultimap(SetMultimap<K, V> unfiltered, Predicate<? super K> keyPredicate) {
     super(unfiltered, keyPredicate);
@@ -41,17 +43,17 @@
   }
 
   @Override
-  public Set<V> get(K key) {
+  public Set<V> get(@ParametricNullness K key) {
     return (Set<V>) super.get(key);
   }
 
   @Override
-  public Set<V> removeAll(Object key) {
+  public Set<V> removeAll(@CheckForNull Object key) {
     return (Set<V>) super.removeAll(key);
   }
 
   @Override
-  public Set<V> replaceValues(K key, Iterable<? extends V> values) {
+  public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (Set<V>) super.replaceValues(key, values);
   }
 
@@ -72,7 +74,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       return Sets.equalsImpl(this, o);
     }
   }
diff --git a/android/guava/src/com/google/common/collect/FilteredMultimap.java b/android/guava/src/com/google/common/collect/FilteredMultimap.java
index ef5ed4a..4e1fa06 100644
--- a/android/guava/src/com/google/common/collect/FilteredMultimap.java
+++ b/android/guava/src/com/google/common/collect/FilteredMultimap.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Predicate;
 import java.util.Map.Entry;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An interface for all filtered multimap types.
@@ -26,7 +27,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-interface FilteredMultimap<K, V> extends Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+interface FilteredMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends Multimap<K, V> {
   Multimap<K, V> unfiltered();
 
   Predicate<? super Entry<K, V>> entryPredicate();
diff --git a/android/guava/src/com/google/common/collect/FilteredMultimapValues.java b/android/guava/src/com/google/common/collect/FilteredMultimapValues.java
index b92707a..ecbfab2 100644
--- a/android/guava/src/com/google/common/collect/FilteredMultimapValues.java
+++ b/android/guava/src/com/google/common/collect/FilteredMultimapValues.java
@@ -25,7 +25,8 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation for {@link FilteredMultimap#values()}.
@@ -33,7 +34,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-final class FilteredMultimapValues<K, V> extends AbstractCollection<V> {
+@ElementTypesAreNonnullByDefault
+final class FilteredMultimapValues<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractCollection<V> {
   @Weak private final FilteredMultimap<K, V> multimap;
 
   FilteredMultimapValues(FilteredMultimap<K, V> multimap) {
@@ -46,7 +49,7 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object o) {
+  public boolean contains(@CheckForNull Object o) {
     return multimap.containsValue(o);
   }
 
@@ -56,7 +59,7 @@
   }
 
   @Override
-  public boolean remove(@NullableDecl Object o) {
+  public boolean remove(@CheckForNull Object o) {
     Predicate<? super Entry<K, V>> entryPredicate = multimap.entryPredicate();
     for (Iterator<Entry<K, V>> unfilteredItr = multimap.unfiltered().entries().iterator();
         unfilteredItr.hasNext(); ) {
diff --git a/android/guava/src/com/google/common/collect/FilteredSetMultimap.java b/android/guava/src/com/google/common/collect/FilteredSetMultimap.java
index a0a149f..8e2ff7c 100644
--- a/android/guava/src/com/google/common/collect/FilteredSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/FilteredSetMultimap.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A supertype for filtered {@link SetMultimap} implementations.
@@ -24,7 +25,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-interface FilteredSetMultimap<K, V> extends FilteredMultimap<K, V>, SetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+interface FilteredSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends FilteredMultimap<K, V>, SetMultimap<K, V> {
   @Override
   SetMultimap<K, V> unfiltered();
 }
diff --git a/android/guava/src/com/google/common/collect/FluentIterable.java b/android/guava/src/com/google/common/collect/FluentIterable.java
index 66ae098..72401d7 100644
--- a/android/guava/src/com/google/common/collect/FluentIterable.java
+++ b/android/guava/src/com/google/common/collect/FluentIterable.java
@@ -24,13 +24,16 @@
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.InlineMe;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An expanded {@code Iterable} API, providing functionality similar to Java 8's powerful <a href=
@@ -109,11 +112,12 @@
  * @since 12.0
  */
 @GwtCompatible(emulated = true)
-public abstract class FluentIterable<E> implements Iterable<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class FluentIterable<E extends @Nullable Object> implements Iterable<E> {
   // We store 'iterable' and use it instead of 'this' to allow Iterables to perform instanceof
   // checks on the _original_ iterable when FluentIterable.from is used.
   // To avoid a self retain cycle under j2objc, we store Optional.absent() instead of
-  // Optional.of(this). To access the iterator delegate, call #getDelegate(), which converts to
+  // Optional.of(this). To access the delegate iterable, call #getDelegate(), which converts to
   // absent() back to 'this'.
   private final Optional<Iterable<E>> iterableDelegate;
 
@@ -123,8 +127,7 @@
   }
 
   FluentIterable(Iterable<E> iterable) {
-    checkNotNull(iterable);
-    this.iterableDelegate = Optional.fromNullable(this != iterable ? iterable : null);
+    this.iterableDelegate = Optional.of(iterable);
   }
 
   private Iterable<E> getDelegate() {
@@ -138,7 +141,7 @@
    * <p><b>{@code Stream} equivalent:</b> {@code iterable.stream()} if {@code iterable} is a {@link
    * Collection}; {@code StreamSupport.stream(iterable.spliterator(), false)} otherwise.
    */
-  public static <E> FluentIterable<E> from(final Iterable<E> iterable) {
+  public static <E extends @Nullable Object> FluentIterable<E> from(final Iterable<E> iterable) {
     return (iterable instanceof FluentIterable)
         ? (FluentIterable<E>) iterable
         : new FluentIterable<E>(iterable) {
@@ -160,7 +163,7 @@
    * @since 20.0 (since 18.0 as an overload of {@code of})
    */
   @Beta
-  public static <E> FluentIterable<E> from(E[] elements) {
+  public static <E extends @Nullable Object> FluentIterable<E> from(E[] elements) {
     return from(Arrays.asList(elements));
   }
 
@@ -173,7 +176,10 @@
    *     FluentIterable}
    */
   @Deprecated
-  public static <E> FluentIterable<E> from(FluentIterable<E> iterable) {
+  @InlineMe(
+      replacement = "checkNotNull(iterable)",
+      staticImports = {"com.google.common.base.Preconditions.checkNotNull"})
+  public static <E extends @Nullable Object> FluentIterable<E> from(FluentIterable<E> iterable) {
     return checkNotNull(iterable);
   }
 
@@ -190,7 +196,8 @@
    * @since 20.0
    */
   @Beta
-  public static <T> FluentIterable<T> concat(Iterable<? extends T> a, Iterable<? extends T> b) {
+  public static <T extends @Nullable Object> FluentIterable<T> concat(
+      Iterable<? extends T> a, Iterable<? extends T> b) {
     return concatNoDefensiveCopy(a, b);
   }
 
@@ -208,7 +215,7 @@
    * @since 20.0
    */
   @Beta
-  public static <T> FluentIterable<T> concat(
+  public static <T extends @Nullable Object> FluentIterable<T> concat(
       Iterable<? extends T> a, Iterable<? extends T> b, Iterable<? extends T> c) {
     return concatNoDefensiveCopy(a, b, c);
   }
@@ -228,7 +235,7 @@
    * @since 20.0
    */
   @Beta
-  public static <T> FluentIterable<T> concat(
+  public static <T extends @Nullable Object> FluentIterable<T> concat(
       Iterable<? extends T> a,
       Iterable<? extends T> b,
       Iterable<? extends T> c,
@@ -252,7 +259,8 @@
    * @since 20.0
    */
   @Beta
-  public static <T> FluentIterable<T> concat(Iterable<? extends T>... inputs) {
+  public static <T extends @Nullable Object> FluentIterable<T> concat(
+      Iterable<? extends T>... inputs) {
     return concatNoDefensiveCopy(Arrays.copyOf(inputs, inputs.length));
   }
 
@@ -271,7 +279,7 @@
    * @since 20.0
    */
   @Beta
-  public static <T> FluentIterable<T> concat(
+  public static <T extends @Nullable Object> FluentIterable<T> concat(
       final Iterable<? extends Iterable<? extends T>> inputs) {
     checkNotNull(inputs);
     return new FluentIterable<T>() {
@@ -283,7 +291,7 @@
   }
 
   /** Concatenates a varargs array of iterables without making a defensive copy of the array. */
-  private static <T> FluentIterable<T> concatNoDefensiveCopy(
+  private static <T extends @Nullable Object> FluentIterable<T> concatNoDefensiveCopy(
       final Iterable<? extends T>... inputs) {
     for (Iterable<? extends T> input : inputs) {
       checkNotNull(input);
@@ -311,8 +319,8 @@
    * @since 20.0
    */
   @Beta
-  public static <E> FluentIterable<E> of() {
-    return FluentIterable.from(ImmutableList.<E>of());
+  public static <E extends @Nullable Object> FluentIterable<E> of() {
+    return FluentIterable.from(Collections.<E>emptyList());
   }
 
   /**
@@ -324,7 +332,8 @@
    * @since 20.0
    */
   @Beta
-  public static <E> FluentIterable<E> of(@NullableDecl E element, E... elements) {
+  public static <E extends @Nullable Object> FluentIterable<E> of(
+      @ParametricNullness E element, E... elements) {
     return from(Lists.asList(element, elements));
   }
 
@@ -355,7 +364,7 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@code stream.anyMatch(Predicate.isEqual(target))}.
    */
-  public final boolean contains(@NullableDecl Object target) {
+  public final boolean contains(@CheckForNull Object target) {
     return Iterables.contains(getDelegate(), target);
   }
 
@@ -465,6 +474,7 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@code stream.filter(predicate).findFirst()}.
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final Optional<E> firstMatch(Predicate<? super E> predicate) {
     return Iterables.tryFind(getDelegate(), predicate);
   }
@@ -479,7 +489,8 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link Stream#map}.
    */
-  public final <T> FluentIterable<T> transform(Function<? super E, T> function) {
+  public final <T extends @Nullable Object> FluentIterable<T> transform(
+      Function<? super E, T> function) {
     return from(Iterables.transform(getDelegate(), function));
   }
 
@@ -496,7 +507,7 @@
    *
    * @since 13.0 (required {@code Function<E, Iterable<T>>} until 14.0)
    */
-  public <T> FluentIterable<T> transformAndConcat(
+  public <T extends @Nullable Object> FluentIterable<T> transformAndConcat(
       Function<? super E, ? extends Iterable<? extends T>> function) {
     return FluentIterable.concat(transform(function));
   }
@@ -511,6 +522,7 @@
    * @throws NullPointerException if the first element is null; if this is a possibility, use {@code
    *     iterator().next()} or {@link Iterables#getFirst} instead.
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final Optional<E> first() {
     Iterator<E> iterator = getDelegate().iterator();
     return iterator.hasNext() ? Optional.of(iterator.next()) : Optional.<E>absent();
@@ -527,6 +539,7 @@
    * @throws NullPointerException if the last element is null; if this is a possibility, use {@link
    *     Iterables#getLast} instead.
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final Optional<E> last() {
     // Iterables#getLast was inlined here so we don't have to throw/catch a NSEE
 
@@ -616,6 +629,7 @@
    * @throws NullPointerException if any element is {@code null}
    * @since 14.0 (since 12.0 as {@code toImmutableList()}).
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final ImmutableList<E> toList() {
     return ImmutableList.copyOf(getDelegate());
   }
@@ -633,6 +647,7 @@
    * @throws NullPointerException if any element of this iterable is {@code null}
    * @since 14.0 (since 13.0 as {@code toSortedImmutableList()}).
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final ImmutableList<E> toSortedList(Comparator<? super E> comparator) {
     return Ordering.from(comparator).immutableSortedCopy(getDelegate());
   }
@@ -647,6 +662,7 @@
    * @throws NullPointerException if any element is {@code null}
    * @since 14.0 (since 12.0 as {@code toImmutableSet()}).
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final ImmutableSet<E> toSet() {
     return ImmutableSet.copyOf(getDelegate());
   }
@@ -665,6 +681,7 @@
    * @throws NullPointerException if any element of this iterable is {@code null}
    * @since 14.0 (since 12.0 as {@code toImmutableSortedSet()}).
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final ImmutableSortedSet<E> toSortedSet(Comparator<? super E> comparator) {
     return ImmutableSortedSet.copyOf(comparator, getDelegate());
   }
@@ -678,6 +695,7 @@
    * @throws NullPointerException if any element is null
    * @since 19.0
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final ImmutableMultiset<E> toMultiset() {
     return ImmutableMultiset.copyOf(getDelegate());
   }
@@ -699,6 +717,7 @@
    *     valueFunction} produces {@code null} for any key
    * @since 14.0
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final <V> ImmutableMap<E, V> toMap(Function<? super E, V> valueFunction) {
     return Maps.toMap(getDelegate(), valueFunction);
   }
@@ -721,6 +740,7 @@
    *     keyFunction} produces {@code null} for any key
    * @since 14.0
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final <K> ImmutableListMultimap<K, E> index(Function<? super E, K> keyFunction) {
     return Multimaps.index(getDelegate(), keyFunction);
   }
@@ -757,6 +777,7 @@
    *     keyFunction} produces {@code null} for any key
    * @since 14.0
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final <K> ImmutableMap<K, E> uniqueIndex(Function<? super E, K> keyFunction) {
     return Maps.uniqueIndex(getDelegate(), keyFunction);
   }
@@ -774,7 +795,15 @@
    *     copied
    */
   @GwtIncompatible // Array.newArray(Class, int)
-  public final E[] toArray(Class<E> type) {
+  /*
+   * Both the declaration of our Class<E> parameter and its usage in a call to Iterables.toArray
+   * produce a nullness error: E may be a nullable type, and our nullness checker has Class's type
+   * parameter bounded to non-null types. To avoid that, we'd use Class<@Nonnull E> if we could.
+   * (Granted, this is only one of many nullness-checking problems that arise from letting
+   * FluentIterable support null elements, and most of the other produce outright unsoundness.)
+   */
+  @SuppressWarnings("nullness")
+  public final @Nullable E[] toArray(Class<E> type) {
     return Iterables.toArray(getDelegate(), type);
   }
 
@@ -830,13 +859,14 @@
    * @throws IndexOutOfBoundsException if {@code position} is negative or greater than or equal to
    *     the size of this fluent iterable
    */
-  // TODO(kevinb): add @NullableDecl?
+  @ParametricNullness
   public final E get(int position) {
     return Iterables.get(getDelegate(), position);
   }
 
   /** Function that transforms {@code Iterable<E>} into a fluent iterable. */
-  private static class FromIterableFunction<E> implements Function<Iterable<E>, FluentIterable<E>> {
+  private static class FromIterableFunction<E extends @Nullable Object>
+      implements Function<Iterable<E>, FluentIterable<E>> {
     @Override
     public FluentIterable<E> apply(Iterable<E> fromObject) {
       return FluentIterable.from(fromObject);
diff --git a/android/guava/src/com/google/common/collect/ForwardingBlockingDeque.java b/android/guava/src/com/google/common/collect/ForwardingBlockingDeque.java
index 7d3895d..49d4bcf 100644
--- a/android/guava/src/com/google/common/collect/ForwardingBlockingDeque.java
+++ b/android/guava/src/com/google/common/collect/ForwardingBlockingDeque.java
@@ -20,6 +20,7 @@
 import java.util.Collection;
 import java.util.concurrent.BlockingDeque;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link BlockingDeque} which forwards all its method calls to another {@code BlockingDeque}.
@@ -46,6 +47,7 @@
  */
 @Deprecated
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingBlockingDeque<E> extends ForwardingDeque<E>
     implements BlockingDeque<E> {
 
@@ -91,11 +93,13 @@
   }
 
   @Override
+  @CheckForNull
   public E pollFirst(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().pollFirst(timeout, unit);
   }
 
   @Override
+  @CheckForNull
   public E pollLast(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().pollLast(timeout, unit);
   }
@@ -116,6 +120,7 @@
   }
 
   @Override
+  @CheckForNull
   public E poll(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().poll(timeout, unit);
   }
diff --git a/android/guava/src/com/google/common/collect/ForwardingCollection.java b/android/guava/src/com/google/common/collect/ForwardingCollection.java
index 416ff96..ca1edc1 100644
--- a/android/guava/src/com/google/common/collect/ForwardingCollection.java
+++ b/android/guava/src/com/google/common/collect/ForwardingCollection.java
@@ -21,7 +21,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Collection;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A collection which forwards all its method calls to another collection. Subclasses should
@@ -46,7 +47,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingCollection<E> extends ForwardingObject implements Collection<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingCollection<E extends @Nullable Object> extends ForwardingObject
+    implements Collection<E> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -77,19 +80,19 @@
   }
 
   @Override
-  public boolean contains(Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return delegate().contains(object);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean add(E element) {
+  public boolean add(@ParametricNullness E element) {
     return delegate().add(element);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean remove(Object object) {
+  public boolean remove(@CheckForNull Object object) {
     return delegate().remove(object);
   }
 
@@ -116,13 +119,14 @@
   }
 
   @Override
-  public Object[] toArray() {
+  public @Nullable Object[] toArray() {
     return delegate().toArray();
   }
 
   @CanIgnoreReturnValue
   @Override
-  public <T> T[] toArray(T[] array) {
+  @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+  public <T extends @Nullable Object> T[] toArray(T[] array) {
     return delegate().toArray(array);
   }
 
@@ -133,7 +137,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardContains(@NullableDecl Object object) {
+  protected boolean standardContains(@CheckForNull Object object) {
     return Iterators.contains(iterator(), object);
   }
 
@@ -165,7 +169,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardRemove(@NullableDecl Object object) {
+  protected boolean standardRemove(@CheckForNull Object object) {
     Iterator<E> iterator = iterator();
     while (iterator.hasNext()) {
       if (Objects.equal(iterator.next(), object)) {
@@ -238,8 +242,8 @@
    *
    * @since 7.0
    */
-  protected Object[] standardToArray() {
-    Object[] newArray = new Object[size()];
+  protected @Nullable Object[] standardToArray() {
+    @Nullable Object[] newArray = new @Nullable Object[size()];
     return toArray(newArray);
   }
 
@@ -250,7 +254,7 @@
    *
    * @since 7.0
    */
-  protected <T> T[] standardToArray(T[] array) {
+  protected <T extends @Nullable Object> T[] standardToArray(T[] array) {
     return ObjectArrays.toArrayImpl(this, array);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingConcurrentMap.java b/android/guava/src/com/google/common/collect/ForwardingConcurrentMap.java
index 0910424..b662b07 100644
--- a/android/guava/src/com/google/common/collect/ForwardingConcurrentMap.java
+++ b/android/guava/src/com/google/common/collect/ForwardingConcurrentMap.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.concurrent.ConcurrentMap;
+import javax.annotation.CheckForNull;
 
 /**
  * A concurrent map which forwards all its method calls to another concurrent map. Subclasses should
@@ -36,6 +37,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingConcurrentMap<K, V> extends ForwardingMap<K, V>
     implements ConcurrentMap<K, V> {
 
@@ -47,18 +49,20 @@
 
   @CanIgnoreReturnValue
   @Override
+  @CheckForNull
   public V putIfAbsent(K key, V value) {
     return delegate().putIfAbsent(key, value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean remove(Object key, Object value) {
+  public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
     return delegate().remove(key, value);
   }
 
   @CanIgnoreReturnValue
   @Override
+  @CheckForNull
   public V replace(K key, V value) {
     return delegate().replace(key, value);
   }
diff --git a/android/guava/src/com/google/common/collect/ForwardingDeque.java b/android/guava/src/com/google/common/collect/ForwardingDeque.java
index 87ac71b..571535c 100644
--- a/android/guava/src/com/google/common/collect/ForwardingDeque.java
+++ b/android/guava/src/com/google/common/collect/ForwardingDeque.java
@@ -20,6 +20,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Deque;
 import java.util.Iterator;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A deque which forwards all its method calls to another deque. Subclasses should override one or
@@ -39,7 +41,9 @@
  * @since 12.0
  */
 @GwtIncompatible
-public abstract class ForwardingDeque<E> extends ForwardingQueue<E> implements Deque<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingDeque<E extends @Nullable Object> extends ForwardingQueue<E>
+    implements Deque<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingDeque() {}
@@ -48,12 +52,12 @@
   protected abstract Deque<E> delegate();
 
   @Override
-  public void addFirst(E e) {
+  public void addFirst(@ParametricNullness E e) {
     delegate().addFirst(e);
   }
 
   @Override
-  public void addLast(E e) {
+  public void addLast(@ParametricNullness E e) {
     delegate().addLast(e);
   }
 
@@ -63,81 +67,90 @@
   }
 
   @Override
+  @ParametricNullness
   public E getFirst() {
     return delegate().getFirst();
   }
 
   @Override
+  @ParametricNullness
   public E getLast() {
     return delegate().getLast();
   }
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
-  public boolean offerFirst(E e) {
+  public boolean offerFirst(@ParametricNullness E e) {
     return delegate().offerFirst(e);
   }
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
-  public boolean offerLast(E e) {
+  public boolean offerLast(@ParametricNullness E e) {
     return delegate().offerLast(e);
   }
 
   @Override
+  @CheckForNull
   public E peekFirst() {
     return delegate().peekFirst();
   }
 
   @Override
+  @CheckForNull
   public E peekLast() {
     return delegate().peekLast();
   }
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
+  @CheckForNull
   public E pollFirst() {
     return delegate().pollFirst();
   }
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
+  @CheckForNull
   public E pollLast() {
     return delegate().pollLast();
   }
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E pop() {
     return delegate().pop();
   }
 
   @Override
-  public void push(E e) {
+  public void push(@ParametricNullness E e) {
     delegate().push(e);
   }
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E removeFirst() {
     return delegate().removeFirst();
   }
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E removeLast() {
     return delegate().removeLast();
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean removeFirstOccurrence(Object o) {
+  public boolean removeFirstOccurrence(@CheckForNull Object o) {
     return delegate().removeFirstOccurrence(o);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean removeLastOccurrence(Object o) {
+  public boolean removeLastOccurrence(@CheckForNull Object o) {
     return delegate().removeLastOccurrence(o);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingImmutableCollection.java b/android/guava/src/com/google/common/collect/ForwardingImmutableCollection.java
index c0b9c5e..043fe58 100644
--- a/android/guava/src/com/google/common/collect/ForwardingImmutableCollection.java
+++ b/android/guava/src/com/google/common/collect/ForwardingImmutableCollection.java
@@ -24,6 +24,7 @@
  * @author Hayward Chan
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 class ForwardingImmutableCollection {
   private ForwardingImmutableCollection() {}
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingImmutableList.java b/android/guava/src/com/google/common/collect/ForwardingImmutableList.java
index 2b9092e..bd5480d 100644
--- a/android/guava/src/com/google/common/collect/ForwardingImmutableList.java
+++ b/android/guava/src/com/google/common/collect/ForwardingImmutableList.java
@@ -24,6 +24,7 @@
  * @author Chris Povirk
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingImmutableList<E> {
   private ForwardingImmutableList() {}
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingImmutableMap.java b/android/guava/src/com/google/common/collect/ForwardingImmutableMap.java
index a367157..22cc9ff 100644
--- a/android/guava/src/com/google/common/collect/ForwardingImmutableMap.java
+++ b/android/guava/src/com/google/common/collect/ForwardingImmutableMap.java
@@ -24,6 +24,7 @@
  * @author Chris Povirk
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingImmutableMap<K, V> {
   private ForwardingImmutableMap() {}
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingImmutableSet.java b/android/guava/src/com/google/common/collect/ForwardingImmutableSet.java
index c7d7bf6..047d5fd 100644
--- a/android/guava/src/com/google/common/collect/ForwardingImmutableSet.java
+++ b/android/guava/src/com/google/common/collect/ForwardingImmutableSet.java
@@ -24,6 +24,7 @@
  * @author Chris Povirk
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingImmutableSet<E> {
   private ForwardingImmutableSet() {}
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingIterator.java b/android/guava/src/com/google/common/collect/ForwardingIterator.java
index 5ecd3d2..1f5a8f1 100644
--- a/android/guava/src/com/google/common/collect/ForwardingIterator.java
+++ b/android/guava/src/com/google/common/collect/ForwardingIterator.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Iterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An iterator which forwards all its method calls to another iterator. Subclasses should override
@@ -36,7 +37,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingIterator<T> extends ForwardingObject implements Iterator<T> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingIterator<T extends @Nullable Object> extends ForwardingObject
+    implements Iterator<T> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingIterator() {}
@@ -51,6 +54,7 @@
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public T next() {
     return delegate().next();
   }
diff --git a/android/guava/src/com/google/common/collect/ForwardingList.java b/android/guava/src/com/google/common/collect/ForwardingList.java
index bfd2083..4b4551e 100644
--- a/android/guava/src/com/google/common/collect/ForwardingList.java
+++ b/android/guava/src/com/google/common/collect/ForwardingList.java
@@ -23,7 +23,8 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A list which forwards all its method calls to another list. Subclasses should override one or
@@ -51,7 +52,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingList<E> extends ForwardingCollection<E> implements List<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingList<E extends @Nullable Object> extends ForwardingCollection<E>
+    implements List<E> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -61,7 +64,7 @@
   protected abstract List<E> delegate();
 
   @Override
-  public void add(int index, E element) {
+  public void add(int index, @ParametricNullness E element) {
     delegate().add(index, element);
   }
 
@@ -72,17 +75,18 @@
   }
 
   @Override
+  @ParametricNullness
   public E get(int index) {
     return delegate().get(index);
   }
 
   @Override
-  public int indexOf(Object element) {
+  public int indexOf(@CheckForNull Object element) {
     return delegate().indexOf(element);
   }
 
   @Override
-  public int lastIndexOf(Object element) {
+  public int lastIndexOf(@CheckForNull Object element) {
     return delegate().lastIndexOf(element);
   }
 
@@ -98,13 +102,15 @@
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E remove(int index) {
     return delegate().remove(index);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public E set(int index, E element) {
+  @ParametricNullness
+  public E set(int index, @ParametricNullness E element) {
     return delegate().set(index, element);
   }
 
@@ -114,7 +120,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this || delegate().equals(object);
   }
 
@@ -130,7 +136,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardAdd(E element) {
+  protected boolean standardAdd(@ParametricNullness E element) {
     add(size(), element);
     return true;
   }
@@ -153,7 +159,7 @@
    *
    * @since 7.0
    */
-  protected int standardIndexOf(@NullableDecl Object element) {
+  protected int standardIndexOf(@CheckForNull Object element) {
     return Lists.indexOfImpl(this, element);
   }
 
@@ -164,7 +170,7 @@
    *
    * @since 7.0
    */
-  protected int standardLastIndexOf(@NullableDecl Object element) {
+  protected int standardLastIndexOf(@CheckForNull Object element) {
     return Lists.lastIndexOfImpl(this, element);
   }
 
@@ -222,7 +228,7 @@
    * @since 7.0
    */
   @Beta
-  protected boolean standardEquals(@NullableDecl Object object) {
+  protected boolean standardEquals(@CheckForNull Object object) {
     return Lists.equalsImpl(this, object);
   }
 
diff --git a/android/guava/src/com/google/common/collect/ForwardingListIterator.java b/android/guava/src/com/google/common/collect/ForwardingListIterator.java
index bc2a5ad..a2ac32b 100644
--- a/android/guava/src/com/google/common/collect/ForwardingListIterator.java
+++ b/android/guava/src/com/google/common/collect/ForwardingListIterator.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.ListIterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A list iterator which forwards all its method calls to another list iterator. Subclasses should
@@ -36,8 +37,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingListIterator<E> extends ForwardingIterator<E>
-    implements ListIterator<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingListIterator<E extends @Nullable Object>
+    extends ForwardingIterator<E> implements ListIterator<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingListIterator() {}
@@ -46,7 +48,7 @@
   protected abstract ListIterator<E> delegate();
 
   @Override
-  public void add(E element) {
+  public void add(@ParametricNullness E element) {
     delegate().add(element);
   }
 
@@ -62,6 +64,7 @@
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E previous() {
     return delegate().previous();
   }
@@ -72,7 +75,7 @@
   }
 
   @Override
-  public void set(E element) {
+  public void set(@ParametricNullness E element) {
     delegate().set(element);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingListMultimap.java b/android/guava/src/com/google/common/collect/ForwardingListMultimap.java
index 8cf3d70..11779c0 100644
--- a/android/guava/src/com/google/common/collect/ForwardingListMultimap.java
+++ b/android/guava/src/com/google/common/collect/ForwardingListMultimap.java
@@ -19,7 +19,8 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.List;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A list multimap which forwards all its method calls to another list multimap. Subclasses should
@@ -34,8 +35,9 @@
  * @since 3.0
  */
 @GwtCompatible
-public abstract class ForwardingListMultimap<K, V> extends ForwardingMultimap<K, V>
-    implements ListMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingMultimap<K, V> implements ListMultimap<K, V> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingListMultimap() {}
@@ -44,19 +46,19 @@
   protected abstract ListMultimap<K, V> delegate();
 
   @Override
-  public List<V> get(@NullableDecl K key) {
+  public List<V> get(@ParametricNullness K key) {
     return delegate().get(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public List<V> removeAll(@NullableDecl Object key) {
+  public List<V> removeAll(@CheckForNull Object key) {
     return delegate().removeAll(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public List<V> replaceValues(K key, Iterable<? extends V> values) {
+  public List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return delegate().replaceValues(key, values);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingMap.java b/android/guava/src/com/google/common/collect/ForwardingMap.java
index 4032bf9..315a4fa 100644
--- a/android/guava/src/com/google/common/collect/ForwardingMap.java
+++ b/android/guava/src/com/google/common/collect/ForwardingMap.java
@@ -24,7 +24,8 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A map which forwards all its method calls to another map. Subclasses should override one or more
@@ -55,7 +56,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingMap<K, V> extends ForwardingObject implements Map<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingObject implements Map<K, V> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -76,7 +79,8 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(Object key) {
+  @CheckForNull
+  public V remove(@CheckForNull Object key) {
     return delegate().remove(key);
   }
 
@@ -86,23 +90,25 @@
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return delegate().containsKey(key);
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return delegate().containsValue(value);
   }
 
   @Override
-  public V get(@NullableDecl Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     return delegate().get(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public V put(K key, V value) {
+  @CheckForNull
+  public V put(@ParametricNullness K key, @ParametricNullness V value) {
     return delegate().put(key, value);
   }
 
@@ -127,7 +133,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this || delegate().equals(object);
   }
 
@@ -158,7 +164,8 @@
    * @since 7.0
    */
   @Beta
-  protected V standardRemove(@NullableDecl Object key) {
+  @CheckForNull
+  protected V standardRemove(@CheckForNull Object key) {
     Iterator<Entry<K, V>> entryIterator = entrySet().iterator();
     while (entryIterator.hasNext()) {
       Entry<K, V> entry = entryIterator.next();
@@ -207,7 +214,7 @@
    * @since 7.0
    */
   @Beta
-  protected boolean standardContainsKey(@NullableDecl Object key) {
+  protected boolean standardContainsKey(@CheckForNull Object key) {
     return Maps.containsKeyImpl(this, key);
   }
 
@@ -235,7 +242,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardContainsValue(@NullableDecl Object value) {
+  protected boolean standardContainsValue(@CheckForNull Object value) {
     return Maps.containsValueImpl(this, value);
   }
 
@@ -277,7 +284,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardEquals(@NullableDecl Object object) {
+  protected boolean standardEquals(@CheckForNull Object object) {
     return Maps.equalsImpl(this, object);
   }
 
diff --git a/android/guava/src/com/google/common/collect/ForwardingMapEntry.java b/android/guava/src/com/google/common/collect/ForwardingMapEntry.java
index 198b94b..6816ccb 100644
--- a/android/guava/src/com/google/common/collect/ForwardingMapEntry.java
+++ b/android/guava/src/com/google/common/collect/ForwardingMapEntry.java
@@ -21,7 +21,8 @@
 import com.google.common.base.Objects;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A map entry which forwards all its method calls to another map entry. Subclasses should override
@@ -47,7 +48,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingMapEntry<K, V> extends ForwardingObject implements Map.Entry<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingMapEntry<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingObject implements Map.Entry<K, V> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -57,22 +60,25 @@
   protected abstract Entry<K, V> delegate();
 
   @Override
+  @ParametricNullness
   public K getKey() {
     return delegate().getKey();
   }
 
   @Override
+  @ParametricNullness
   public V getValue() {
     return delegate().getValue();
   }
 
   @Override
-  public V setValue(V value) {
+  @ParametricNullness
+  public V setValue(@ParametricNullness V value) {
     return delegate().setValue(value);
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return delegate().equals(object);
   }
 
@@ -88,7 +94,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardEquals(@NullableDecl Object object) {
+  protected boolean standardEquals(@CheckForNull Object object) {
     if (object instanceof Entry) {
       Entry<?, ?> that = (Entry<?, ?>) object;
       return Objects.equal(this.getKey(), that.getKey())
diff --git a/android/guava/src/com/google/common/collect/ForwardingMultimap.java b/android/guava/src/com/google/common/collect/ForwardingMultimap.java
index 991d0cf..a3db061 100644
--- a/android/guava/src/com/google/common/collect/ForwardingMultimap.java
+++ b/android/guava/src/com/google/common/collect/ForwardingMultimap.java
@@ -22,7 +22,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A multimap which forwards all its method calls to another multimap. Subclasses should override
@@ -37,7 +38,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingMultimap<K, V> extends ForwardingObject implements Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingObject implements Multimap<K, V> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingMultimap() {}
@@ -56,17 +59,17 @@
   }
 
   @Override
-  public boolean containsEntry(@NullableDecl Object key, @NullableDecl Object value) {
+  public boolean containsEntry(@CheckForNull Object key, @CheckForNull Object value) {
     return delegate().containsEntry(key, value);
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return delegate().containsKey(key);
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return delegate().containsValue(value);
   }
 
@@ -76,7 +79,7 @@
   }
 
   @Override
-  public Collection<V> get(@NullableDecl K key) {
+  public Collection<V> get(@ParametricNullness K key) {
     return delegate().get(key);
   }
 
@@ -97,13 +100,13 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean put(K key, V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     return delegate().put(key, value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean putAll(K key, Iterable<? extends V> values) {
+  public boolean putAll(@ParametricNullness K key, Iterable<? extends V> values) {
     return delegate().putAll(key, values);
   }
 
@@ -115,19 +118,19 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean remove(@NullableDecl Object key, @NullableDecl Object value) {
+  public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
     return delegate().remove(key, value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public Collection<V> removeAll(@NullableDecl Object key) {
+  public Collection<V> removeAll(@CheckForNull Object key) {
     return delegate().removeAll(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public Collection<V> replaceValues(K key, Iterable<? extends V> values) {
+  public Collection<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return delegate().replaceValues(key, values);
   }
 
@@ -142,7 +145,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this || delegate().equals(object);
   }
 
diff --git a/android/guava/src/com/google/common/collect/ForwardingMultiset.java b/android/guava/src/com/google/common/collect/ForwardingMultiset.java
index 9a7084f..857b9ae 100644
--- a/android/guava/src/com/google/common/collect/ForwardingMultiset.java
+++ b/android/guava/src/com/google/common/collect/ForwardingMultiset.java
@@ -23,7 +23,8 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A multiset which forwards all its method calls to another multiset. Subclasses should override
@@ -48,7 +49,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingMultiset<E> extends ForwardingCollection<E> implements Multiset<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingMultiset<E extends @Nullable Object> extends ForwardingCollection<E>
+    implements Multiset<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingMultiset() {}
@@ -57,19 +60,19 @@
   protected abstract Multiset<E> delegate();
 
   @Override
-  public int count(Object element) {
+  public int count(@CheckForNull Object element) {
     return delegate().count(element);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public int add(E element, int occurrences) {
+  public int add(@ParametricNullness E element, int occurrences) {
     return delegate().add(element, occurrences);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public int remove(Object element, int occurrences) {
+  public int remove(@CheckForNull Object element, int occurrences) {
     return delegate().remove(element, occurrences);
   }
 
@@ -84,7 +87,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this || delegate().equals(object);
   }
 
@@ -95,13 +98,13 @@
 
   @CanIgnoreReturnValue
   @Override
-  public int setCount(E element, int count) {
+  public int setCount(@ParametricNullness E element, int count) {
     return delegate().setCount(element, count);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean setCount(E element, int oldCount, int newCount) {
+  public boolean setCount(@ParametricNullness E element, int oldCount, int newCount) {
     return delegate().setCount(element, oldCount, newCount);
   }
 
@@ -112,7 +115,7 @@
    * @since 7.0
    */
   @Override
-  protected boolean standardContains(@NullableDecl Object object) {
+  protected boolean standardContains(@CheckForNull Object object) {
     return count(object) > 0;
   }
 
@@ -136,7 +139,7 @@
    * @since 7.0
    */
   @Beta
-  protected int standardCount(@NullableDecl Object object) {
+  protected int standardCount(@CheckForNull Object object) {
     for (Entry<?> entry : this.entrySet()) {
       if (Objects.equal(entry.getElement(), object)) {
         return entry.getCount();
@@ -152,7 +155,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardAdd(E element) {
+  protected boolean standardAdd(@ParametricNullness E element) {
     add(element, 1);
     return true;
   }
@@ -178,7 +181,7 @@
    * @since 7.0
    */
   @Override
-  protected boolean standardRemove(Object element) {
+  protected boolean standardRemove(@CheckForNull Object element) {
     return remove(element, 1) > 0;
   }
 
@@ -214,7 +217,7 @@
    *
    * @since 7.0
    */
-  protected int standardSetCount(E element, int count) {
+  protected int standardSetCount(@ParametricNullness E element, int count) {
     return Multisets.setCountImpl(this, element, count);
   }
 
@@ -225,7 +228,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardSetCount(E element, int oldCount, int newCount) {
+  protected boolean standardSetCount(@ParametricNullness E element, int oldCount, int newCount) {
     return Multisets.setCountImpl(this, element, oldCount, newCount);
   }
 
@@ -285,7 +288,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardEquals(@NullableDecl Object object) {
+  protected boolean standardEquals(@CheckForNull Object object) {
     return Multisets.equalsImpl(this, object);
   }
 
diff --git a/android/guava/src/com/google/common/collect/ForwardingNavigableMap.java b/android/guava/src/com/google/common/collect/ForwardingNavigableMap.java
index c8d0fd5..e0e1c39 100644
--- a/android/guava/src/com/google/common/collect/ForwardingNavigableMap.java
+++ b/android/guava/src/com/google/common/collect/ForwardingNavigableMap.java
@@ -16,7 +16,6 @@
 
 package com.google.common.collect;
 
-import static com.google.common.collect.CollectPreconditions.checkRemove;
 import static com.google.common.collect.Maps.keyOrNull;
 
 import com.google.common.annotations.Beta;
@@ -26,6 +25,8 @@
 import java.util.NavigableSet;
 import java.util.NoSuchElementException;
 import java.util.SortedMap;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A navigable map which forwards all its method calls to another navigable map. Subclasses should
@@ -54,8 +55,9 @@
  * @since 12.0
  */
 @GwtIncompatible
-public abstract class ForwardingNavigableMap<K, V> extends ForwardingSortedMap<K, V>
-    implements NavigableMap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingNavigableMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingSortedMap<K, V> implements NavigableMap<K, V> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingNavigableMap() {}
@@ -64,7 +66,8 @@
   protected abstract NavigableMap<K, V> delegate();
 
   @Override
-  public Entry<K, V> lowerEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> lowerEntry(@ParametricNullness K key) {
     return delegate().lowerEntry(key);
   }
 
@@ -73,12 +76,14 @@
    * #headMap(Object, boolean)}. If you override {@code headMap}, you may wish to override {@code
    * lowerEntry} to forward to this implementation.
    */
-  protected Entry<K, V> standardLowerEntry(K key) {
+  @CheckForNull
+  protected Entry<K, V> standardLowerEntry(@ParametricNullness K key) {
     return headMap(key, false).lastEntry();
   }
 
   @Override
-  public K lowerKey(K key) {
+  @CheckForNull
+  public K lowerKey(@ParametricNullness K key) {
     return delegate().lowerKey(key);
   }
 
@@ -87,12 +92,14 @@
    * {@link #lowerEntry}, you may wish to override {@code lowerKey} to forward to this
    * implementation.
    */
-  protected K standardLowerKey(K key) {
+  @CheckForNull
+  protected K standardLowerKey(@ParametricNullness K key) {
     return keyOrNull(lowerEntry(key));
   }
 
   @Override
-  public Entry<K, V> floorEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> floorEntry(@ParametricNullness K key) {
     return delegate().floorEntry(key);
   }
 
@@ -101,12 +108,14 @@
    * #headMap(Object, boolean)}. If you override {@code headMap}, you may wish to override {@code
    * floorEntry} to forward to this implementation.
    */
-  protected Entry<K, V> standardFloorEntry(K key) {
+  @CheckForNull
+  protected Entry<K, V> standardFloorEntry(@ParametricNullness K key) {
     return headMap(key, true).lastEntry();
   }
 
   @Override
-  public K floorKey(K key) {
+  @CheckForNull
+  public K floorKey(@ParametricNullness K key) {
     return delegate().floorKey(key);
   }
 
@@ -115,12 +124,14 @@
    * {@code floorEntry}, you may wish to override {@code floorKey} to forward to this
    * implementation.
    */
-  protected K standardFloorKey(K key) {
+  @CheckForNull
+  protected K standardFloorKey(@ParametricNullness K key) {
     return keyOrNull(floorEntry(key));
   }
 
   @Override
-  public Entry<K, V> ceilingEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> ceilingEntry(@ParametricNullness K key) {
     return delegate().ceilingEntry(key);
   }
 
@@ -129,12 +140,14 @@
    * #tailMap(Object, boolean)}. If you override {@code tailMap}, you may wish to override {@code
    * ceilingEntry} to forward to this implementation.
    */
-  protected Entry<K, V> standardCeilingEntry(K key) {
+  @CheckForNull
+  protected Entry<K, V> standardCeilingEntry(@ParametricNullness K key) {
     return tailMap(key, true).firstEntry();
   }
 
   @Override
-  public K ceilingKey(K key) {
+  @CheckForNull
+  public K ceilingKey(@ParametricNullness K key) {
     return delegate().ceilingKey(key);
   }
 
@@ -143,12 +156,14 @@
    * {@code ceilingEntry}, you may wish to override {@code ceilingKey} to forward to this
    * implementation.
    */
-  protected K standardCeilingKey(K key) {
+  @CheckForNull
+  protected K standardCeilingKey(@ParametricNullness K key) {
     return keyOrNull(ceilingEntry(key));
   }
 
   @Override
-  public Entry<K, V> higherEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> higherEntry(@ParametricNullness K key) {
     return delegate().higherEntry(key);
   }
 
@@ -157,12 +172,14 @@
    * #tailMap(Object, boolean)}. If you override {@code tailMap}, you may wish to override {@code
    * higherEntry} to forward to this implementation.
    */
-  protected Entry<K, V> standardHigherEntry(K key) {
+  @CheckForNull
+  protected Entry<K, V> standardHigherEntry(@ParametricNullness K key) {
     return tailMap(key, false).firstEntry();
   }
 
   @Override
-  public K higherKey(K key) {
+  @CheckForNull
+  public K higherKey(@ParametricNullness K key) {
     return delegate().higherKey(key);
   }
 
@@ -171,11 +188,13 @@
    * {@code higherEntry}, you may wish to override {@code higherKey} to forward to this
    * implementation.
    */
-  protected K standardHigherKey(K key) {
+  @CheckForNull
+  protected K standardHigherKey(@ParametricNullness K key) {
     return keyOrNull(higherEntry(key));
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> firstEntry() {
     return delegate().firstEntry();
   }
@@ -185,6 +204,7 @@
    * #entrySet}. If you override {@code entrySet}, you may wish to override {@code firstEntry} to
    * forward to this implementation.
    */
+  @CheckForNull
   protected Entry<K, V> standardFirstEntry() {
     return Iterables.getFirst(entrySet(), null);
   }
@@ -204,6 +224,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> lastEntry() {
     return delegate().lastEntry();
   }
@@ -213,6 +234,7 @@
    * #entrySet} of {@link #descendingMap}. If you override {@code descendingMap}, you may wish to
    * override {@code lastEntry} to forward to this implementation.
    */
+  @CheckForNull
   protected Entry<K, V> standardLastEntry() {
     return Iterables.getFirst(descendingMap().entrySet(), null);
   }
@@ -231,6 +253,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> pollFirstEntry() {
     return delegate().pollFirstEntry();
   }
@@ -240,11 +263,13 @@
    * entrySet}. If you override {@code entrySet}, you may wish to override {@code pollFirstEntry} to
    * forward to this implementation.
    */
+  @CheckForNull
   protected Entry<K, V> standardPollFirstEntry() {
     return Iterators.pollNext(entrySet().iterator());
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> pollLastEntry() {
     return delegate().pollLastEntry();
   }
@@ -254,6 +279,7 @@
    * entrySet} of {@code descendingMap}. If you override {@code descendingMap}, you may wish to
    * override {@code pollFirstEntry} to forward to this implementation.
    */
+  @CheckForNull
   protected Entry<K, V> standardPollLastEntry() {
     return Iterators.pollNext(descendingMap().entrySet().iterator());
   }
@@ -287,8 +313,8 @@
     @Override
     protected Iterator<Entry<K, V>> entryIterator() {
       return new Iterator<Entry<K, V>>() {
-        private Entry<K, V> toRemove = null;
-        private Entry<K, V> nextOrNull = forward().lastEntry();
+        @CheckForNull private Entry<K, V> toRemove = null;
+        @CheckForNull private Entry<K, V> nextOrNull = forward().lastEntry();
 
         @Override
         public boolean hasNext() {
@@ -297,7 +323,7 @@
 
         @Override
         public java.util.Map.Entry<K, V> next() {
-          if (!hasNext()) {
+          if (nextOrNull == null) {
             throw new NoSuchElementException();
           }
           try {
@@ -310,7 +336,9 @@
 
         @Override
         public void remove() {
-          checkRemove(toRemove != null);
+          if (toRemove == null) {
+            throw new IllegalStateException("no calls to next() since the last call to remove()");
+          }
           forward().remove(toRemove.getKey());
           toRemove = null;
         }
@@ -362,22 +390,27 @@
    * wish to override {@code subMap} to forward to this implementation.
    */
   @Override
-  protected SortedMap<K, V> standardSubMap(K fromKey, K toKey) {
+  protected SortedMap<K, V> standardSubMap(
+      @ParametricNullness K fromKey, @ParametricNullness K toKey) {
     return subMap(fromKey, true, toKey, false);
   }
 
   @Override
-  public NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+  public NavigableMap<K, V> subMap(
+      @ParametricNullness K fromKey,
+      boolean fromInclusive,
+      @ParametricNullness K toKey,
+      boolean toInclusive) {
     return delegate().subMap(fromKey, fromInclusive, toKey, toInclusive);
   }
 
   @Override
-  public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
+  public NavigableMap<K, V> headMap(@ParametricNullness K toKey, boolean inclusive) {
     return delegate().headMap(toKey, inclusive);
   }
 
   @Override
-  public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
+  public NavigableMap<K, V> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
     return delegate().tailMap(fromKey, inclusive);
   }
 
@@ -386,7 +419,7 @@
    * boolean)}. If you override {@code headMap(K, boolean)}, you may wish to override {@code
    * headMap} to forward to this implementation.
    */
-  protected SortedMap<K, V> standardHeadMap(K toKey) {
+  protected SortedMap<K, V> standardHeadMap(@ParametricNullness K toKey) {
     return headMap(toKey, false);
   }
 
@@ -395,7 +428,7 @@
    * boolean)}. If you override {@code tailMap(K, boolean)}, you may wish to override {@code
    * tailMap} to forward to this implementation.
    */
-  protected SortedMap<K, V> standardTailMap(K fromKey) {
+  protected SortedMap<K, V> standardTailMap(@ParametricNullness K fromKey) {
     return tailMap(fromKey, true);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingNavigableSet.java b/android/guava/src/com/google/common/collect/ForwardingNavigableSet.java
index 827698e..6822aa8 100644
--- a/android/guava/src/com/google/common/collect/ForwardingNavigableSet.java
+++ b/android/guava/src/com/google/common/collect/ForwardingNavigableSet.java
@@ -21,6 +21,8 @@
 import java.util.Iterator;
 import java.util.NavigableSet;
 import java.util.SortedSet;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A navigable set which forwards all its method calls to another navigable set. Subclasses should
@@ -49,8 +51,9 @@
  * @since 12.0
  */
 @GwtIncompatible
-public abstract class ForwardingNavigableSet<E> extends ForwardingSortedSet<E>
-    implements NavigableSet<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingNavigableSet<E extends @Nullable Object>
+    extends ForwardingSortedSet<E> implements NavigableSet<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingNavigableSet() {}
@@ -59,7 +62,8 @@
   protected abstract NavigableSet<E> delegate();
 
   @Override
-  public E lower(E e) {
+  @CheckForNull
+  public E lower(@ParametricNullness E e) {
     return delegate().lower(e);
   }
 
@@ -68,12 +72,14 @@
    * {@link #headSet(Object, boolean)}. If you override {@link #headSet(Object, boolean)}, you may
    * wish to override {@link #lower} to forward to this implementation.
    */
-  protected E standardLower(E e) {
+  @CheckForNull
+  protected E standardLower(@ParametricNullness E e) {
     return Iterators.getNext(headSet(e, false).descendingIterator(), null);
   }
 
   @Override
-  public E floor(E e) {
+  @CheckForNull
+  public E floor(@ParametricNullness E e) {
     return delegate().floor(e);
   }
 
@@ -82,12 +88,14 @@
    * {@link #headSet(Object, boolean)}. If you override {@link #headSet(Object, boolean)}, you may
    * wish to override {@link #floor} to forward to this implementation.
    */
-  protected E standardFloor(E e) {
+  @CheckForNull
+  protected E standardFloor(@ParametricNullness E e) {
     return Iterators.getNext(headSet(e, true).descendingIterator(), null);
   }
 
   @Override
-  public E ceiling(E e) {
+  @CheckForNull
+  public E ceiling(@ParametricNullness E e) {
     return delegate().ceiling(e);
   }
 
@@ -96,12 +104,14 @@
    * #tailSet(Object, boolean)}. If you override {@link #tailSet(Object, boolean)}, you may wish to
    * override {@link #ceiling} to forward to this implementation.
    */
-  protected E standardCeiling(E e) {
+  @CheckForNull
+  protected E standardCeiling(@ParametricNullness E e) {
     return Iterators.getNext(tailSet(e, true).iterator(), null);
   }
 
   @Override
-  public E higher(E e) {
+  @CheckForNull
+  public E higher(@ParametricNullness E e) {
     return delegate().higher(e);
   }
 
@@ -110,11 +120,13 @@
    * #tailSet(Object, boolean)}. If you override {@link #tailSet(Object, boolean)}, you may wish to
    * override {@link #higher} to forward to this implementation.
    */
-  protected E standardHigher(E e) {
+  @CheckForNull
+  protected E standardHigher(@ParametricNullness E e) {
     return Iterators.getNext(tailSet(e, false).iterator(), null);
   }
 
   @Override
+  @CheckForNull
   public E pollFirst() {
     return delegate().pollFirst();
   }
@@ -124,11 +136,13 @@
    * override {@link #iterator} you may wish to override {@link #pollFirst} to forward to this
    * implementation.
    */
+  @CheckForNull
   protected E standardPollFirst() {
     return Iterators.pollNext(iterator());
   }
 
   @Override
+  @CheckForNull
   public E pollLast() {
     return delegate().pollLast();
   }
@@ -138,14 +152,17 @@
    * If you override {@link #descendingIterator} you may wish to override {@link #pollLast} to
    * forward to this implementation.
    */
+  @CheckForNull
   protected E standardPollLast() {
     return Iterators.pollNext(descendingIterator());
   }
 
+  @ParametricNullness
   protected E standardFirst() {
     return iterator().next();
   }
 
+  @ParametricNullness
   protected E standardLast() {
     return descendingIterator().next();
   }
@@ -179,7 +196,10 @@
 
   @Override
   public NavigableSet<E> subSet(
-      E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+      @ParametricNullness E fromElement,
+      boolean fromInclusive,
+      @ParametricNullness E toElement,
+      boolean toInclusive) {
     return delegate().subSet(fromElement, fromInclusive, toElement, toInclusive);
   }
 
@@ -190,7 +210,10 @@
    */
   @Beta
   protected NavigableSet<E> standardSubSet(
-      E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+      @ParametricNullness E fromElement,
+      boolean fromInclusive,
+      @ParametricNullness E toElement,
+      boolean toInclusive) {
     return tailSet(fromElement, fromInclusive).headSet(toElement, toInclusive);
   }
 
@@ -201,12 +224,13 @@
    * implementation.
    */
   @Override
-  protected SortedSet<E> standardSubSet(E fromElement, E toElement) {
+  protected SortedSet<E> standardSubSet(
+      @ParametricNullness E fromElement, @ParametricNullness E toElement) {
     return subSet(fromElement, true, toElement, false);
   }
 
   @Override
-  public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+  public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
     return delegate().headSet(toElement, inclusive);
   }
 
@@ -215,12 +239,12 @@
    * boolean)} method. If you override {@link #headSet(Object, boolean)}, you may wish to override
    * {@link #headSet(Object)} to forward to this implementation.
    */
-  protected SortedSet<E> standardHeadSet(E toElement) {
+  protected SortedSet<E> standardHeadSet(@ParametricNullness E toElement) {
     return headSet(toElement, false);
   }
 
   @Override
-  public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+  public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
     return delegate().tailSet(fromElement, inclusive);
   }
 
@@ -229,7 +253,7 @@
    * boolean)} method. If you override {@link #tailSet(Object, boolean)}, you may wish to override
    * {@link #tailSet(Object)} to forward to this implementation.
    */
-  protected SortedSet<E> standardTailSet(E fromElement) {
+  protected SortedSet<E> standardTailSet(@ParametricNullness E fromElement) {
     return tailSet(fromElement, true);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingObject.java b/android/guava/src/com/google/common/collect/ForwardingObject.java
index 712b14f..64af908 100644
--- a/android/guava/src/com/google/common/collect/ForwardingObject.java
+++ b/android/guava/src/com/google/common/collect/ForwardingObject.java
@@ -44,6 +44,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingObject {
 
   /** Constructor for use by subclasses. */
diff --git a/android/guava/src/com/google/common/collect/ForwardingQueue.java b/android/guava/src/com/google/common/collect/ForwardingQueue.java
index f77e560..43c2eaa 100644
--- a/android/guava/src/com/google/common/collect/ForwardingQueue.java
+++ b/android/guava/src/com/google/common/collect/ForwardingQueue.java
@@ -20,6 +20,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.NoSuchElementException;
 import java.util.Queue;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A queue which forwards all its method calls to another queue. Subclasses should override one or
@@ -44,7 +46,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingQueue<E> extends ForwardingCollection<E> implements Queue<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingQueue<E extends @Nullable Object> extends ForwardingCollection<E>
+    implements Queue<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingQueue() {}
@@ -54,28 +58,32 @@
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
-  public boolean offer(E o) {
+  public boolean offer(@ParametricNullness E o) {
     return delegate().offer(o);
   }
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
+  @CheckForNull
   public E poll() {
     return delegate().poll();
   }
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E remove() {
     return delegate().remove();
   }
 
   @Override
+  @CheckForNull
   public E peek() {
     return delegate().peek();
   }
 
   @Override
+  @ParametricNullness
   public E element() {
     return delegate().element();
   }
@@ -86,7 +94,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardOffer(E e) {
+  protected boolean standardOffer(@ParametricNullness E e) {
     try {
       return add(e);
     } catch (IllegalStateException caught) {
@@ -100,6 +108,7 @@
    *
    * @since 7.0
    */
+  @CheckForNull
   protected E standardPeek() {
     try {
       return element();
@@ -114,6 +123,7 @@
    *
    * @since 7.0
    */
+  @CheckForNull
   protected E standardPoll() {
     try {
       return remove();
diff --git a/android/guava/src/com/google/common/collect/ForwardingSet.java b/android/guava/src/com/google/common/collect/ForwardingSet.java
index 73b1413..bc27272 100644
--- a/android/guava/src/com/google/common/collect/ForwardingSet.java
+++ b/android/guava/src/com/google/common/collect/ForwardingSet.java
@@ -21,7 +21,8 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Collection;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A set which forwards all its method calls to another set. Subclasses should override one or more
@@ -46,7 +47,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingSet<E> extends ForwardingCollection<E> implements Set<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSet<E extends @Nullable Object> extends ForwardingCollection<E>
+    implements Set<E> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -56,7 +59,7 @@
   protected abstract Set<E> delegate();
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this || delegate().equals(object);
   }
 
@@ -84,7 +87,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardEquals(@NullableDecl Object object) {
+  protected boolean standardEquals(@CheckForNull Object object) {
     return Sets.equalsImpl(this, object);
   }
 
diff --git a/android/guava/src/com/google/common/collect/ForwardingSetMultimap.java b/android/guava/src/com/google/common/collect/ForwardingSetMultimap.java
index 61a0de2..5077c68 100644
--- a/android/guava/src/com/google/common/collect/ForwardingSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/ForwardingSetMultimap.java
@@ -20,7 +20,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A set multimap which forwards all its method calls to another set multimap. Subclasses should
@@ -35,8 +36,9 @@
  * @since 3.0
  */
 @GwtCompatible
-public abstract class ForwardingSetMultimap<K, V> extends ForwardingMultimap<K, V>
-    implements SetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingMultimap<K, V> implements SetMultimap<K, V> {
 
   @Override
   protected abstract SetMultimap<K, V> delegate();
@@ -47,19 +49,19 @@
   }
 
   @Override
-  public Set<V> get(@NullableDecl K key) {
+  public Set<V> get(@ParametricNullness K key) {
     return delegate().get(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public Set<V> removeAll(@NullableDecl Object key) {
+  public Set<V> removeAll(@CheckForNull Object key) {
     return delegate().removeAll(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public Set<V> replaceValues(K key, Iterable<? extends V> values) {
+  public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return delegate().replaceValues(key, values);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingSortedMap.java b/android/guava/src/com/google/common/collect/ForwardingSortedMap.java
index 4866fb9..e0882ab 100644
--- a/android/guava/src/com/google/common/collect/ForwardingSortedMap.java
+++ b/android/guava/src/com/google/common/collect/ForwardingSortedMap.java
@@ -23,7 +23,8 @@
 import java.util.Comparator;
 import java.util.NoSuchElementException;
 import java.util.SortedMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A sorted map which forwards all its method calls to another sorted map. Subclasses should
@@ -51,8 +52,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingSortedMap<K, V> extends ForwardingMap<K, V>
-    implements SortedMap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSortedMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingMap<K, V> implements SortedMap<K, V> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -62,32 +64,35 @@
   protected abstract SortedMap<K, V> delegate();
 
   @Override
+  @CheckForNull
   public Comparator<? super K> comparator() {
     return delegate().comparator();
   }
 
   @Override
+  @ParametricNullness
   public K firstKey() {
     return delegate().firstKey();
   }
 
   @Override
-  public SortedMap<K, V> headMap(K toKey) {
+  public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
     return delegate().headMap(toKey);
   }
 
   @Override
+  @ParametricNullness
   public K lastKey() {
     return delegate().lastKey();
   }
 
   @Override
-  public SortedMap<K, V> subMap(K fromKey, K toKey) {
+  public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
     return delegate().subMap(fromKey, toKey);
   }
 
   @Override
-  public SortedMap<K, V> tailMap(K fromKey) {
+  public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
     return delegate().tailMap(fromKey);
   }
 
@@ -106,14 +111,14 @@
     }
   }
 
-  // unsafe, but worst case is a CCE is thrown, which callers will be expecting
-  @SuppressWarnings("unchecked")
-  private int unsafeCompare(Object k1, Object k2) {
-    Comparator<? super K> comparator = comparator();
+  // unsafe, but worst case is a CCE or NPE is thrown, which callers will be expecting
+  @SuppressWarnings({"unchecked", "nullness"})
+  static int unsafeCompare(
+      @CheckForNull Comparator<?> comparator, @CheckForNull Object o1, @CheckForNull Object o2) {
     if (comparator == null) {
-      return ((Comparable<Object>) k1).compareTo(k2);
+      return ((Comparable<@Nullable Object>) o1).compareTo(o2);
     } else {
-      return ((Comparator<Object>) comparator).compare(k1, k2);
+      return ((Comparator<@Nullable Object>) comparator).compare(o1, o2);
     }
   }
 
@@ -126,13 +131,13 @@
    */
   @Override
   @Beta
-  protected boolean standardContainsKey(@NullableDecl Object key) {
+  protected boolean standardContainsKey(@CheckForNull Object key) {
     try {
-      // any CCE will be caught
-      @SuppressWarnings("unchecked")
-      SortedMap<Object, V> self = (SortedMap<Object, V>) this;
+      // any CCE or NPE will be caught
+      @SuppressWarnings({"unchecked", "nullness"})
+      SortedMap<@Nullable Object, V> self = (SortedMap<@Nullable Object, V>) this;
       Object ceilingKey = self.tailMap(key).firstKey();
-      return unsafeCompare(ceilingKey, key) == 0;
+      return unsafeCompare(comparator(), ceilingKey, key) == 0;
     } catch (ClassCastException | NoSuchElementException | NullPointerException e) {
       return false;
     }
@@ -147,7 +152,7 @@
    */
   @Beta
   protected SortedMap<K, V> standardSubMap(K fromKey, K toKey) {
-    checkArgument(unsafeCompare(fromKey, toKey) <= 0, "fromKey must be <= toKey");
+    checkArgument(unsafeCompare(comparator(), fromKey, toKey) <= 0, "fromKey must be <= toKey");
     return tailMap(fromKey).headMap(toKey);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingSortedMultiset.java b/android/guava/src/com/google/common/collect/ForwardingSortedMultiset.java
index 1d34fb3..4626d31 100644
--- a/android/guava/src/com/google/common/collect/ForwardingSortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/ForwardingSortedMultiset.java
@@ -19,6 +19,8 @@
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.NavigableSet;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A sorted multiset which forwards all its method calls to another sorted multiset. Subclasses
@@ -44,8 +46,9 @@
  */
 @Beta
 @GwtCompatible(emulated = true)
-public abstract class ForwardingSortedMultiset<E> extends ForwardingMultiset<E>
-    implements SortedMultiset<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSortedMultiset<E extends @Nullable Object>
+    extends ForwardingMultiset<E> implements SortedMultiset<E> {
   /** Constructor for use by subclasses. */
   protected ForwardingSortedMultiset() {}
 
@@ -110,6 +113,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     return delegate().firstEntry();
   }
@@ -120,6 +124,7 @@
    * <p>If you override {@link #entrySet()}, you may wish to override {@link #firstEntry()} to
    * forward to this implementation.
    */
+  @CheckForNull
   protected Entry<E> standardFirstEntry() {
     Iterator<Entry<E>> entryIterator = entrySet().iterator();
     if (!entryIterator.hasNext()) {
@@ -130,6 +135,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     return delegate().lastEntry();
   }
@@ -141,6 +147,7 @@
    * <p>If you override {@link #descendingMultiset} or {@link #entrySet()}, you may wish to override
    * {@link #firstEntry()} to forward to this implementation.
    */
+  @CheckForNull
   protected Entry<E> standardLastEntry() {
     Iterator<Entry<E>> entryIterator = descendingMultiset().entrySet().iterator();
     if (!entryIterator.hasNext()) {
@@ -151,6 +158,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollFirstEntry() {
     return delegate().pollFirstEntry();
   }
@@ -161,6 +169,7 @@
    * <p>If you override {@link #entrySet()}, you may wish to override {@link #pollFirstEntry()} to
    * forward to this implementation.
    */
+  @CheckForNull
   protected Entry<E> standardPollFirstEntry() {
     Iterator<Entry<E>> entryIterator = entrySet().iterator();
     if (!entryIterator.hasNext()) {
@@ -173,6 +182,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollLastEntry() {
     return delegate().pollLastEntry();
   }
@@ -184,6 +194,7 @@
    * <p>If you override {@link #descendingMultiset()} or {@link #entrySet()}, you may wish to
    * override {@link #pollLastEntry()} to forward to this implementation.
    */
+  @CheckForNull
   protected Entry<E> standardPollLastEntry() {
     Iterator<Entry<E>> entryIterator = descendingMultiset().entrySet().iterator();
     if (!entryIterator.hasNext()) {
@@ -196,13 +207,16 @@
   }
 
   @Override
-  public SortedMultiset<E> headMultiset(E upperBound, BoundType boundType) {
+  public SortedMultiset<E> headMultiset(@ParametricNullness E upperBound, BoundType boundType) {
     return delegate().headMultiset(upperBound, boundType);
   }
 
   @Override
   public SortedMultiset<E> subMultiset(
-      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType) {
+      @ParametricNullness E lowerBound,
+      BoundType lowerBoundType,
+      @ParametricNullness E upperBound,
+      BoundType upperBoundType) {
     return delegate().subMultiset(lowerBound, lowerBoundType, upperBound, upperBoundType);
   }
 
@@ -215,12 +229,15 @@
    * #subMultiset(Object, BoundType, Object, BoundType)} to forward to this implementation.
    */
   protected SortedMultiset<E> standardSubMultiset(
-      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType) {
+      @ParametricNullness E lowerBound,
+      BoundType lowerBoundType,
+      @ParametricNullness E upperBound,
+      BoundType upperBoundType) {
     return tailMultiset(lowerBound, lowerBoundType).headMultiset(upperBound, upperBoundType);
   }
 
   @Override
-  public SortedMultiset<E> tailMultiset(E lowerBound, BoundType boundType) {
+  public SortedMultiset<E> tailMultiset(@ParametricNullness E lowerBound, BoundType boundType) {
     return delegate().tailMultiset(lowerBound, boundType);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingSortedSet.java b/android/guava/src/com/google/common/collect/ForwardingSortedSet.java
index 9879944..32625af 100644
--- a/android/guava/src/com/google/common/collect/ForwardingSortedSet.java
+++ b/android/guava/src/com/google/common/collect/ForwardingSortedSet.java
@@ -16,13 +16,16 @@
 
 package com.google.common.collect;
 
+import static com.google.common.collect.ForwardingSortedMap.unsafeCompare;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A sorted set which forwards all its method calls to another sorted set. Subclasses should
@@ -52,7 +55,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingSortedSet<E> extends ForwardingSet<E> implements SortedSet<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSortedSet<E extends @Nullable Object> extends ForwardingSet<E>
+    implements SortedSet<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingSortedSet() {}
@@ -61,44 +66,38 @@
   protected abstract SortedSet<E> delegate();
 
   @Override
+  @CheckForNull
   public Comparator<? super E> comparator() {
     return delegate().comparator();
   }
 
   @Override
+  @ParametricNullness
   public E first() {
     return delegate().first();
   }
 
   @Override
-  public SortedSet<E> headSet(E toElement) {
+  public SortedSet<E> headSet(@ParametricNullness E toElement) {
     return delegate().headSet(toElement);
   }
 
   @Override
+  @ParametricNullness
   public E last() {
     return delegate().last();
   }
 
   @Override
-  public SortedSet<E> subSet(E fromElement, E toElement) {
+  public SortedSet<E> subSet(@ParametricNullness E fromElement, @ParametricNullness E toElement) {
     return delegate().subSet(fromElement, toElement);
   }
 
   @Override
-  public SortedSet<E> tailSet(E fromElement) {
+  public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
     return delegate().tailSet(fromElement);
   }
 
-  // unsafe, but worst case is a CCE is thrown, which callers will be expecting
-  @SuppressWarnings("unchecked")
-  private int unsafeCompare(@NullableDecl Object o1, @NullableDecl Object o2) {
-    Comparator<? super E> comparator = comparator();
-    return (comparator == null)
-        ? ((Comparable<Object>) o1).compareTo(o2)
-        : ((Comparator<Object>) comparator).compare(o1, o2);
-  }
-
   /**
    * A sensible definition of {@link #contains} in terms of the {@code first()} method of {@link
    * #tailSet}. If you override {@link #tailSet}, you may wish to override {@link #contains} to
@@ -108,13 +107,13 @@
    */
   @Override
   @Beta
-  protected boolean standardContains(@NullableDecl Object object) {
+  protected boolean standardContains(@CheckForNull Object object) {
     try {
-      // any ClassCastExceptions are caught
-      @SuppressWarnings("unchecked")
-      SortedSet<Object> self = (SortedSet<Object>) this;
+      // any ClassCastExceptions and NullPointerExceptions are caught
+      @SuppressWarnings({"unchecked", "nullness"})
+      SortedSet<@Nullable Object> self = (SortedSet<@Nullable Object>) this;
       Object ceiling = self.tailSet(object).first();
-      return unsafeCompare(ceiling, object) == 0;
+      return unsafeCompare(comparator(), ceiling, object) == 0;
     } catch (ClassCastException | NoSuchElementException | NullPointerException e) {
       return false;
     }
@@ -129,15 +128,15 @@
    */
   @Override
   @Beta
-  protected boolean standardRemove(@NullableDecl Object object) {
+  protected boolean standardRemove(@CheckForNull Object object) {
     try {
-      // any ClassCastExceptions are caught
-      @SuppressWarnings("unchecked")
-      SortedSet<Object> self = (SortedSet<Object>) this;
-      Iterator<Object> iterator = self.tailSet(object).iterator();
+      // any ClassCastExceptions and NullPointerExceptions are caught
+      @SuppressWarnings({"unchecked", "nullness"})
+      SortedSet<@Nullable Object> self = (SortedSet<@Nullable Object>) this;
+      Iterator<?> iterator = self.tailSet(object).iterator();
       if (iterator.hasNext()) {
         Object ceiling = iterator.next();
-        if (unsafeCompare(ceiling, object) == 0) {
+        if (unsafeCompare(comparator(), ceiling, object) == 0) {
           iterator.remove();
           return true;
         }
@@ -156,7 +155,8 @@
    * @since 7.0
    */
   @Beta
-  protected SortedSet<E> standardSubSet(E fromElement, E toElement) {
+  protected SortedSet<E> standardSubSet(
+      @ParametricNullness E fromElement, @ParametricNullness E toElement) {
     return tailSet(fromElement).headSet(toElement);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/ForwardingSortedSetMultimap.java b/android/guava/src/com/google/common/collect/ForwardingSortedSetMultimap.java
index 78319a7..b91a68b 100644
--- a/android/guava/src/com/google/common/collect/ForwardingSortedSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/ForwardingSortedSetMultimap.java
@@ -19,7 +19,8 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A sorted set multimap which forwards all its method calls to another sorted set multimap.
@@ -34,8 +35,10 @@
  * @since 3.0
  */
 @GwtCompatible
-public abstract class ForwardingSortedSetMultimap<K, V> extends ForwardingSetMultimap<K, V>
-    implements SortedSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSortedSetMultimap<
+        K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingSetMultimap<K, V> implements SortedSetMultimap<K, V> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingSortedSetMultimap() {}
@@ -44,21 +47,22 @@
   protected abstract SortedSetMultimap<K, V> delegate();
 
   @Override
-  public SortedSet<V> get(@NullableDecl K key) {
+  public SortedSet<V> get(@ParametricNullness K key) {
     return delegate().get(key);
   }
 
   @Override
-  public SortedSet<V> removeAll(@NullableDecl Object key) {
+  public SortedSet<V> removeAll(@CheckForNull Object key) {
     return delegate().removeAll(key);
   }
 
   @Override
-  public SortedSet<V> replaceValues(K key, Iterable<? extends V> values) {
+  public SortedSet<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return delegate().replaceValues(key, values);
   }
 
   @Override
+  @CheckForNull
   public Comparator<? super V> valueComparator() {
     return delegate().valueComparator();
   }
diff --git a/android/guava/src/com/google/common/collect/ForwardingTable.java b/android/guava/src/com/google/common/collect/ForwardingTable.java
index 71a54cf..4fcb858 100644
--- a/android/guava/src/com/google/common/collect/ForwardingTable.java
+++ b/android/guava/src/com/google/common/collect/ForwardingTable.java
@@ -21,6 +21,8 @@
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A table which forwards all its method calls to another table. Subclasses should override one or
@@ -31,7 +33,10 @@
  * @since 7.0
  */
 @GwtCompatible
-public abstract class ForwardingTable<R, C, V> extends ForwardingObject implements Table<R, C, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingTable<
+        R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingObject implements Table<R, C, V> {
   /** Constructor for use by subclasses. */
   protected ForwardingTable() {}
 
@@ -49,7 +54,7 @@
   }
 
   @Override
-  public Map<R, V> column(C columnKey) {
+  public Map<R, V> column(@ParametricNullness C columnKey) {
     return delegate().column(columnKey);
   }
 
@@ -64,27 +69,28 @@
   }
 
   @Override
-  public boolean contains(Object rowKey, Object columnKey) {
+  public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return delegate().contains(rowKey, columnKey);
   }
 
   @Override
-  public boolean containsColumn(Object columnKey) {
+  public boolean containsColumn(@CheckForNull Object columnKey) {
     return delegate().containsColumn(columnKey);
   }
 
   @Override
-  public boolean containsRow(Object rowKey) {
+  public boolean containsRow(@CheckForNull Object rowKey) {
     return delegate().containsRow(rowKey);
   }
 
   @Override
-  public boolean containsValue(Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return delegate().containsValue(value);
   }
 
   @Override
-  public V get(Object rowKey, Object columnKey) {
+  @CheckForNull
+  public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return delegate().get(rowKey, columnKey);
   }
 
@@ -95,7 +101,9 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V put(R rowKey, C columnKey, V value) {
+  @CheckForNull
+  public V put(
+      @ParametricNullness R rowKey, @ParametricNullness C columnKey, @ParametricNullness V value) {
     return delegate().put(rowKey, columnKey, value);
   }
 
@@ -106,12 +114,13 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(Object rowKey, Object columnKey) {
+  @CheckForNull
+  public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return delegate().remove(rowKey, columnKey);
   }
 
   @Override
-  public Map<C, V> row(R rowKey) {
+  public Map<C, V> row(@ParametricNullness R rowKey) {
     return delegate().row(rowKey);
   }
 
@@ -136,7 +145,7 @@
   }
 
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     return (obj == this) || delegate().equals(obj);
   }
 
diff --git a/android/guava/src/com/google/common/collect/GeneralRange.java b/android/guava/src/com/google/common/collect/GeneralRange.java
index 6956187..20cf4fb 100644
--- a/android/guava/src/com/google/common/collect/GeneralRange.java
+++ b/android/guava/src/com/google/common/collect/GeneralRange.java
@@ -18,12 +18,14 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.BoundType.CLOSED;
 import static com.google.common.collect.BoundType.OPEN;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Objects;
 import java.io.Serializable;
 import java.util.Comparator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A generalized interval on any ordering, for internal use. Supports {@code null}. Unlike {@link
@@ -35,13 +37,14 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(serializable = true)
-final class GeneralRange<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class GeneralRange<T extends @Nullable Object> implements Serializable {
   /** Converts a Range to a GeneralRange. */
   static <T extends Comparable> GeneralRange<T> from(Range<T> range) {
-    @NullableDecl T lowerEndpoint = range.hasLowerBound() ? range.lowerEndpoint() : null;
+    T lowerEndpoint = range.hasLowerBound() ? range.lowerEndpoint() : null;
     BoundType lowerBoundType = range.hasLowerBound() ? range.lowerBoundType() : OPEN;
 
-    @NullableDecl T upperEndpoint = range.hasUpperBound() ? range.upperEndpoint() : null;
+    T upperEndpoint = range.hasUpperBound() ? range.upperEndpoint() : null;
     BoundType upperBoundType = range.hasUpperBound() ? range.upperBoundType() : OPEN;
     return new GeneralRange<T>(
         Ordering.natural(),
@@ -54,7 +57,7 @@
   }
 
   /** Returns the whole range relative to the specified comparator. */
-  static <T> GeneralRange<T> all(Comparator<? super T> comparator) {
+  static <T extends @Nullable Object> GeneralRange<T> all(Comparator<? super T> comparator) {
     return new GeneralRange<T>(comparator, false, null, OPEN, false, null, OPEN);
   }
 
@@ -62,8 +65,8 @@
    * Returns everything above the endpoint relative to the specified comparator, with the specified
    * endpoint behavior.
    */
-  static <T> GeneralRange<T> downTo(
-      Comparator<? super T> comparator, @NullableDecl T endpoint, BoundType boundType) {
+  static <T extends @Nullable Object> GeneralRange<T> downTo(
+      Comparator<? super T> comparator, @ParametricNullness T endpoint, BoundType boundType) {
     return new GeneralRange<T>(comparator, true, endpoint, boundType, false, null, OPEN);
   }
 
@@ -71,8 +74,8 @@
    * Returns everything below the endpoint relative to the specified comparator, with the specified
    * endpoint behavior.
    */
-  static <T> GeneralRange<T> upTo(
-      Comparator<? super T> comparator, @NullableDecl T endpoint, BoundType boundType) {
+  static <T extends @Nullable Object> GeneralRange<T> upTo(
+      Comparator<? super T> comparator, @ParametricNullness T endpoint, BoundType boundType) {
     return new GeneralRange<T>(comparator, false, null, OPEN, true, endpoint, boundType);
   }
 
@@ -80,30 +83,30 @@
    * Returns everything between the endpoints relative to the specified comparator, with the
    * specified endpoint behavior.
    */
-  static <T> GeneralRange<T> range(
+  static <T extends @Nullable Object> GeneralRange<T> range(
       Comparator<? super T> comparator,
-      @NullableDecl T lower,
+      @ParametricNullness T lower,
       BoundType lowerType,
-      @NullableDecl T upper,
+      @ParametricNullness T upper,
       BoundType upperType) {
     return new GeneralRange<T>(comparator, true, lower, lowerType, true, upper, upperType);
   }
 
   private final Comparator<? super T> comparator;
   private final boolean hasLowerBound;
-  @NullableDecl private final T lowerEndpoint;
+  @CheckForNull private final T lowerEndpoint;
   private final BoundType lowerBoundType;
   private final boolean hasUpperBound;
-  @NullableDecl private final T upperEndpoint;
+  @CheckForNull private final T upperEndpoint;
   private final BoundType upperBoundType;
 
   private GeneralRange(
       Comparator<? super T> comparator,
       boolean hasLowerBound,
-      @NullableDecl T lowerEndpoint,
+      @CheckForNull T lowerEndpoint,
       BoundType lowerBoundType,
       boolean hasUpperBound,
-      @NullableDecl T upperEndpoint,
+      @CheckForNull T upperEndpoint,
       BoundType upperBoundType) {
     this.comparator = checkNotNull(comparator);
     this.hasLowerBound = hasLowerBound;
@@ -113,14 +116,24 @@
     this.upperEndpoint = upperEndpoint;
     this.upperBoundType = checkNotNull(upperBoundType);
 
+    // Trigger any exception that the comparator would throw for the endpoints.
+    /*
+     * uncheckedCastNullableTToT is safe as long as the callers are careful to pass a "real" T
+     * whenever they pass `true` for the matching `has*Bound` parameter.
+     */
     if (hasLowerBound) {
-      comparator.compare(lowerEndpoint, lowerEndpoint);
+      comparator.compare(
+          uncheckedCastNullableTToT(lowerEndpoint), uncheckedCastNullableTToT(lowerEndpoint));
     }
     if (hasUpperBound) {
-      comparator.compare(upperEndpoint, upperEndpoint);
+      comparator.compare(
+          uncheckedCastNullableTToT(upperEndpoint), uncheckedCastNullableTToT(upperEndpoint));
     }
+
     if (hasLowerBound && hasUpperBound) {
-      int cmp = comparator.compare(lowerEndpoint, upperEndpoint);
+      int cmp =
+          comparator.compare(
+              uncheckedCastNullableTToT(lowerEndpoint), uncheckedCastNullableTToT(upperEndpoint));
       // be consistent with Range
       checkArgument(
           cmp <= 0, "lowerEndpoint (%s) > upperEndpoint (%s)", lowerEndpoint, upperEndpoint);
@@ -143,41 +156,45 @@
   }
 
   boolean isEmpty() {
-    return (hasUpperBound() && tooLow(getUpperEndpoint()))
-        || (hasLowerBound() && tooHigh(getLowerEndpoint()));
+    // The casts are safe because of the has*Bound() checks.
+    return (hasUpperBound() && tooLow(uncheckedCastNullableTToT(getUpperEndpoint())))
+        || (hasLowerBound() && tooHigh(uncheckedCastNullableTToT(getLowerEndpoint())));
   }
 
-  boolean tooLow(@NullableDecl T t) {
+  boolean tooLow(@ParametricNullness T t) {
     if (!hasLowerBound()) {
       return false;
     }
-    T lbound = getLowerEndpoint();
+    // The cast is safe because of the hasLowerBound() check.
+    T lbound = uncheckedCastNullableTToT(getLowerEndpoint());
     int cmp = comparator.compare(t, lbound);
     return cmp < 0 | (cmp == 0 & getLowerBoundType() == OPEN);
   }
 
-  boolean tooHigh(@NullableDecl T t) {
+  boolean tooHigh(@ParametricNullness T t) {
     if (!hasUpperBound()) {
       return false;
     }
-    T ubound = getUpperEndpoint();
+    // The cast is safe because of the hasUpperBound() check.
+    T ubound = uncheckedCastNullableTToT(getUpperEndpoint());
     int cmp = comparator.compare(t, ubound);
     return cmp > 0 | (cmp == 0 & getUpperBoundType() == OPEN);
   }
 
-  boolean contains(@NullableDecl T t) {
+  boolean contains(@ParametricNullness T t) {
     return !tooLow(t) && !tooHigh(t);
   }
 
   /**
    * Returns the intersection of the two ranges, or an empty range if their intersection is empty.
    */
+  @SuppressWarnings("nullness") // TODO(cpovirk): Add casts as needed. Will be noisy and annoying...
   GeneralRange<T> intersect(GeneralRange<T> other) {
     checkNotNull(other);
     checkArgument(comparator.equals(other.comparator));
 
     boolean hasLowBound = this.hasLowerBound;
-    @NullableDecl T lowEnd = getLowerEndpoint();
+    T lowEnd = getLowerEndpoint();
     BoundType lowType = getLowerBoundType();
     if (!hasLowerBound()) {
       hasLowBound = other.hasLowerBound;
@@ -192,7 +209,7 @@
     }
 
     boolean hasUpBound = this.hasUpperBound;
-    @NullableDecl T upEnd = getUpperEndpoint();
+    T upEnd = getUpperEndpoint();
     BoundType upType = getUpperBoundType();
     if (!hasUpperBound()) {
       hasUpBound = other.hasUpperBound;
@@ -220,7 +237,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj instanceof GeneralRange) {
       GeneralRange<?> r = (GeneralRange<?>) obj;
       return comparator.equals(r.comparator)
@@ -244,7 +261,7 @@
         getUpperBoundType());
   }
 
-  @NullableDecl private transient GeneralRange<T> reverse;
+  @CheckForNull private transient GeneralRange<T> reverse;
 
   /** Returns the same range relative to the reversed comparator. */
   GeneralRange<T> reverse() {
@@ -276,6 +293,7 @@
         + (upperBoundType == CLOSED ? ']' : ')');
   }
 
+  @CheckForNull
   T getLowerEndpoint() {
     return lowerEndpoint;
   }
@@ -284,6 +302,7 @@
     return lowerBoundType;
   }
 
+  @CheckForNull
   T getUpperEndpoint() {
     return upperEndpoint;
   }
diff --git a/android/guava/src/com/google/common/collect/GwtTransient.java b/android/guava/src/com/google/common/collect/GwtTransient.java
index 9c09c53..ce5ea48 100644
--- a/android/guava/src/com/google/common/collect/GwtTransient.java
+++ b/android/guava/src/com/google/common/collect/GwtTransient.java
@@ -33,4 +33,5 @@
 @GwtCompatible
 @Retention(RUNTIME)
 @Target(FIELD)
+@ElementTypesAreNonnullByDefault
 @interface GwtTransient {}
diff --git a/android/guava/src/com/google/common/collect/HashBasedTable.java b/android/guava/src/com/google/common/collect/HashBasedTable.java
index 07c144f..c8ba50f 100644
--- a/android/guava/src/com/google/common/collect/HashBasedTable.java
+++ b/android/guava/src/com/google/common/collect/HashBasedTable.java
@@ -20,11 +20,9 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Supplier;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.Serializable;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Implementation of {@link Table} using linked hash tables. This guarantees predictable iteration
@@ -49,6 +47,7 @@
  * @since 7.0
  */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 public class HashBasedTable<R, C, V> extends StandardTable<R, C, V> {
   private static class Factory<C, V> implements Supplier<Map<C, V>>, Serializable {
     final int expectedSize;
@@ -103,43 +102,5 @@
     super(backingMap, factory);
   }
 
-  // Overriding so NullPointerTester test passes.
-
-  @Override
-  public boolean contains(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
-    return super.contains(rowKey, columnKey);
-  }
-
-  @Override
-  public boolean containsColumn(@NullableDecl Object columnKey) {
-    return super.containsColumn(columnKey);
-  }
-
-  @Override
-  public boolean containsRow(@NullableDecl Object rowKey) {
-    return super.containsRow(rowKey);
-  }
-
-  @Override
-  public boolean containsValue(@NullableDecl Object value) {
-    return super.containsValue(value);
-  }
-
-  @Override
-  public V get(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
-    return super.get(rowKey, columnKey);
-  }
-
-  @Override
-  public boolean equals(@NullableDecl Object obj) {
-    return super.equals(obj);
-  }
-
-  @CanIgnoreReturnValue
-  @Override
-  public V remove(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
-    return super.remove(rowKey, columnKey);
-  }
-
   private static final long serialVersionUID = 0;
 }
diff --git a/android/guava/src/com/google/common/collect/HashBiMap.java b/android/guava/src/com/google/common/collect/HashBiMap.java
index 18951fe..010f73c 100644
--- a/android/guava/src/com/google/common/collect/HashBiMap.java
+++ b/android/guava/src/com/google/common/collect/HashBiMap.java
@@ -15,6 +15,8 @@
 package com.google.common.collect;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static com.google.common.collect.NullnessCasts.unsafeNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -34,7 +36,8 @@
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link BiMap} backed by two hash tables. This implementation allows null keys and values. A
@@ -50,10 +53,12 @@
  * @since 2.0
  */
 @GwtCompatible
-public final class HashBiMap<K, V> extends AbstractMap<K, V> implements BiMap<K, V>, Serializable {
+@ElementTypesAreNonnullByDefault
+public final class HashBiMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMap<K, V> implements BiMap<K, V>, Serializable {
 
   /** Returns a new, empty {@code HashBiMap} with the default initial capacity (16). */
-  public static <K, V> HashBiMap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashBiMap<K, V> create() {
     return create(16);
   }
 
@@ -63,7 +68,8 @@
    * @param expectedSize the expected number of entries
    * @throws IllegalArgumentException if the specified expected size is negative
    */
-  public static <K, V> HashBiMap<K, V> create(int expectedSize) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashBiMap<K, V> create(
+      int expectedSize) {
     return new HashBiMap<>(expectedSize);
   }
 
@@ -71,7 +77,8 @@
    * Constructs a new bimap containing initial values from {@code map}. The bimap is created with an
    * initial capacity sufficient to hold the mappings in the specified map.
    */
-  public static <K, V> HashBiMap<K, V> create(Map<? extends K, ? extends V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashBiMap<K, V> create(
+      Map<? extends K, ? extends V> map) {
     HashBiMap<K, V> bimap = create(map.size());
     bimap.putAll(map);
     return bimap;
@@ -81,9 +88,9 @@
   private static final int ENDPOINT = -2;
 
   /** Maps an "entry" to the key of that entry. */
-  transient K[] keys;
+  transient @Nullable K[] keys;
   /** Maps an "entry" to the value of that entry. */
-  transient V[] values;
+  transient @Nullable V[] values;
 
   transient int size;
   transient int modCount;
@@ -96,9 +103,9 @@
   /** Maps an "entry" to the "entry" that follows it in its bucket. */
   private transient int[] nextInBucketVToK;
   /** The "entry" of the first element in insertion order. */
-  @NullableDecl private transient int firstInInsertionOrder;
+  private transient int firstInInsertionOrder;
   /** The "entry" of the last element in insertion order. */
-  @NullableDecl private transient int lastInInsertionOrder;
+  private transient int lastInInsertionOrder;
   /** Maps an "entry" to the "entry" that precedes it in insertion order. */
   private transient int[] prevInInsertionOrder;
   /** Maps an "entry" to the "entry" that follows it in insertion order. */
@@ -193,19 +200,19 @@
   }
 
   /** Given a key, returns the index of the entry in the tables, or ABSENT if not found. */
-  int findEntryByKey(@NullableDecl Object key) {
+  int findEntryByKey(@CheckForNull Object key) {
     return findEntryByKey(key, Hashing.smearedHash(key));
   }
 
   /**
    * Given a key and its hash, returns the index of the entry in the tables, or ABSENT if not found.
    */
-  int findEntryByKey(@NullableDecl Object key, int keyHash) {
+  int findEntryByKey(@CheckForNull Object key, int keyHash) {
     return findEntry(key, keyHash, hashTableKToV, nextInBucketKToV, keys);
   }
 
   /** Given a value, returns the index of the entry in the tables, or ABSENT if not found. */
-  int findEntryByValue(@NullableDecl Object value) {
+  int findEntryByValue(@CheckForNull Object value) {
     return findEntryByValue(value, Hashing.smearedHash(value));
   }
 
@@ -213,12 +220,16 @@
    * Given a value and its hash, returns the index of the entry in the tables, or ABSENT if not
    * found.
    */
-  int findEntryByValue(@NullableDecl Object value, int valueHash) {
+  int findEntryByValue(@CheckForNull Object value, int valueHash) {
     return findEntry(value, valueHash, hashTableVToK, nextInBucketVToK, values);
   }
 
   int findEntry(
-      @NullableDecl Object o, int oHash, int[] hashTable, int[] nextInBucket, Object[] array) {
+      @CheckForNull Object o,
+      int oHash,
+      int[] hashTable,
+      int[] nextInBucket,
+      @Nullable Object[] array) {
     for (int entry = hashTable[bucket(oHash)]; entry != ABSENT; entry = nextInBucket[entry]) {
       if (Objects.equal(array[entry], o)) {
         return entry;
@@ -228,7 +239,7 @@
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return findEntryByKey(key) != ABSENT;
   }
 
@@ -243,31 +254,32 @@
    * @return true if a mapping exists from a key to the specified value
    */
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return findEntryByValue(value) != ABSENT;
   }
 
   @Override
-  @NullableDecl
-  public V get(@NullableDecl Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     int entry = findEntryByKey(key);
     return (entry == ABSENT) ? null : values[entry];
   }
 
-  @NullableDecl
-  K getInverse(@NullableDecl Object value) {
+  @CheckForNull
+  K getInverse(@CheckForNull Object value) {
     int entry = findEntryByValue(value);
     return (entry == ABSENT) ? null : keys[entry];
   }
 
   @Override
   @CanIgnoreReturnValue
-  public V put(@NullableDecl K key, @NullableDecl V value) {
+  @CheckForNull
+  public V put(@ParametricNullness K key, @ParametricNullness V value) {
     return put(key, value, false);
   }
 
-  @NullableDecl
-  V put(@NullableDecl K key, @NullableDecl V value, boolean force) {
+  @CheckForNull
+  V put(@ParametricNullness K key, @ParametricNullness V value, boolean force) {
     int keyHash = Hashing.smearedHash(key);
     int entryForKey = findEntryByKey(key, keyHash);
     if (entryForKey != ABSENT) {
@@ -306,13 +318,14 @@
 
   @Override
   @CanIgnoreReturnValue
-  @NullableDecl
-  public V forcePut(@NullableDecl K key, @NullableDecl V value) {
+  @CheckForNull
+  public V forcePut(@ParametricNullness K key, @ParametricNullness V value) {
     return put(key, value, true);
   }
 
-  @NullableDecl
-  K putInverse(@NullableDecl V value, @NullableDecl K key, boolean force) {
+  @CanIgnoreReturnValue
+  @CheckForNull
+  K putInverse(@ParametricNullness V value, @ParametricNullness K key, boolean force) {
     int valueHash = Hashing.smearedHash(value);
     int entryForValue = findEntryByValue(value, valueHash);
     if (entryForValue != ABSENT) {
@@ -457,7 +470,7 @@
    * Updates the specified entry to point to the new value: removes the old value from the V-to-K
    * mapping and puts the new one in. The entry does not move in the insertion order of the bimap.
    */
-  private void replaceValueInEntry(int entry, @NullableDecl V newValue, boolean force) {
+  private void replaceValueInEntry(int entry, @ParametricNullness V newValue, boolean force) {
     checkArgument(entry != ABSENT);
     int newValueHash = Hashing.smearedHash(newValue);
     int newValueIndex = findEntryByValue(newValue, newValueHash);
@@ -482,7 +495,7 @@
    * mapping and puts the new one in. The entry is moved to the end of the insertion order, or to
    * the position of the new key if it was previously present.
    */
-  private void replaceKeyInEntry(int entry, @NullableDecl K newKey, boolean force) {
+  private void replaceKeyInEntry(int entry, @ParametricNullness K newKey, boolean force) {
     checkArgument(entry != ABSENT);
     int newKeyHash = Hashing.smearedHash(newKey);
     int newKeyIndex = findEntryByKey(newKey, newKeyHash);
@@ -528,27 +541,27 @@
 
   @Override
   @CanIgnoreReturnValue
-  @NullableDecl
-  public V remove(@NullableDecl Object key) {
+  @CheckForNull
+  public V remove(@CheckForNull Object key) {
     int keyHash = Hashing.smearedHash(key);
     int entry = findEntryByKey(key, keyHash);
     if (entry == ABSENT) {
       return null;
     } else {
-      @NullableDecl V value = values[entry];
+      V value = values[entry];
       removeEntryKeyHashKnown(entry, keyHash);
       return value;
     }
   }
 
-  @NullableDecl
-  K removeInverse(@NullableDecl Object value) {
+  @CheckForNull
+  K removeInverse(@CheckForNull Object value) {
     int valueHash = Hashing.smearedHash(value);
     int entry = findEntryByValue(value, valueHash);
     if (entry == ABSENT) {
       return null;
     } else {
-      @NullableDecl K key = keys[entry];
+      K key = keys[entry];
       removeEntryValueHashKnown(entry, valueHash);
       return key;
     }
@@ -663,13 +676,16 @@
   }
 
   /** Shared supertype of keySet, values, entrySet, and inverse.entrySet. */
-  abstract static class View<K, V, T> extends AbstractSet<T> {
+  abstract static class View<
+          K extends @Nullable Object, V extends @Nullable Object, T extends @Nullable Object>
+      extends AbstractSet<T> {
     final HashBiMap<K, V> biMap;
 
     View(HashBiMap<K, V> biMap) {
       this.biMap = biMap;
     }
 
+    @ParametricNullness
     abstract T forEntry(int entry);
 
     @Override
@@ -696,6 +712,7 @@
         }
 
         @Override
+        @ParametricNullness
         public T next() {
           if (!hasNext()) {
             throw new NoSuchElementException();
@@ -746,17 +763,19 @@
     }
 
     @Override
+    @ParametricNullness
     K forEntry(int entry) {
-      return keys[entry];
+      // The cast is safe because we call forEntry only for indexes that contain entries.
+      return uncheckedCastNullableTToT(keys[entry]);
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return HashBiMap.this.containsKey(o);
     }
 
     @Override
-    public boolean remove(@NullableDecl Object o) {
+    public boolean remove(@CheckForNull Object o) {
       int oHash = Hashing.smearedHash(o);
       int entry = findEntryByKey(o, oHash);
       if (entry != ABSENT) {
@@ -782,17 +801,19 @@
     }
 
     @Override
+    @ParametricNullness
     V forEntry(int entry) {
-      return values[entry];
+      // The cast is safe because we call forEntry only for indexes that contain entries.
+      return uncheckedCastNullableTToT(values[entry]);
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return HashBiMap.this.containsValue(o);
     }
 
     @Override
-    public boolean remove(@NullableDecl Object o) {
+    public boolean remove(@CheckForNull Object o) {
       int oHash = Hashing.smearedHash(o);
       int entry = findEntryByValue(o, oHash);
       if (entry != ABSENT) {
@@ -818,11 +839,11 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Entry) {
         Entry<?, ?> e = (Entry<?, ?>) o;
-        @NullableDecl Object k = e.getKey();
-        @NullableDecl Object v = e.getValue();
+        Object k = e.getKey();
+        Object v = e.getValue();
         int eIndex = findEntryByKey(k);
         return eIndex != ABSENT && Objects.equal(v, values[eIndex]);
       }
@@ -831,11 +852,11 @@
 
     @Override
     @CanIgnoreReturnValue
-    public boolean remove(@NullableDecl Object o) {
+    public boolean remove(@CheckForNull Object o) {
       if (o instanceof Entry) {
         Entry<?, ?> e = (Entry<?, ?>) o;
-        @NullableDecl Object k = e.getKey();
-        @NullableDecl Object v = e.getValue();
+        Object k = e.getKey();
+        Object v = e.getValue();
         int kHash = Hashing.smearedHash(k);
         int eIndex = findEntryByKey(k, kHash);
         if (eIndex != ABSENT && Objects.equal(v, values[eIndex])) {
@@ -855,14 +876,17 @@
   /**
    * An {@code Entry} implementation that attempts to follow its key around the map -- that is, if
    * the key is moved, deleted, or reinserted, it will account for that -- while not doing any extra
-   * work if the key has not moved.
+   * work if the key has not moved. One quirk: The {@link #getValue()} method can return {@code
+   * null} even for a map which supposedly does not contain null elements, if the key is not present
+   * when {@code getValue()} is called.
    */
   final class EntryForKey extends AbstractMapEntry<K, V> {
-    @NullableDecl final K key;
+    @ParametricNullness final K key;
     int index;
 
     EntryForKey(int index) {
-      this.key = keys[index];
+      // The cast is safe because we call forEntry only for indexes that contain entries.
+      this.key = uncheckedCastNullableTToT(keys[index]);
       this.index = index;
     }
 
@@ -873,24 +897,43 @@
     }
 
     @Override
+    @ParametricNullness
     public K getKey() {
       return key;
     }
 
     @Override
-    @NullableDecl
+    @ParametricNullness
     public V getValue() {
       updateIndex();
-      return (index == ABSENT) ? null : values[index];
+      /*
+       * If the entry has been removed from the map, we return null, even though that might not be a
+       * valid value. That's the best we can do, short of holding a reference to the most recently
+       * seen value. And while we *could* do that, we aren't required to: Map.Entry explicitly says
+       * that behavior is undefined when the backing map is modified through another API. (It even
+       * permits us to throw IllegalStateException. Maybe we should have done that, but we probably
+       * shouldn't change now for fear of breaking people.)
+       *
+       * If the entry is still in the map, then updateIndex ensured that `index` points to the right
+       * element. Because that element is present, uncheckedCastNullableTToT is safe.
+       */
+      return (index == ABSENT) ? unsafeNull() : uncheckedCastNullableTToT(values[index]);
     }
 
     @Override
-    public V setValue(V value) {
+    @ParametricNullness
+    public V setValue(@ParametricNullness V value) {
       updateIndex();
       if (index == ABSENT) {
-        return HashBiMap.this.put(key, value);
+        HashBiMap.this.put(key, value);
+        return unsafeNull(); // See the discussion in getValue().
       }
-      V oldValue = values[index];
+      /*
+       * The cast is safe because updateIndex found the entry for this key. (If it hadn't, then we
+       * would have returned above.) Thus, we know that it and its corresponding value are in
+       * position `index`.
+       */
+      V oldValue = uncheckedCastNullableTToT(values[index]);
       if (Objects.equal(oldValue, value)) {
         return value;
       }
@@ -899,7 +942,7 @@
     }
   }
 
-  @LazyInit @RetainedWith @NullableDecl private transient BiMap<V, K> inverse;
+  @LazyInit @RetainedWith @CheckForNull private transient BiMap<V, K> inverse;
 
   @Override
   public BiMap<V, K> inverse() {
@@ -907,7 +950,8 @@
     return (result == null) ? inverse = new Inverse<K, V>(this) : result;
   }
 
-  static class Inverse<K, V> extends AbstractMap<V, K> implements BiMap<V, K>, Serializable {
+  static class Inverse<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMap<V, K> implements BiMap<V, K>, Serializable {
     private final HashBiMap<K, V> forward;
 
     Inverse(HashBiMap<K, V> forward) {
@@ -920,32 +964,32 @@
     }
 
     @Override
-    public boolean containsKey(@NullableDecl Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return forward.containsValue(key);
     }
 
     @Override
-    @NullableDecl
-    public K get(@NullableDecl Object key) {
+    @CheckForNull
+    public K get(@CheckForNull Object key) {
       return forward.getInverse(key);
     }
 
     @Override
-    public boolean containsValue(@NullableDecl Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       return forward.containsKey(value);
     }
 
     @Override
     @CanIgnoreReturnValue
-    @NullableDecl
-    public K put(@NullableDecl V value, @NullableDecl K key) {
+    @CheckForNull
+    public K put(@ParametricNullness V value, @ParametricNullness K key) {
       return forward.putInverse(value, key, false);
     }
 
     @Override
     @CanIgnoreReturnValue
-    @NullableDecl
-    public K forcePut(@NullableDecl V value, @NullableDecl K key) {
+    @CheckForNull
+    public K forcePut(@ParametricNullness V value, @ParametricNullness K key) {
       return forward.putInverse(value, key, true);
     }
 
@@ -956,8 +1000,8 @@
 
     @Override
     @CanIgnoreReturnValue
-    @NullableDecl
-    public K remove(@NullableDecl Object value) {
+    @CheckForNull
+    public K remove(@CheckForNull Object value) {
       return forward.removeInverse(value);
     }
 
@@ -991,13 +1035,14 @@
     }
   }
 
-  static class InverseEntrySet<K, V> extends View<K, V, Entry<V, K>> {
+  static class InverseEntrySet<K extends @Nullable Object, V extends @Nullable Object>
+      extends View<K, V, Entry<V, K>> {
     InverseEntrySet(HashBiMap<K, V> biMap) {
       super(biMap);
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Entry) {
         Entry<?, ?> e = (Entry<?, ?>) o;
         Object v = e.getKey();
@@ -1009,7 +1054,7 @@
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       if (o instanceof Entry) {
         Entry<?, ?> e = (Entry<?, ?>) o;
         Object v = e.getKey();
@@ -1035,14 +1080,16 @@
    * the value is moved, deleted, or reinserted, it will account for that -- while not doing any
    * extra work if the value has not moved.
    */
-  static final class EntryForValue<K, V> extends AbstractMapEntry<V, K> {
+  static final class EntryForValue<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMapEntry<V, K> {
     final HashBiMap<K, V> biMap;
-    final V value;
+    @ParametricNullness final V value;
     int index;
 
     EntryForValue(HashBiMap<K, V> biMap, int index) {
       this.biMap = biMap;
-      this.value = biMap.values[index];
+      // The cast is safe because we call forEntry only for indexes that contain entries.
+      this.value = uncheckedCastNullableTToT(biMap.values[index]);
       this.index = index;
     }
 
@@ -1053,23 +1100,28 @@
     }
 
     @Override
+    @ParametricNullness
     public V getKey() {
       return value;
     }
 
     @Override
+    @ParametricNullness
     public K getValue() {
       updateIndex();
-      return (index == ABSENT) ? null : biMap.keys[index];
+      // For discussion of unsafeNull() and uncheckedCastNullableTToT(), see EntryForKey.getValue().
+      return (index == ABSENT) ? unsafeNull() : uncheckedCastNullableTToT(biMap.keys[index]);
     }
 
     @Override
-    public K setValue(K key) {
+    @ParametricNullness
+    public K setValue(@ParametricNullness K key) {
       updateIndex();
       if (index == ABSENT) {
-        return biMap.putInverse(value, key, false);
+        biMap.putInverse(value, key, false);
+        return unsafeNull(); // see EntryForKey.setValue()
       }
-      K oldKey = biMap.keys[index];
+      K oldKey = uncheckedCastNullableTToT(biMap.keys[index]); // see EntryForKey.setValue()
       if (Objects.equal(oldKey, key)) {
         return key;
       }
diff --git a/android/guava/src/com/google/common/collect/HashMultimap.java b/android/guava/src/com/google/common/collect/HashMultimap.java
index 9297260..9e4c1c2 100644
--- a/android/guava/src/com/google/common/collect/HashMultimap.java
+++ b/android/guava/src/com/google/common/collect/HashMultimap.java
@@ -26,6 +26,7 @@
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link Multimap} using hash tables.
@@ -41,11 +42,16 @@
  * concurrent update operations, wrap your multimap with a call to {@link
  * Multimaps#synchronizedSetMultimap}.
  *
+ * <p><b>Warning:</b> Do not modify either a key <i>or a value</i> of a {@code HashMultimap} in a
+ * way that affects its {@link Object#equals} behavior. Undefined behavior and bugs will result.
+ *
  * @author Jared Levy
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public final class HashMultimap<K, V> extends HashMultimapGwtSerializationDependencies<K, V> {
+@ElementTypesAreNonnullByDefault
+public final class HashMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends HashMultimapGwtSerializationDependencies<K, V> {
   private static final int DEFAULT_VALUES_PER_KEY = 2;
 
   @VisibleForTesting transient int expectedValuesPerKey = DEFAULT_VALUES_PER_KEY;
@@ -56,7 +62,8 @@
    * <p>This method will soon be deprecated in favor of {@code
    * MultimapBuilder.hashKeys().hashSetValues().build()}.
    */
-  public static <K, V> HashMultimap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      HashMultimap<K, V> create() {
     return new HashMultimap<>();
   }
 
@@ -72,7 +79,8 @@
    * @throws IllegalArgumentException if {@code expectedKeys} or {@code expectedValuesPerKey} is
    *     negative
    */
-  public static <K, V> HashMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashMultimap<K, V> create(
+      int expectedKeys, int expectedValuesPerKey) {
     return new HashMultimap<>(expectedKeys, expectedValuesPerKey);
   }
 
@@ -86,7 +94,8 @@
    *
    * @param multimap the multimap whose contents are copied to this multimap
    */
-  public static <K, V> HashMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashMultimap<K, V> create(
+      Multimap<? extends K, ? extends V> multimap) {
     return new HashMultimap<>(multimap);
   }
 
diff --git a/android/guava/src/com/google/common/collect/HashMultiset.java b/android/guava/src/com/google/common/collect/HashMultiset.java
index a78c691..0748e68 100644
--- a/android/guava/src/com/google/common/collect/HashMultiset.java
+++ b/android/guava/src/com/google/common/collect/HashMultiset.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Multiset implementation that uses hashing for key and entry access.
@@ -27,10 +28,11 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public class HashMultiset<E> extends AbstractMapBasedMultiset<E> {
+@ElementTypesAreNonnullByDefault
+public final class HashMultiset<E extends @Nullable Object> extends AbstractMapBasedMultiset<E> {
 
   /** Creates a new, empty {@code HashMultiset} using the default initial capacity. */
-  public static <E> HashMultiset<E> create() {
+  public static <E extends @Nullable Object> HashMultiset<E> create() {
     return create(ObjectCountHashMap.DEFAULT_SIZE);
   }
 
@@ -41,7 +43,7 @@
    * @param distinctElements the expected number of distinct elements
    * @throws IllegalArgumentException if {@code distinctElements} is negative
    */
-  public static <E> HashMultiset<E> create(int distinctElements) {
+  public static <E extends @Nullable Object> HashMultiset<E> create(int distinctElements) {
     return new HashMultiset<E>(distinctElements);
   }
 
@@ -52,7 +54,8 @@
    *
    * @param elements the elements that the multiset should contain
    */
-  public static <E> HashMultiset<E> create(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> HashMultiset<E> create(
+      Iterable<? extends E> elements) {
     HashMultiset<E> multiset = create(Multisets.inferDistinctElements(elements));
     Iterables.addAll(multiset, elements);
     return multiset;
@@ -63,8 +66,8 @@
   }
 
   @Override
-  void init(int distinctElements) {
-    backingMap = new ObjectCountHashMap<>(distinctElements);
+  ObjectCountHashMap<E> newBackingMap(int distinctElements) {
+    return new ObjectCountHashMap<>(distinctElements);
   }
 
   @GwtIncompatible // Not needed in emulated source.
diff --git a/android/guava/src/com/google/common/collect/Hashing.java b/android/guava/src/com/google/common/collect/Hashing.java
index d5cab1f..81ef67e 100644
--- a/android/guava/src/com/google/common/collect/Hashing.java
+++ b/android/guava/src/com/google/common/collect/Hashing.java
@@ -18,7 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.primitives.Ints;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static methods for implementing hash-based collections.
@@ -28,6 +28,7 @@
  * @author Austin Appleby
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class Hashing {
   private Hashing() {}
 
@@ -50,7 +51,7 @@
     return (int) (C2 * Integer.rotateLeft((int) (hashCode * C1), 15));
   }
 
-  static int smearedHash(@NullableDecl Object o) {
+  static int smearedHash(@CheckForNull Object o) {
     return smear((o == null) ? 0 : o.hashCode());
   }
 
diff --git a/android/guava/src/com/google/common/collect/ImmutableAsList.java b/android/guava/src/com/google/common/collect/ImmutableAsList.java
index 528a8dc..c397479 100644
--- a/android/guava/src/com/google/common/collect/ImmutableAsList.java
+++ b/android/guava/src/com/google/common/collect/ImmutableAsList.java
@@ -21,6 +21,7 @@
 import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
+import javax.annotation.CheckForNull;
 
 /**
  * List returned by {@link ImmutableCollection#asList} that delegates {@code contains} checks to the
@@ -31,11 +32,12 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial")
+@ElementTypesAreNonnullByDefault
 abstract class ImmutableAsList<E> extends ImmutableList<E> {
   abstract ImmutableCollection<E> delegateCollection();
 
   @Override
-  public boolean contains(Object target) {
+  public boolean contains(@CheckForNull Object target) {
     // The collection's contains() is at least as fast as ImmutableList's
     // and is often faster.
     return delegateCollection().contains(target);
diff --git a/android/guava/src/com/google/common/collect/ImmutableBiMap.java b/android/guava/src/com/google/common/collect/ImmutableBiMap.java
index 691ee4f..bbae036 100644
--- a/android/guava/src/com/google/common/collect/ImmutableBiMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableBiMap.java
@@ -22,9 +22,12 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link BiMap} whose contents will never change, with many other important properties detailed
@@ -34,9 +37,14 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableBiMap<K, V> extends ImmutableMap<K, V> implements BiMap<K, V> {
 
-  /** Returns the empty bimap. */
+  /**
+   * Returns the empty bimap.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   // Casting to any type is safe because the set will never hold any elements.
   @SuppressWarnings("unchecked")
   public static <K, V> ImmutableBiMap<K, V> of() {
@@ -101,7 +109,170 @@
         new Object[] {k1, v1, k2, v2, k3, v3, k4, v4, k5, v5}, 5);
   }
 
-  // looking for of() with > 5 entries? Use the builder instead.
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are added
+   * @since 31.0
+   */
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+    checkEntryNotNull(k1, v1);
+    checkEntryNotNull(k2, v2);
+    checkEntryNotNull(k3, v3);
+    checkEntryNotNull(k4, v4);
+    checkEntryNotNull(k5, v5);
+    checkEntryNotNull(k6, v6);
+    return new RegularImmutableBiMap<K, V>(
+        new Object[] {k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6}, 6);
+  }
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are added
+   * @since 31.0
+   */
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+    checkEntryNotNull(k1, v1);
+    checkEntryNotNull(k2, v2);
+    checkEntryNotNull(k3, v3);
+    checkEntryNotNull(k4, v4);
+    checkEntryNotNull(k5, v5);
+    checkEntryNotNull(k6, v6);
+    checkEntryNotNull(k7, v7);
+    return new RegularImmutableBiMap<K, V>(
+        new Object[] {k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7}, 7);
+  }
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are added
+   * @since 31.0
+   */
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8) {
+    checkEntryNotNull(k1, v1);
+    checkEntryNotNull(k2, v2);
+    checkEntryNotNull(k3, v3);
+    checkEntryNotNull(k4, v4);
+    checkEntryNotNull(k5, v5);
+    checkEntryNotNull(k6, v6);
+    checkEntryNotNull(k7, v7);
+    checkEntryNotNull(k8, v8);
+    return new RegularImmutableBiMap<K, V>(
+        new Object[] {k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8}, 8);
+  }
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are added
+   * @since 31.0
+   */
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9) {
+    checkEntryNotNull(k1, v1);
+    checkEntryNotNull(k2, v2);
+    checkEntryNotNull(k3, v3);
+    checkEntryNotNull(k4, v4);
+    checkEntryNotNull(k5, v5);
+    checkEntryNotNull(k6, v6);
+    checkEntryNotNull(k7, v7);
+    checkEntryNotNull(k8, v8);
+    checkEntryNotNull(k9, v9);
+    return new RegularImmutableBiMap<K, V>(
+        new Object[] {k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9}, 9);
+  }
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are added
+   * @since 31.0
+   */
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9,
+      K k10,
+      V v10) {
+    checkEntryNotNull(k1, v1);
+    checkEntryNotNull(k2, v2);
+    checkEntryNotNull(k3, v3);
+    checkEntryNotNull(k4, v4);
+    checkEntryNotNull(k5, v5);
+    checkEntryNotNull(k6, v6);
+    checkEntryNotNull(k7, v7);
+    checkEntryNotNull(k8, v8);
+    checkEntryNotNull(k9, v9);
+    checkEntryNotNull(k10, v10);
+    return new RegularImmutableBiMap<K, V>(
+        new Object[] {
+          k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10
+        },
+        10);
+  }
+
+  // looking for of() with > 10 entries? Use the builder or ofEntries instead.
+
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are provided
+   * @since 31.0
+   */
+  @SafeVarargs
+  public static <K, V> ImmutableBiMap<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) {
+    @SuppressWarnings("unchecked") // we will only ever read these
+    Entry<K, V>[] entries2 = (Entry<K, V>[]) entries;
+    return copyOf(Arrays.asList(entries2));
+  }
 
   /**
    * Returns a new builder. The generated builder is equivalent to the builder created by the {@link
@@ -139,7 +310,7 @@
    *         .put("one", 1)
    *         .put("two", 2)
    *         .put("three", 3)
-   *         .build();
+   *         .buildOrThrow();
    * }</pre>
    *
    * <p>For <i>small</i> immutable bimaps, the {@code ImmutableBiMap.of()} methods are even more
@@ -152,8 +323,8 @@
    * want a different order, consider using {@link #orderEntriesByValue(Comparator)}, which changes
    * this builder to sort entries by value.
    *
-   * <p>Builder instances can be reused - it is safe to call {@link #build} multiple times to build
-   * multiple bimaps in series. Each bimap is a superset of the bimaps created before it.
+   * <p>Builder instances can be reused - it is safe to call {@link #buildOrThrow} multiple times to
+   * build multiple bimaps in series. Each bimap is a superset of the bimaps created before it.
    *
    * @since 2.0
    */
@@ -240,15 +411,40 @@
       return this;
     }
 
+    @Override
+    @CanIgnoreReturnValue
+    Builder<K, V> combine(ImmutableMap.Builder<K, V> builder) {
+      super.combine(builder);
+      return this;
+    }
+
     /**
      * Returns a newly-created immutable bimap. The iteration order of the returned bimap is the
      * order in which entries were inserted into the builder, unless {@link #orderEntriesByValue}
      * was called, in which case entries are sorted by value.
      *
+     * <p>Prefer the equivalent method {@link #buildOrThrow()} to make it explicit that the method
+     * will throw an exception if there are duplicate keys or values. The {@code build()} method
+     * will soon be deprecated.
+     *
      * @throws IllegalArgumentException if duplicate keys or values were added
      */
     @Override
     public ImmutableBiMap<K, V> build() {
+      return buildOrThrow();
+    }
+
+    /**
+     * Returns a newly-created immutable bimap, or throws an exception if any key or value was added
+     * more than once. The iteration order of the returned bimap is the order in which entries were
+     * inserted into the builder, unless {@link #orderEntriesByValue} was called, in which case
+     * entries are sorted by value.
+     *
+     * @throws IllegalArgumentException if duplicate keys or values were added
+     * @since 31.0
+     */
+    @Override
+    public ImmutableBiMap<K, V> buildOrThrow() {
       if (size == 0) {
         return of();
       }
@@ -339,7 +535,9 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public V forcePut(K key, V value) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
+  public final V forcePut(K key, V value) {
     throw new UnsupportedOperationException();
   }
 
diff --git a/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java b/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
index 4836384..aeabe5d 100644
--- a/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
@@ -21,10 +21,11 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.primitives.Primitives;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.Immutable;
 import java.io.Serializable;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link ClassToInstanceMap} whose contents will never change, with many other important
@@ -35,6 +36,7 @@
  */
 @Immutable(containerOf = "B")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ImmutableClassToInstanceMap<B> extends ForwardingMap<Class<? extends B>, B>
     implements ClassToInstanceMap<B>, Serializable {
 
@@ -44,6 +46,8 @@
   /**
    * Returns an empty {@code ImmutableClassToInstanceMap}.
    *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   *
    * @since 19.0
    */
   @SuppressWarnings("unchecked")
@@ -170,7 +174,7 @@
 
   @Override
   @SuppressWarnings("unchecked") // value could not get in if not a T
-  @NullableDecl
+  @CheckForNull
   public <T extends B> T getInstance(Class<T> type) {
     return (T) delegate.get(checkNotNull(type));
   }
@@ -184,6 +188,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public <T extends B> T putInstance(Class<T> type, T value) {
     throw new UnsupportedOperationException();
   }
diff --git a/android/guava/src/com/google/common/collect/ImmutableCollection.java b/android/guava/src/com/google/common/collect/ImmutableCollection.java
index 31528d7..b5ac2a1 100644
--- a/android/guava/src/com/google/common/collect/ImmutableCollection.java
+++ b/android/guava/src/com/google/common/collect/ImmutableCollection.java
@@ -22,6 +22,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
 import java.util.AbstractCollection;
@@ -31,7 +32,8 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Collection} whose contents will never change, and which offers a few additional
@@ -161,6 +163,7 @@
 @DoNotMock("Use ImmutableList.of or another implementation")
 @GwtCompatible(emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 // TODO(kevinb): I think we should push everything down to "BaseImmutableCollection" or something,
 // just to do everything we can to emphasize the "practically an interface" nature of this class.
 public abstract class ImmutableCollection<E> extends AbstractCollection<E> implements Serializable {
@@ -180,7 +183,20 @@
 
   @CanIgnoreReturnValue
   @Override
-  public final <T> T[] toArray(T[] other) {
+  /*
+   * This suppression is here for two reasons:
+   *
+   * 1. b/192354773 in our checker affects toArray declarations.
+   *
+   * 2. `other[size] = null` is unsound. We could "fix" this by requiring callers to pass in an
+   * array with a nullable element type. But probably they usually want an array with a non-nullable
+   * type. That said, we could *accept* a `@Nullable T[]` (which, given that we treat arrays as
+   * covariant, would still permit a plain `T[]`) and return a plain `T[]`. But of course that would
+   * require its own suppression, since it is also unsound. toArray(T[]) is just a mess from a
+   * nullness perspective. The signature below at least has the virtue of being relatively simple.
+   */
+  @SuppressWarnings("nullness")
+  public final <T extends @Nullable Object> T[] toArray(T[] other) {
     checkNotNull(other);
     int size = size();
 
@@ -198,7 +214,8 @@
   }
 
   /** If this collection is backed by an array of its elements in insertion order, returns it. */
-  @NullableDecl
+  @CheckForNull
+  @Nullable
   Object[] internalArray() {
     return null;
   }
@@ -220,7 +237,7 @@
   }
 
   @Override
-  public abstract boolean contains(@NullableDecl Object object);
+  public abstract boolean contains(@CheckForNull Object object);
 
   /**
    * Guaranteed to throw an exception and leave the collection unmodified.
@@ -231,6 +248,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean add(E e) {
     throw new UnsupportedOperationException();
   }
@@ -244,7 +262,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public final boolean remove(Object object) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final boolean remove(@CheckForNull Object object) {
     throw new UnsupportedOperationException();
   }
 
@@ -257,6 +276,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean addAll(Collection<? extends E> newElements) {
     throw new UnsupportedOperationException();
   }
@@ -270,6 +290,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean removeAll(Collection<?> oldElements) {
     throw new UnsupportedOperationException();
   }
@@ -283,6 +304,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean retainAll(Collection<?> elementsToKeep) {
     throw new UnsupportedOperationException();
   }
@@ -295,6 +317,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void clear() {
     throw new UnsupportedOperationException();
   }
@@ -326,7 +349,7 @@
    * offset. Returns {@code offset + size()}.
    */
   @CanIgnoreReturnValue
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     for (E e : this) {
       dst[offset++] = e;
     }
@@ -442,13 +465,14 @@
   }
 
   abstract static class ArrayBasedBuilder<E> extends ImmutableCollection.Builder<E> {
-    Object[] contents;
+    // The first `size` elements are non-null.
+    @Nullable Object[] contents;
     int size;
     boolean forceCopy;
 
     ArrayBasedBuilder(int initialCapacity) {
       checkNonnegative(initialCapacity, "initialCapacity");
-      this.contents = new Object[initialCapacity];
+      this.contents = new @Nullable Object[initialCapacity];
       this.size = 0;
     }
 
@@ -480,13 +504,25 @@
     @CanIgnoreReturnValue
     @Override
     public Builder<E> add(E... elements) {
-      checkElementsNotNull(elements);
-      getReadyToExpandTo(size + elements.length);
-      System.arraycopy(elements, 0, contents, size, elements.length);
-      size += elements.length;
+      addAll(elements, elements.length);
       return this;
     }
 
+    final void addAll(@Nullable Object[] elements, int n) {
+      checkElementsNotNull(elements, n);
+      getReadyToExpandTo(size + n);
+      /*
+       * The following call is not statically checked, since arraycopy accepts plain Object for its
+       * parameters. If it were statically checked, the checker would still be OK with it, since
+       * we're copying into a `contents` array whose type allows it to contain nulls. Still, it's
+       * worth noting that we promise not to put nulls into the array in the first `size` elements.
+       * We uphold that promise here because our callers promise that `elements` will not contain
+       * nulls in its first `n` elements.
+       */
+      System.arraycopy(elements, 0, contents, size, n);
+      size += n;
+    }
+
     @CanIgnoreReturnValue
     @Override
     public Builder<E> addAll(Iterable<? extends E> elements) {
diff --git a/android/guava/src/com/google/common/collect/ImmutableEntry.java b/android/guava/src/com/google/common/collect/ImmutableEntry.java
index cc869b3..edc25f4 100644
--- a/android/guava/src/com/google/common/collect/ImmutableEntry.java
+++ b/android/guava/src/com/google/common/collect/ImmutableEntry.java
@@ -18,33 +18,36 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** @see com.google.common.collect.Maps#immutableEntry(Object, Object) */
 @GwtCompatible(serializable = true)
-class ImmutableEntry<K, V> extends AbstractMapEntry<K, V> implements Serializable {
-  @NullableDecl final K key;
-  @NullableDecl final V value;
+@ElementTypesAreNonnullByDefault
+class ImmutableEntry<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMapEntry<K, V> implements Serializable {
+  @ParametricNullness final K key;
+  @ParametricNullness final V value;
 
-  ImmutableEntry(@NullableDecl K key, @NullableDecl V value) {
+  ImmutableEntry(@ParametricNullness K key, @ParametricNullness V value) {
     this.key = key;
     this.value = value;
   }
 
   @Override
-  @NullableDecl
+  @ParametricNullness
   public final K getKey() {
     return key;
   }
 
   @Override
-  @NullableDecl
+  @ParametricNullness
   public final V getValue() {
     return value;
   }
 
   @Override
-  public final V setValue(V value) {
+  @ParametricNullness
+  public final V setValue(@ParametricNullness V value) {
     throw new UnsupportedOperationException();
   }
 
diff --git a/android/guava/src/com/google/common/collect/ImmutableEnumMap.java b/android/guava/src/com/google/common/collect/ImmutableEnumMap.java
index beab47a..66680f0 100644
--- a/android/guava/src/com/google/common/collect/ImmutableEnumMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableEnumMap.java
@@ -22,7 +22,7 @@
 import com.google.common.collect.ImmutableMap.IteratorBasedImmutableMap;
 import java.io.Serializable;
 import java.util.EnumMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@link ImmutableMap} backed by a non-empty {@link java.util.EnumMap}.
@@ -31,6 +31,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 final class ImmutableEnumMap<K extends Enum<K>, V> extends IteratorBasedImmutableMap<K, V> {
   static <K extends Enum<K>, V> ImmutableMap<K, V> asImmutable(EnumMap<K, V> map) {
     switch (map.size()) {
@@ -62,17 +63,18 @@
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return delegate.containsKey(key);
   }
 
   @Override
-  public V get(Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     return delegate.get(key);
   }
 
   @Override
-  public boolean equals(Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/collect/ImmutableEnumSet.java b/android/guava/src/com/google/common/collect/ImmutableEnumSet.java
index 4e189ff..90787e5 100644
--- a/android/guava/src/com/google/common/collect/ImmutableEnumSet.java
+++ b/android/guava/src/com/google/common/collect/ImmutableEnumSet.java
@@ -21,6 +21,7 @@
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.EnumSet;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@link ImmutableSet} backed by a non-empty {@link java.util.EnumSet}.
@@ -29,6 +30,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 final class ImmutableEnumSet<E extends Enum<E>> extends ImmutableSet<E> {
   @SuppressWarnings("rawtypes") // necessary to compile against Java 8
   static ImmutableSet asImmutable(EnumSet set) {
@@ -72,7 +74,7 @@
   }
 
   @Override
-  public boolean contains(Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return delegate.contains(object);
   }
 
@@ -90,7 +92,7 @@
   }
 
   @Override
-  public boolean equals(Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/collect/ImmutableList.java b/android/guava/src/com/google/common/collect/ImmutableList.java
index d86fe4f..6ebd733 100644
--- a/android/guava/src/com/google/common/collect/ImmutableList.java
+++ b/android/guava/src/com/google/common/collect/ImmutableList.java
@@ -28,6 +28,8 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
+import com.google.errorprone.annotations.InlineMe;
 import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
@@ -38,7 +40,8 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link List} whose contents will never change, with many other important properties detailed at
@@ -54,12 +57,15 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableList<E> extends ImmutableCollection<E>
     implements List<E>, RandomAccess {
   /**
    * Returns the empty immutable list. This list behaves and performs comparably to {@link
    * Collections#emptyList}, and is preferable mainly for consistency and maintainability of your
    * code.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
    */
   // Casting to any type is safe because the list will never hold any elements.
   @SuppressWarnings("unchecked")
@@ -336,7 +342,7 @@
   }
 
   /** Views the array as an immutable list. Does not check for nulls. */
-  static <E> ImmutableList<E> asImmutableList(Object[] elements, int length) {
+  static <E> ImmutableList<E> asImmutableList(@Nullable Object[] elements, int length) {
     if (length == 0) {
       return of();
     }
@@ -387,17 +393,17 @@
   }
 
   @Override
-  public int indexOf(@NullableDecl Object object) {
+  public int indexOf(@CheckForNull Object object) {
     return (object == null) ? -1 : Lists.indexOfImpl(this, object);
   }
 
   @Override
-  public int lastIndexOf(@NullableDecl Object object) {
+  public int lastIndexOf(@CheckForNull Object object) {
     return (object == null) ? -1 : Lists.lastIndexOfImpl(this, object);
   }
 
   @Override
-  public boolean contains(@NullableDecl Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return indexOf(object) >= 0;
   }
 
@@ -444,6 +450,8 @@
     }
 
     @Override
+    @CheckForNull
+    @Nullable
     Object[] internalArray() {
       return ImmutableList.this.internalArray();
     }
@@ -485,6 +493,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean addAll(int index, Collection<? extends E> newElements) {
     throw new UnsupportedOperationException();
   }
@@ -498,6 +507,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final E set(int index, E element) {
     throw new UnsupportedOperationException();
   }
@@ -510,6 +520,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void add(int index, E element) {
     throw new UnsupportedOperationException();
   }
@@ -523,6 +534,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final E remove(int index) {
     throw new UnsupportedOperationException();
   }
@@ -531,14 +543,17 @@
    * Returns this list instance.
    *
    * @since 2.0
+   * @deprecated There is no reason to use this; it always returns {@code this}.
    */
+  @InlineMe(replacement = "this")
+  @Deprecated
   @Override
   public final ImmutableList<E> asList() {
     return this;
   }
 
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     // this loop is faster for RandomAccess instances, which ImmutableLists are
     int size = size();
     for (int i = 0; i < size; i++) {
@@ -579,18 +594,18 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object object) {
+    public boolean contains(@CheckForNull Object object) {
       return forwardList.contains(object);
     }
 
     @Override
-    public int indexOf(@NullableDecl Object object) {
+    public int indexOf(@CheckForNull Object object) {
       int index = forwardList.lastIndexOf(object);
       return (index >= 0) ? reverseIndex(index) : -1;
     }
 
     @Override
-    public int lastIndexOf(@NullableDecl Object object) {
+    public int lastIndexOf(@CheckForNull Object object) {
       int index = forwardList.indexOf(object);
       return (index >= 0) ? reverseIndex(index) : -1;
     }
@@ -619,7 +634,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     return Lists.equalsImpl(this, obj);
   }
 
@@ -778,6 +793,12 @@
       return this;
     }
 
+    @CanIgnoreReturnValue
+    Builder<E> combine(Builder<E> other) {
+      addAll(other.contents, other.size);
+      return this;
+    }
+
     /**
      * Returns a newly-created {@code ImmutableList} based on the contents of the {@code Builder}.
      */
diff --git a/android/guava/src/com/google/common/collect/ImmutableListMultimap.java b/android/guava/src/com/google/common/collect/ImmutableListMultimap.java
index 7893a74..cc0a910 100644
--- a/android/guava/src/com/google/common/collect/ImmutableListMultimap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableListMultimap.java
@@ -20,6 +20,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import java.io.IOException;
@@ -30,7 +31,8 @@
 import java.util.Comparator;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link ListMultimap} whose contents will never change, with many other important properties
@@ -43,10 +45,15 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
+@ElementTypesAreNonnullByDefault
 public class ImmutableListMultimap<K, V> extends ImmutableMultimap<K, V>
     implements ListMultimap<K, V> {
 
-  /** Returns the empty multimap. */
+  /**
+   * Returns the empty multimap.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   // Casting is safe because the multimap will never hold any elements.
   @SuppressWarnings("unchecked")
   public static <K, V> ImmutableListMultimap<K, V> of() {
@@ -213,6 +220,13 @@
       return this;
     }
 
+    @CanIgnoreReturnValue
+    @Override
+    Builder<K, V> combine(ImmutableMultimap.Builder<K, V> other) {
+      super.combine(other);
+      return this;
+    }
+
     /** Returns a newly-created immutable list multimap. */
     @Override
     public ImmutableListMultimap<K, V> build() {
@@ -266,7 +280,7 @@
   /** Creates an ImmutableListMultimap from an asMap.entrySet. */
   static <K, V> ImmutableListMultimap<K, V> fromMapEntries(
       Collection<? extends Map.Entry<? extends K, ? extends Collection<? extends V>>> mapEntries,
-      @NullableDecl Comparator<? super V> valueComparator) {
+      @Nullable Comparator<? super V> valueComparator) {
     if (mapEntries.isEmpty()) {
       return of();
     }
@@ -302,13 +316,13 @@
    * parameters used to build this multimap.
    */
   @Override
-  public ImmutableList<V> get(@NullableDecl K key) {
+  public ImmutableList<V> get(K key) {
     // This cast is safe as its type is known in constructor.
     ImmutableList<V> list = (ImmutableList<V>) map.get(key);
     return (list == null) ? ImmutableList.<V>of() : list;
   }
 
-  @LazyInit @RetainedWith private transient ImmutableListMultimap<V, K> inverse;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableListMultimap<V, K> inverse;
 
   /**
    * {@inheritDoc}
@@ -344,7 +358,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public ImmutableList<V> removeAll(Object key) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final ImmutableList<V> removeAll(@CheckForNull Object key) {
     throw new UnsupportedOperationException();
   }
 
@@ -357,7 +372,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public ImmutableList<V> replaceValues(K key, Iterable<? extends V> values) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final ImmutableList<V> replaceValues(K key, Iterable<? extends V> values) {
     throw new UnsupportedOperationException();
   }
 
diff --git a/android/guava/src/com/google/common/collect/ImmutableMap.java b/android/guava/src/com/google/common/collect/ImmutableMap.java
index 4464137..fd87e0b 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMap.java
@@ -20,10 +20,12 @@
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.DoNotMock;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
@@ -38,7 +40,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.SortedMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Map} whose contents will never change, with many other important properties detailed at
@@ -54,12 +57,15 @@
 @DoNotMock("Use ImmutableMap.of or another implementation")
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableMap<K, V> implements Map<K, V>, Serializable {
 
   /**
    * Returns the empty map. This map behaves and performs comparably to {@link
    * Collections#emptyMap}, and is preferable mainly for consistency and maintainability of your
    * code.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
    */
   @SuppressWarnings("unchecked")
   public static <K, V> ImmutableMap<K, V> of() {
@@ -127,7 +133,170 @@
     return RegularImmutableMap.create(5, new Object[] {k1, v1, k2, v2, k3, v3, k4, v4, k5, v5});
   }
 
-  // looking for of() with > 5 entries? Use the builder instead.
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+    checkEntryNotNull(k1, v1);
+    checkEntryNotNull(k2, v2);
+    checkEntryNotNull(k3, v3);
+    checkEntryNotNull(k4, v4);
+    checkEntryNotNull(k5, v5);
+    checkEntryNotNull(k6, v6);
+    return RegularImmutableMap.create(
+        6, new Object[] {k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6});
+  }
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+    checkEntryNotNull(k1, v1);
+    checkEntryNotNull(k2, v2);
+    checkEntryNotNull(k3, v3);
+    checkEntryNotNull(k4, v4);
+    checkEntryNotNull(k5, v5);
+    checkEntryNotNull(k6, v6);
+    checkEntryNotNull(k7, v7);
+    return RegularImmutableMap.create(
+        7, new Object[] {k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7});
+  }
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8) {
+    checkEntryNotNull(k1, v1);
+    checkEntryNotNull(k2, v2);
+    checkEntryNotNull(k3, v3);
+    checkEntryNotNull(k4, v4);
+    checkEntryNotNull(k5, v5);
+    checkEntryNotNull(k6, v6);
+    checkEntryNotNull(k7, v7);
+    checkEntryNotNull(k8, v8);
+    return RegularImmutableMap.create(
+        8, new Object[] {k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8});
+  }
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9) {
+    checkEntryNotNull(k1, v1);
+    checkEntryNotNull(k2, v2);
+    checkEntryNotNull(k3, v3);
+    checkEntryNotNull(k4, v4);
+    checkEntryNotNull(k5, v5);
+    checkEntryNotNull(k6, v6);
+    checkEntryNotNull(k7, v7);
+    checkEntryNotNull(k8, v8);
+    checkEntryNotNull(k9, v9);
+    return RegularImmutableMap.create(
+        9, new Object[] {k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9});
+  }
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9,
+      K k10,
+      V v10) {
+    checkEntryNotNull(k1, v1);
+    checkEntryNotNull(k2, v2);
+    checkEntryNotNull(k3, v3);
+    checkEntryNotNull(k4, v4);
+    checkEntryNotNull(k5, v5);
+    checkEntryNotNull(k6, v6);
+    checkEntryNotNull(k7, v7);
+    checkEntryNotNull(k8, v8);
+    checkEntryNotNull(k9, v9);
+    checkEntryNotNull(k10, v10);
+    return RegularImmutableMap.create(
+        10,
+        new Object[] {
+          k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10
+        });
+  }
+
+  // looking for of() with > 10 entries? Use the builder or ofEntries instead.
+
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  @SafeVarargs
+  public static <K, V> ImmutableMap<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) {
+    @SuppressWarnings("unchecked") // we will only ever read these
+    Entry<K, V>[] entries2 = (Entry<K, V>[]) entries;
+    return copyOf(Arrays.asList(entries2));
+  }
 
   /**
    * Verifies that {@code key} and {@code value} are non-null, and returns a new immutable entry
@@ -190,7 +359,7 @@
    *         .put("one", 1)
    *         .put("two", 2)
    *         .put("three", 3)
-   *         .build();
+   *         .buildOrThrow();
    * }</pre>
    *
    * <p>For <i>small</i> immutable maps, the {@code ImmutableMap.of()} methods are even more
@@ -204,15 +373,15 @@
    * sort by keys, or call {@link #orderEntriesByValue(Comparator)}, which changes this builder to
    * sort entries by value.
    *
-   * <p>Builder instances can be reused - it is safe to call {@link #build} multiple times to build
-   * multiple maps in series. Each map is a superset of the maps created before it.
+   * <p>Builder instances can be reused - it is safe to call {@link #buildOrThrow} multiple times to
+   * build multiple maps in series. Each map is a superset of the maps created before it.
    *
    * @since 2.0
    */
   @DoNotMock
   public static class Builder<K, V> {
-    @NullableDecl Comparator<? super V> valueComparator;
-    Object[] alternatingKeysAndValues;
+    @CheckForNull Comparator<? super V> valueComparator;
+    @Nullable Object[] alternatingKeysAndValues;
     int size;
     boolean entriesUsed;
 
@@ -224,9 +393,9 @@
       this(ImmutableCollection.Builder.DEFAULT_INITIAL_CAPACITY);
     }
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings({"unchecked", "rawtypes"})
     Builder(int initialCapacity) {
-      this.alternatingKeysAndValues = new Object[2 * initialCapacity];
+      this.alternatingKeysAndValues = new @Nullable Object[2 * initialCapacity];
       this.size = 0;
       this.entriesUsed = false;
     }
@@ -315,6 +484,20 @@
       return this;
     }
 
+    @CanIgnoreReturnValue
+    Builder<K, V> combine(Builder<K, V> other) {
+      checkNotNull(other);
+      ensureCapacity(this.size + other.size);
+      System.arraycopy(
+          other.alternatingKeysAndValues,
+          0,
+          this.alternatingKeysAndValues,
+          this.size * 2,
+          other.size * 2);
+      this.size += other.size;
+      return this;
+    }
+
     /*
      * TODO(kevinb): Should build() and the ImmutableBiMap & ImmutableSortedMap
      * versions throw an IllegalStateException instead?
@@ -325,10 +508,27 @@
      * in which entries were inserted into the builder, unless {@link #orderEntriesByValue} was
      * called, in which case entries are sorted by value.
      *
+     * <p>Prefer the equivalent method {@link #buildOrThrow()} to make it explicit that the method
+     * will throw an exception if there are duplicate keys. The {@code build()} method will soon be
+     * deprecated.
+     *
      * @throws IllegalArgumentException if duplicate keys were added
      */
-    @SuppressWarnings("unchecked")
     public ImmutableMap<K, V> build() {
+      return buildOrThrow();
+    }
+
+    /**
+     * Returns a newly-created immutable map, or throws an exception if any key was added more than
+     * once. The iteration order of the returned map is the order in which entries were inserted
+     * into the builder, unless {@link #orderEntriesByValue} was called, in which case entries are
+     * sorted by value.
+     *
+     * @throws IllegalArgumentException if duplicate keys were added
+     * @since 31.0
+     */
+    @SuppressWarnings("unchecked")
+    public ImmutableMap<K, V> buildOrThrow() {
       /*
        * If entries is full, then this implementation may end up using the entries array
        * directly and writing over the entry objects with non-terminal entries, but this is
@@ -348,9 +548,11 @@
         }
         Entry<K, V>[] entries = new Entry[size];
         for (int i = 0; i < size; i++) {
+          // requireNonNull is safe because the first `2*size` elements have been filled in.
           entries[i] =
               new AbstractMap.SimpleImmutableEntry<K, V>(
-                  (K) alternatingKeysAndValues[2 * i], (V) alternatingKeysAndValues[2 * i + 1]);
+                  (K) requireNonNull(alternatingKeysAndValues[2 * i]),
+                  (V) requireNonNull(alternatingKeysAndValues[2 * i + 1]));
         }
         Arrays.sort(
             entries, 0, size, Ordering.from(valueComparator).onResultOf(Maps.<V>valueFunction()));
@@ -448,6 +650,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final V put(K k, V v) {
     throw new UnsupportedOperationException();
   }
@@ -461,7 +665,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public final V remove(Object o) {
+  @CheckForNull
+  public final V remove(@CheckForNull Object o) {
     throw new UnsupportedOperationException();
   }
 
@@ -473,6 +678,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void putAll(Map<? extends K, ? extends V> map) {
     throw new UnsupportedOperationException();
   }
@@ -485,6 +691,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void clear() {
     throw new UnsupportedOperationException();
   }
@@ -495,18 +702,19 @@
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return get(key) != null;
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return values().contains(value);
   }
 
   // Overriding to mark it Nullable
   @Override
-  public abstract V get(@NullableDecl Object key);
+  @CheckForNull
+  public abstract V get(@CheckForNull Object key);
 
   /**
    * {@inheritDoc}
@@ -520,12 +728,18 @@
    *     Note that API Level 24 users can call this method with any version of Guava.
    */
   // @Override under Java 8 / API Level 24
-  public final V getOrDefault(@NullableDecl Object key, @NullableDecl V defaultValue) {
+  @CheckForNull
+  public final V getOrDefault(@CheckForNull Object key, @CheckForNull V defaultValue) {
     V result = get(key);
-    return (result != null) ? result : defaultValue;
+    // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+    if (result != null) {
+      return result;
+    } else {
+      return defaultValue;
+    }
   }
 
-  @LazyInit @RetainedWith private transient ImmutableSet<Entry<K, V>> entrySet;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableSet<Entry<K, V>> entrySet;
 
   /**
    * Returns an immutable set of the mappings in this map. The iteration order is specified by the
@@ -539,7 +753,7 @@
 
   abstract ImmutableSet<Entry<K, V>> createEntrySet();
 
-  @LazyInit @RetainedWith private transient ImmutableSet<K> keySet;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableSet<K> keySet;
 
   /**
    * Returns an immutable set of the keys in this map, in the same order that they appear in {@link
@@ -573,7 +787,7 @@
     };
   }
 
-  @LazyInit @RetainedWith private transient ImmutableCollection<V> values;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableCollection<V> values;
 
   /**
    * Returns an immutable collection of the values in this map, in the same order that they appear
@@ -593,7 +807,7 @@
   abstract ImmutableCollection<V> createValues();
 
   // cached so that this.multimapView().inverse() only computes inverse once
-  @LazyInit private transient ImmutableSetMultimap<K, V> multimapView;
+  @LazyInit @CheckForNull private transient ImmutableSetMultimap<K, V> multimapView;
 
   /**
    * Returns a multimap view of the map.
@@ -626,12 +840,13 @@
     }
 
     @Override
-    public boolean containsKey(@NullableDecl Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return ImmutableMap.this.containsKey(key);
     }
 
     @Override
-    public ImmutableSet<V> get(@NullableDecl Object key) {
+    @CheckForNull
+    public ImmutableSet<V> get(@CheckForNull Object key) {
       V outerValue = ImmutableMap.this.get(key);
       return (outerValue == null) ? null : ImmutableSet.of(outerValue);
     }
@@ -681,7 +896,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return Maps.equalsImpl(this, object);
   }
 
@@ -722,7 +937,8 @@
         Object[] keys = new Object[map.size()];
         Object[] values = new Object[map.size()];
         int i = 0;
-        for (Entry<?, ?> entry : map.entrySet()) {
+        // "extends Object" works around https://github.com/typetools/checker-framework/issues/3013
+        for (Entry<? extends Object, ? extends Object> entry : map.entrySet()) {
           keys[i] = entry.getKey();
           values[i] = entry.getValue();
           i++;
diff --git a/android/guava/src/com/google/common/collect/ImmutableMapEntrySet.java b/android/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
index 72fc5cf..7ae6422 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
@@ -20,7 +20,8 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.io.Serializable;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * {@code entrySet()} implementation for {@link ImmutableMap}.
@@ -29,6 +30,7 @@
  * @author Kevin Bourrillion
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ImmutableMapEntrySet<K, V> extends ImmutableSet<Entry<K, V>> {
   static final class RegularEntrySet<K, V> extends ImmutableMapEntrySet<K, V> {
     private final transient ImmutableMap<K, V> map;
@@ -50,7 +52,7 @@
 
     @Override
     @GwtIncompatible("not used in GWT")
-    int copyIntoArray(Object[] dst, int offset) {
+    int copyIntoArray(@Nullable Object[] dst, int offset) {
       return entries.copyIntoArray(dst, offset);
     }
 
@@ -75,7 +77,7 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object object) {
+  public boolean contains(@CheckForNull Object object) {
     if (object instanceof Entry) {
       Entry<?, ?> entry = (Entry<?, ?>) object;
       V value = map().get(entry.getKey());
diff --git a/android/guava/src/com/google/common/collect/ImmutableMapKeySet.java b/android/guava/src/com/google/common/collect/ImmutableMapKeySet.java
index 77babc2..9bd1d43 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMapKeySet.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMapKeySet.java
@@ -19,7 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * {@code keySet()} implementation for {@link ImmutableMap}.
@@ -28,6 +28,7 @@
  * @author Kevin Bourrillion
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class ImmutableMapKeySet<K, V> extends IndexedImmutableSet<K> {
   private final ImmutableMap<K, V> map;
 
@@ -46,7 +47,7 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return map.containsKey(object);
   }
 
diff --git a/android/guava/src/com/google/common/collect/ImmutableMapValues.java b/android/guava/src/com/google/common/collect/ImmutableMapValues.java
index 4a0e396..8b7284d 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMapValues.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMapValues.java
@@ -20,7 +20,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.io.Serializable;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * {@code values()} implementation for {@link ImmutableMap}.
@@ -29,6 +29,7 @@
  * @author Kevin Bourrillion
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class ImmutableMapValues<K, V> extends ImmutableCollection<V> {
   private final ImmutableMap<K, V> map;
 
@@ -59,7 +60,7 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return object != null && Iterators.contains(iterator(), object);
   }
 
diff --git a/android/guava/src/com/google/common/collect/ImmutableMultimap.java b/android/guava/src/com/google/common/collect/ImmutableMultimap.java
index 9234b1c..04a6c4a 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMultimap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMultimap.java
@@ -18,11 +18,14 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
+import static com.google.common.collect.Maps.immutableEntry;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.DoNotMock;
 import com.google.j2objc.annotations.Weak;
 import com.google.j2objc.annotations.WeakOuter;
@@ -35,7 +38,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Multimap} whose contents will never change, with many other important properties
@@ -64,10 +68,15 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableMultimap<K, V> extends BaseImmutableMultimap<K, V>
     implements Serializable {
 
-  /** Returns an empty multimap. */
+  /**
+   * Returns an empty multimap.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   public static <K, V> ImmutableMultimap<K, V> of() {
     return ImmutableListMultimap.of();
   }
@@ -138,9 +147,9 @@
    */
   @DoNotMock
   public static class Builder<K, V> {
-    Map<K, Collection<V>> builderMap;
-    @NullableDecl Comparator<? super K> keyComparator;
-    @NullableDecl Comparator<? super V> valueComparator;
+    final Map<K, Collection<V>> builderMap;
+    @CheckForNull Comparator<? super K> keyComparator;
+    @CheckForNull Comparator<? super V> valueComparator;
 
     /**
      * Creates a new builder. The returned builder is equivalent to the builder generated by {@link
@@ -356,7 +365,11 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public ImmutableCollection<V> removeAll(Object key) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  // DoNotCall wants this to be final, but we want to override it to return more specific types.
+  // Inheritance is closed, and all subtypes are @DoNotCall, so this is safe to suppress.
+  @SuppressWarnings("DoNotCall")
+  public ImmutableCollection<V> removeAll(@CheckForNull Object key) {
     throw new UnsupportedOperationException();
   }
 
@@ -369,6 +382,10 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  // DoNotCall wants this to be final, but we want to override it to return more specific types.
+  // Inheritance is closed, and all subtypes are @DoNotCall, so this is safe to suppress.
+  @SuppressWarnings("DoNotCall")
   public ImmutableCollection<V> replaceValues(K key, Iterable<? extends V> values) {
     throw new UnsupportedOperationException();
   }
@@ -381,7 +398,8 @@
    */
   @Deprecated
   @Override
-  public void clear() {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void clear() {
     throw new UnsupportedOperationException();
   }
 
@@ -410,7 +428,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public boolean put(K key, V value) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final boolean put(K key, V value) {
     throw new UnsupportedOperationException();
   }
 
@@ -423,7 +442,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public boolean putAll(K key, Iterable<? extends V> values) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final boolean putAll(K key, Iterable<? extends V> values) {
     throw new UnsupportedOperationException();
   }
 
@@ -436,7 +456,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public boolean putAll(Multimap<? extends K, ? extends V> multimap) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final boolean putAll(Multimap<? extends K, ? extends V> multimap) {
     throw new UnsupportedOperationException();
   }
 
@@ -449,7 +470,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public boolean remove(Object key, Object value) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
     throw new UnsupportedOperationException();
   }
 
@@ -466,12 +488,12 @@
   // accessors
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return map.containsKey(key);
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return value != null && super.containsValue(value);
   }
 
@@ -545,7 +567,7 @@
     }
 
     @Override
-    public boolean contains(Object object) {
+    public boolean contains(@CheckForNull Object object) {
       if (object instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) object;
         return multimap.containsEntry(entry.getKey(), entry.getValue());
@@ -561,7 +583,7 @@
     return new UnmodifiableIterator<Entry<K, V>>() {
       final Iterator<? extends Entry<K, ? extends ImmutableCollection<V>>> asMapItr =
           map.entrySet().iterator();
-      K currentKey = null;
+      @CheckForNull K currentKey = null;
       Iterator<V> valueItr = Iterators.emptyIterator();
 
       @Override
@@ -576,7 +598,11 @@
           currentKey = entry.getKey();
           valueItr = entry.getValue().iterator();
         }
-        return Maps.immutableEntry(currentKey, valueItr.next());
+        /*
+         * requireNonNull is safe: The first call to this method always enters the !hasNext() case
+         * and populates currentKey, after which it's never cleared.
+         */
+        return immutableEntry(requireNonNull(currentKey), valueItr.next());
       }
     };
   }
@@ -600,12 +626,12 @@
   @WeakOuter
   class Keys extends ImmutableMultiset<K> {
     @Override
-    public boolean contains(@NullableDecl Object object) {
+    public boolean contains(@CheckForNull Object object) {
       return containsKey(object);
     }
 
     @Override
-    public int count(@NullableDecl Object element) {
+    public int count(@CheckForNull Object element) {
       Collection<V> values = map.get(element);
       return (values == null) ? 0 : values.size();
     }
@@ -694,7 +720,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object object) {
+    public boolean contains(@CheckForNull Object object) {
       return multimap.containsValue(object);
     }
 
@@ -705,7 +731,7 @@
 
     @GwtIncompatible // not present in emulated superclass
     @Override
-    int copyIntoArray(Object[] dst, int offset) {
+    int copyIntoArray(@Nullable Object[] dst, int offset) {
       for (ImmutableCollection<V> valueCollection : multimap.map.values()) {
         offset = valueCollection.copyIntoArray(dst, offset);
       }
diff --git a/android/guava/src/com/google/common/collect/ImmutableMultiset.java b/android/guava/src/com/google/common/collect/ImmutableMultiset.java
index f559850..d7febe2 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMultiset.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMultiset.java
@@ -17,10 +17,12 @@
 package com.google.common.collect;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.Serializable;
@@ -28,7 +30,7 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link Multiset} whose contents will never change, with many other important properties
@@ -47,9 +49,14 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableMultiset<E> extends ImmutableMultisetGwtSerializationDependencies<E>
     implements Multiset<E> {
-  /** Returns the empty immutable multiset. */
+  /**
+   * Returns the empty immutable multiset.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked") // all supported methods are covariant
   public static <E> ImmutableMultiset<E> of() {
     return (ImmutableMultiset<E>) RegularImmutableMultiset.EMPTY;
@@ -61,7 +68,6 @@
    * @throws NullPointerException if {@code element} is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") // generic array created but never written
   public static <E> ImmutableMultiset<E> of(E element) {
     return copyFromElements(element);
   }
@@ -72,7 +78,6 @@
    * @throws NullPointerException if any element is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") //
   public static <E> ImmutableMultiset<E> of(E e1, E e2) {
     return copyFromElements(e1, e2);
   }
@@ -84,7 +89,6 @@
    * @throws NullPointerException if any element is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") //
   public static <E> ImmutableMultiset<E> of(E e1, E e2, E e3) {
     return copyFromElements(e1, e2, e3);
   }
@@ -96,7 +100,6 @@
    * @throws NullPointerException if any element is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") //
   public static <E> ImmutableMultiset<E> of(E e1, E e2, E e3, E e4) {
     return copyFromElements(e1, e2, e3, e4);
   }
@@ -108,7 +111,6 @@
    * @throws NullPointerException if any element is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") //
   public static <E> ImmutableMultiset<E> of(E e1, E e2, E e3, E e4, E e5) {
     return copyFromElements(e1, e2, e3, e4, e5);
   }
@@ -120,7 +122,6 @@
    * @throws NullPointerException if any element is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") //
   public static <E> ImmutableMultiset<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E... others) {
     return new Builder<E>().add(e1).add(e2).add(e3).add(e4).add(e5).add(e6).add(others).build();
   }
@@ -186,7 +187,7 @@
     final Iterator<Entry<E>> entryIterator = entrySet().iterator();
     return new UnmodifiableIterator<E>() {
       int remaining;
-      @NullableDecl E element;
+      @CheckForNull E element;
 
       @Override
       public boolean hasNext() {
@@ -201,12 +202,16 @@
           remaining = entry.getCount();
         }
         remaining--;
-        return element;
+        /*
+         * requireNonNull is safe because `remaining` starts at 0, forcing us to initialize
+         * `element` above. After that, we never clear it.
+         */
+        return requireNonNull(element);
       }
     };
   }
 
-  @LazyInit private transient ImmutableList<E> asList;
+  @LazyInit @CheckForNull private transient ImmutableList<E> asList;
 
   @Override
   public ImmutableList<E> asList() {
@@ -215,7 +220,7 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return count(object) > 0;
   }
 
@@ -228,6 +233,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final int add(E element, int occurrences) {
     throw new UnsupportedOperationException();
   }
@@ -241,7 +247,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public final int remove(Object element, int occurrences) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final int remove(@CheckForNull Object element, int occurrences) {
     throw new UnsupportedOperationException();
   }
 
@@ -254,6 +261,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final int setCount(E element, int count) {
     throw new UnsupportedOperationException();
   }
@@ -267,6 +275,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean setCount(E element, int oldCount, int newCount) {
     throw new UnsupportedOperationException();
   }
@@ -282,7 +291,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return Multisets.equalsImpl(this, object);
   }
 
@@ -300,7 +309,7 @@
   @Override
   public abstract ImmutableSet<E> elementSet();
 
-  @LazyInit private transient ImmutableSet<Entry<E>> entrySet;
+  @LazyInit @CheckForNull private transient ImmutableSet<Entry<E>> entrySet;
 
   @Override
   public ImmutableSet<Entry<E>> entrySet() {
@@ -332,7 +341,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Entry) {
         Entry<?> entry = (Entry<?>) o;
         if (entry.getCount() <= 0) {
@@ -403,7 +412,12 @@
    * @since 2.0
    */
   public static class Builder<E> extends ImmutableCollection.Builder<E> {
-    ObjectCountHashMap<E> contents;
+    /*
+     * `contents` is null only for instances of the subclass, ImmutableSortedMultiset.Builder. That
+     * subclass overrides all the methods that access it here. Thus, all the methods here can safely
+     * assume that this field is non-null.
+     */
+    @CheckForNull ObjectCountHashMap<E> contents;
 
     /**
      * If build() has been called on the current contents multiset, we need to copy it on any future
@@ -474,6 +488,7 @@
      */
     @CanIgnoreReturnValue
     public Builder<E> addCopies(E element, int occurrences) {
+      requireNonNull(contents); // see the comment on the field
       if (occurrences == 0) {
         return this;
       }
@@ -499,6 +514,7 @@
      */
     @CanIgnoreReturnValue
     public Builder<E> setCount(E element, int count) {
+      requireNonNull(contents); // see the comment on the field
       if (count == 0 && !isLinkedHash) {
         contents = new ObjectCountLinkedHashMap<E>(contents);
         isLinkedHash = true;
@@ -528,6 +544,7 @@
     @CanIgnoreReturnValue
     @Override
     public Builder<E> addAll(Iterable<? extends E> elements) {
+      requireNonNull(contents); // see the comment on the field
       if (elements instanceof Multiset) {
         Multiset<? extends E> multiset = Multisets.cast(elements);
         ObjectCountHashMap<? extends E> backingMap = tryGetMap(multiset);
@@ -568,7 +585,7 @@
      * efficient to iterate over it by index rather than an entry iterator, which will need to
      * allocate an object for each entry, so we check for that.
      */
-    @NullableDecl
+    @CheckForNull
     static <T> ObjectCountHashMap<T> tryGetMap(Iterable<T> multiset) {
       if (multiset instanceof RegularImmutableMultiset) {
         return ((RegularImmutableMultiset<T>) multiset).contents;
@@ -585,6 +602,7 @@
      */
     @Override
     public ImmutableMultiset<E> build() {
+      requireNonNull(contents); // see the comment on the field
       if (contents.size() == 0) {
         return of();
       }
diff --git a/android/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java b/android/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
index a8b1899..2469a18 100644
--- a/android/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
+++ b/android/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
@@ -37,4 +37,5 @@
  * and make types non-final.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ImmutableMultisetGwtSerializationDependencies<E> extends ImmutableCollection<E> {}
diff --git a/android/guava/src/com/google/common/collect/ImmutableRangeMap.java b/android/guava/src/com/google/common/collect/ImmutableRangeMap.java
index aa0495c..8a47796 100644
--- a/android/guava/src/com/google/common/collect/ImmutableRangeMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableRangeMap.java
@@ -23,6 +23,7 @@
 import com.google.common.collect.SortedLists.KeyAbsentBehavior;
 import com.google.common.collect.SortedLists.KeyPresentBehavior;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
 import java.util.Collections;
@@ -30,7 +31,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link RangeMap} whose contents will never change, with many other important properties
@@ -41,12 +42,17 @@
  */
 @Beta
 @GwtIncompatible // NavigableMap
+@ElementTypesAreNonnullByDefault
 public class ImmutableRangeMap<K extends Comparable<?>, V> implements RangeMap<K, V>, Serializable {
 
   private static final ImmutableRangeMap<Comparable<?>, Object> EMPTY =
       new ImmutableRangeMap<>(ImmutableList.<Range<Comparable<?>>>of(), ImmutableList.of());
 
-  /** Returns an empty immutable range map. */
+  /**
+   * Returns an empty immutable range map.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked")
   public static <K extends Comparable<?>, V> ImmutableRangeMap<K, V> of() {
     return (ImmutableRangeMap<K, V>) EMPTY;
@@ -114,6 +120,12 @@
       return this;
     }
 
+    @CanIgnoreReturnValue
+    Builder<K, V> combine(Builder<K, V> builder) {
+      entries.addAll(builder.entries);
+      return this;
+    }
+
     /**
      * Returns an {@code ImmutableRangeMap} containing the associations previously added to this
      * builder.
@@ -149,7 +161,7 @@
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public V get(K key) {
     int index =
         SortedLists.binarySearch(
@@ -167,7 +179,7 @@
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public Entry<Range<K>, V> getEntry(K key) {
     int index =
         SortedLists.binarySearch(
@@ -202,7 +214,8 @@
    */
   @Deprecated
   @Override
-  public void put(Range<K> range, V value) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void put(Range<K> range, V value) {
     throw new UnsupportedOperationException();
   }
 
@@ -214,7 +227,8 @@
    */
   @Deprecated
   @Override
-  public void putCoalescing(Range<K> range, V value) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void putCoalescing(Range<K> range, V value) {
     throw new UnsupportedOperationException();
   }
 
@@ -226,7 +240,8 @@
    */
   @Deprecated
   @Override
-  public void putAll(RangeMap<K, V> rangeMap) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void putAll(RangeMap<K, V> rangeMap) {
     throw new UnsupportedOperationException();
   }
 
@@ -238,7 +253,8 @@
    */
   @Deprecated
   @Override
-  public void clear() {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void clear() {
     throw new UnsupportedOperationException();
   }
 
@@ -250,7 +266,8 @@
    */
   @Deprecated
   @Override
-  public void remove(Range<K> range) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void remove(Range<K> range) {
     throw new UnsupportedOperationException();
   }
 
@@ -341,7 +358,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object o) {
+  public boolean equals(@CheckForNull Object o) {
     if (o instanceof RangeMap) {
       RangeMap<?, ?> rangeMap = (RangeMap<?, ?>) o;
       return asMapOfRanges().equals(rangeMap.asMapOfRanges());
diff --git a/android/guava/src/com/google/common/collect/ImmutableRangeSet.java b/android/guava/src/com/google/common/collect/ImmutableRangeSet.java
index e512be7..a0eb5b5 100644
--- a/android/guava/src/com/google/common/collect/ImmutableRangeSet.java
+++ b/android/guava/src/com/google/common/collect/ImmutableRangeSet.java
@@ -20,6 +20,7 @@
 import static com.google.common.collect.SortedLists.KeyAbsentBehavior.NEXT_HIGHER;
 import static com.google.common.collect.SortedLists.KeyAbsentBehavior.NEXT_LOWER;
 import static com.google.common.collect.SortedLists.KeyPresentBehavior.ANY_PRESENT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -27,6 +28,7 @@
 import com.google.common.collect.SortedLists.KeyPresentBehavior;
 import com.google.common.primitives.Ints;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.io.Serializable;
 import java.util.Collections;
@@ -34,7 +36,7 @@
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link RangeSet} whose contents will never change, with many other important properties
@@ -45,6 +47,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ImmutableRangeSet<C extends Comparable> extends AbstractRangeSet<C>
     implements Serializable {
 
@@ -54,7 +57,11 @@
   private static final ImmutableRangeSet<Comparable<?>> ALL =
       new ImmutableRangeSet<>(ImmutableList.of(Range.<Comparable<?>>all()));
 
-  /** Returns an empty immutable range set. */
+  /**
+   * Returns an empty immutable range set.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked")
   public static <C extends Comparable> ImmutableRangeSet<C> of() {
     return (ImmutableRangeSet<C>) EMPTY;
@@ -168,6 +175,7 @@
   }
 
   @Override
+  @CheckForNull
   public Range<C> rangeContaining(C value) {
     int index =
         SortedLists.binarySearch(
@@ -205,6 +213,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void add(Range<C> range) {
     throw new UnsupportedOperationException();
   }
@@ -217,6 +226,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void addAll(RangeSet<C> other) {
     throw new UnsupportedOperationException();
   }
@@ -229,6 +239,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void addAll(Iterable<Range<C>> other) {
     throw new UnsupportedOperationException();
   }
@@ -241,6 +252,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void remove(Range<C> range) {
     throw new UnsupportedOperationException();
   }
@@ -253,6 +265,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void removeAll(RangeSet<C> other) {
     throw new UnsupportedOperationException();
   }
@@ -265,6 +278,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void removeAll(Iterable<Range<C>> other) {
     throw new UnsupportedOperationException();
   }
@@ -285,7 +299,7 @@
     return new RegularImmutableSortedSet<>(ranges.reverse(), Range.<C>rangeLexOrdering().reverse());
   }
 
-  @LazyInit private transient ImmutableRangeSet<C> complement;
+  @LazyInit @CheckForNull private transient ImmutableRangeSet<C> complement;
 
   private final class ComplementRanges extends ImmutableList<Range<C>> {
     // True if the "positive" range set is empty or bounded below.
@@ -527,7 +541,7 @@
       this.domain = domain;
     }
 
-    @NullableDecl private transient Integer size;
+    @CheckForNull private transient Integer size;
 
     @Override
     public int size() {
@@ -553,6 +567,7 @@
         Iterator<C> elemItr = Iterators.emptyIterator();
 
         @Override
+        @CheckForNull
         protected C computeNext() {
           while (!elemItr.hasNext()) {
             if (rangeItr.hasNext()) {
@@ -574,6 +589,7 @@
         Iterator<C> elemItr = Iterators.emptyIterator();
 
         @Override
+        @CheckForNull
         protected C computeNext() {
           while (!elemItr.hasNext()) {
             if (rangeItr.hasNext()) {
@@ -614,7 +630,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o == null) {
         return false;
       }
@@ -628,10 +644,10 @@
     }
 
     @Override
-    int indexOf(Object target) {
+    int indexOf(@CheckForNull Object target) {
       if (contains(target)) {
         @SuppressWarnings("unchecked") // if it's contained, it's definitely a C
-        C c = (C) target;
+        C c = (C) requireNonNull(target);
         long total = 0;
         for (Range<C> range : ranges) {
           if (range.contains(c)) {
@@ -747,6 +763,12 @@
       return this;
     }
 
+    @CanIgnoreReturnValue
+    Builder<C> combine(Builder<C> builder) {
+      addAll(builder.ranges);
+      return this;
+    }
+
     /**
      * Returns an {@code ImmutableRangeSet} containing the ranges added to this builder.
      *
diff --git a/android/guava/src/com/google/common/collect/ImmutableSet.java b/android/guava/src/com/google/common/collect/ImmutableSet.java
index 21d8144..1ff54e2 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSet.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSet.java
@@ -20,6 +20,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
 import static com.google.common.collect.ObjectArrays.checkElementNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -35,7 +36,8 @@
 import java.util.Iterator;
 import java.util.Set;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Set} whose contents will never change, with many other important properties detailed at
@@ -45,10 +47,13 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableSet<E> extends ImmutableCollection<E> implements Set<E> {
   /**
    * Returns the empty immutable set. Preferred over {@link Collections#emptySet} for code
    * consistency, and because the return type conveys the immutability guarantee.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
    */
   @SuppressWarnings({"unchecked"}) // fully variant implementation (never actually produces any Es)
   public static <E> ImmutableSet<E> of() {
@@ -138,13 +143,14 @@
    *
    * @throws NullPointerException if any of the first {@code n} elements of {@code elements} is null
    */
-  private static <E> ImmutableSet<E> construct(int n, Object... elements) {
+  private static <E> ImmutableSet<E> construct(int n, @Nullable Object... elements) {
     switch (n) {
       case 0:
         return of();
       case 1:
         @SuppressWarnings("unchecked") // safe; elements contains only E's
-        E elem = (E) elements[0];
+        // requireNonNull is safe because the first `n` elements are non-null.
+        E elem = (E) requireNonNull(elements[0]);
         return of(elem);
       default:
         // continue below to handle the general case
@@ -175,12 +181,14 @@
     if (uniques == 1) {
       // There is only one element or elements are all duplicates
       @SuppressWarnings("unchecked") // we are careful to only pass in E
-      E element = (E) elements[0];
-      return new SingletonImmutableSet<E>(element, hashCode);
+      // requireNonNull is safe because the first `uniques` elements are non-null.
+      E element = (E) requireNonNull(elements[0]);
+      return new SingletonImmutableSet<E>(element);
     } else if (chooseTableSize(uniques) < tableSize / 2) {
       // Resize the table when the array includes too many duplicates.
       return construct(uniques, elements);
     } else {
+      @Nullable
       Object[] uniqueElements =
           shouldTrim(uniques, elements.length) ? Arrays.copyOf(elements, uniques) : elements;
       return new RegularImmutableSet<E>(uniqueElements, hashCode, table, mask, uniques);
@@ -315,10 +323,11 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
-    } else if (object instanceof ImmutableSet
+    }
+    if (object instanceof ImmutableSet
         && isHashCodeFast()
         && ((ImmutableSet<?>) object).isHashCodeFast()
         && hashCode() != object.hashCode()) {
@@ -337,7 +346,7 @@
   @Override
   public abstract UnmodifiableIterator<E> iterator();
 
-  @LazyInit @RetainedWith @NullableDecl private transient ImmutableList<E> asList;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableList<E> asList;
 
   @Override
   public ImmutableList<E> asList() {
@@ -420,7 +429,7 @@
    * @since 2.0
    */
   public static class Builder<E> extends ImmutableCollection.ArrayBasedBuilder<E> {
-    @NullableDecl @VisibleForTesting Object[] hashTable;
+    @VisibleForTesting @CheckForNull @Nullable Object[] hashTable;
     private int hashCode;
 
     /**
@@ -433,7 +442,7 @@
 
     Builder(int capacity) {
       super(capacity);
-      this.hashTable = new Object[chooseTableSize(capacity)];
+      this.hashTable = new @Nullable Object[chooseTableSize(capacity)];
     }
 
     /**
@@ -481,6 +490,7 @@
     }
 
     private void addDeduping(E element) {
+      requireNonNull(hashTable); // safe because we check for null before calling this method
       int mask = hashTable.length - 1;
       int hash = element.hashCode();
       for (int i = Hashing.smear(hash); ; i++) {
@@ -537,6 +547,20 @@
       return this;
     }
 
+    @CanIgnoreReturnValue
+    @SuppressWarnings("unchecked") // ArrayBasedBuilder stores its elements as Object.
+    Builder<E> combine(Builder<E> other) {
+      if (hashTable != null) {
+        for (int i = 0; i < other.size; ++i) {
+          // requireNonNull is safe because the first `size` elements are non-null.
+          add((E) requireNonNull(other.contents[i]));
+        }
+      } else {
+        addAll(other.contents, other.size);
+      }
+      return this;
+    }
+
     /**
      * Returns a newly-created {@code ImmutableSet} based on the contents of the {@code Builder}.
      */
@@ -547,10 +571,15 @@
         case 0:
           return of();
         case 1:
-          return (ImmutableSet<E>) of(contents[0]);
+          /*
+           * requireNonNull is safe because we ensure that the first `size` elements have been
+           * populated.
+           */
+          return (ImmutableSet<E>) of(requireNonNull(contents[0]));
         default:
           ImmutableSet<E> result;
           if (hashTable != null && chooseTableSize(size) == hashTable.length) {
+            @Nullable
             Object[] uniqueElements =
                 shouldTrim(size, contents.length) ? Arrays.copyOf(contents, size) : contents;
             result =
diff --git a/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java b/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java
index 622556c..18cb2ef 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java
@@ -23,6 +23,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.MoreObjects;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import com.google.j2objc.annotations.Weak;
@@ -35,12 +36,16 @@
 import java.util.Comparator;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link SetMultimap} whose contents will never change, with many other important properties
  * detailed at {@link ImmutableCollection}.
  *
+ * <p><b>Warning:</b> As in all {@link SetMultimap}s, do not modify either a key <i>or a value</i>
+ * of a {@code ImmutableSetMultimap} in a way that affects its {@link Object#equals} behavior.
+ * Undefined behavior and bugs will result.
+ *
  * <p>See the Guava User Guide article on <a href=
  * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
  *
@@ -48,10 +53,15 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
+@ElementTypesAreNonnullByDefault
 public class ImmutableSetMultimap<K, V> extends ImmutableMultimap<K, V>
     implements SetMultimap<K, V> {
 
-  /** Returns the empty multimap. */
+  /**
+   * Returns the empty multimap.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   // Casting is safe because the multimap will never hold any elements.
   @SuppressWarnings("unchecked")
   public static <K, V> ImmutableSetMultimap<K, V> of() {
@@ -213,6 +223,13 @@
       return this;
     }
 
+    @CanIgnoreReturnValue
+    @Override
+    Builder<K, V> combine(ImmutableMultimap.Builder<K, V> other) {
+      super.combine(other);
+      return this;
+    }
+
     /**
      * {@inheritDoc}
      *
@@ -272,7 +289,8 @@
   }
 
   private static <K, V> ImmutableSetMultimap<K, V> copyOf(
-      Multimap<? extends K, ? extends V> multimap, Comparator<? super V> valueComparator) {
+      Multimap<? extends K, ? extends V> multimap,
+      @CheckForNull Comparator<? super V> valueComparator) {
     checkNotNull(multimap); // eager for GWT
     if (multimap.isEmpty() && valueComparator == null) {
       return of();
@@ -307,7 +325,7 @@
   /** Creates an ImmutableSetMultimap from an asMap.entrySet. */
   static <K, V> ImmutableSetMultimap<K, V> fromMapEntries(
       Collection<? extends Map.Entry<? extends K, ? extends Collection<? extends V>>> mapEntries,
-      @NullableDecl Comparator<? super V> valueComparator) {
+      @CheckForNull Comparator<? super V> valueComparator) {
     if (mapEntries.isEmpty()) {
       return of();
     }
@@ -337,7 +355,7 @@
   ImmutableSetMultimap(
       ImmutableMap<K, ImmutableSet<V>> map,
       int size,
-      @NullableDecl Comparator<? super V> valueComparator) {
+      @CheckForNull Comparator<? super V> valueComparator) {
     super(map, size);
     this.emptySet = emptySet(valueComparator);
   }
@@ -350,13 +368,13 @@
    * parameters used to build this multimap.
    */
   @Override
-  public ImmutableSet<V> get(@NullableDecl K key) {
+  public ImmutableSet<V> get(K key) {
     // This cast is safe as its type is known in constructor.
     ImmutableSet<V> set = (ImmutableSet<V>) map.get(key);
     return MoreObjects.firstNonNull(set, emptySet);
   }
 
-  @LazyInit @RetainedWith @NullableDecl private transient ImmutableSetMultimap<V, K> inverse;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableSetMultimap<V, K> inverse;
 
   /**
    * {@inheritDoc}
@@ -390,7 +408,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public ImmutableSet<V> removeAll(Object key) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final ImmutableSet<V> removeAll(@CheckForNull Object key) {
     throw new UnsupportedOperationException();
   }
 
@@ -403,11 +422,12 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public ImmutableSet<V> replaceValues(K key, Iterable<? extends V> values) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final ImmutableSet<V> replaceValues(K key, Iterable<? extends V> values) {
     throw new UnsupportedOperationException();
   }
 
-  @LazyInit @RetainedWith @NullableDecl private transient ImmutableSet<Entry<K, V>> entries;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableSet<Entry<K, V>> entries;
 
   /**
    * Returns an immutable collection of all key-value pairs in the multimap. Its iterator traverses
@@ -427,7 +447,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object object) {
+    public boolean contains(@CheckForNull Object object) {
       if (object instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) object;
         return multimap.containsEntry(entry.getKey(), entry.getValue());
@@ -452,20 +472,20 @@
   }
 
   private static <V> ImmutableSet<V> valueSet(
-      @NullableDecl Comparator<? super V> valueComparator, Collection<? extends V> values) {
+      @CheckForNull Comparator<? super V> valueComparator, Collection<? extends V> values) {
     return (valueComparator == null)
         ? ImmutableSet.copyOf(values)
         : ImmutableSortedSet.copyOf(valueComparator, values);
   }
 
-  private static <V> ImmutableSet<V> emptySet(@NullableDecl Comparator<? super V> valueComparator) {
+  private static <V> ImmutableSet<V> emptySet(@CheckForNull Comparator<? super V> valueComparator) {
     return (valueComparator == null)
         ? ImmutableSet.<V>of()
         : ImmutableSortedSet.<V>emptySet(valueComparator);
   }
 
   private static <V> ImmutableSet.Builder<V> valuesBuilder(
-      @NullableDecl Comparator<? super V> valueComparator) {
+      @CheckForNull Comparator<? super V> valueComparator) {
     return (valueComparator == null)
         ? new ImmutableSet.Builder<V>()
         : new ImmutableSortedSet.Builder<V>(valueComparator);
@@ -482,7 +502,7 @@
     Serialization.writeMultimap(this, stream);
   }
 
-  @NullableDecl
+  @CheckForNull
   Comparator<? super V> valueComparator() {
     return emptySet instanceof ImmutableSortedSet
         ? ((ImmutableSortedSet<V>) emptySet).comparator()
diff --git a/android/guava/src/com/google/common/collect/ImmutableSortedMap.java b/android/guava/src/com/google/common/collect/ImmutableSortedMap.java
index a2f996c..ac5f0bc 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSortedMap.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSortedMap.java
@@ -20,10 +20,12 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 import static com.google.common.collect.Maps.keyOrNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.AbstractMap;
 import java.util.Arrays;
 import java.util.Comparator;
@@ -31,7 +33,8 @@
 import java.util.NavigableMap;
 import java.util.SortedMap;
 import java.util.TreeMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link NavigableMap} whose contents will never change, with many other important properties
@@ -51,6 +54,7 @@
  * @since 2.0 (implements {@code NavigableMap} since 12.0)
  */
 @GwtCompatible(serializable = true, emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class ImmutableSortedMap<K, V> extends ImmutableSortedMapFauxverideShim<K, V>
     implements NavigableMap<K, V> {
 
@@ -73,7 +77,11 @@
     }
   }
 
-  /** Returns the empty sorted map. */
+  /**
+   * Returns the empty sorted map.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked")
   // unsafe, comparator() returns a comparator on the specified type
   // TODO(kevinb): evaluate whether or not of().comparator() should return null
@@ -102,7 +110,7 @@
   @SuppressWarnings("unchecked")
   public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
       K k1, V v1, K k2, V v2) {
-    return ofEntries(entryOf(k1, v1), entryOf(k2, v2));
+    return fromEntries(entryOf(k1, v1), entryOf(k2, v2));
   }
 
   /**
@@ -114,7 +122,7 @@
   @SuppressWarnings("unchecked")
   public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
       K k1, V v1, K k2, V v2, K k3, V v3) {
-    return ofEntries(entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3));
+    return fromEntries(entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3));
   }
 
   /**
@@ -126,7 +134,7 @@
   @SuppressWarnings("unchecked")
   public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
       K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
-    return ofEntries(entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3), entryOf(k4, v4));
+    return fromEntries(entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3), entryOf(k4, v4));
   }
 
   /**
@@ -138,13 +146,164 @@
   @SuppressWarnings("unchecked")
   public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
       K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {
-    return ofEntries(
+    return fromEntries(
         entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3), entryOf(k4, v4), entryOf(k5, v5));
   }
 
-  private static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> ofEntries(
-      Entry<K, V>... entries) {
-    return fromEntries(Ordering.natural(), false, entries, entries.length);
+  /**
+   * Returns an immutable sorted map containing the given entries, sorted by the natural ordering of
+   * their keys.
+   *
+   * @throws IllegalArgumentException if any two keys are equal according to their natural ordering
+   * @since 31.0
+   */
+  @SuppressWarnings("unchecked")
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+    return fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6));
+  }
+
+  /**
+   * Returns an immutable sorted map containing the given entries, sorted by the natural ordering of
+   * their keys.
+   *
+   * @throws IllegalArgumentException if any two keys are equal according to their natural ordering
+   * @since 31.0
+   */
+  @SuppressWarnings("unchecked")
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+    return fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7));
+  }
+
+  /**
+   * Returns an immutable sorted map containing the given entries, sorted by the natural ordering of
+   * their keys.
+   *
+   * @throws IllegalArgumentException if any two keys are equal according to their natural ordering
+   * @since 31.0
+   */
+  @SuppressWarnings("unchecked")
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8) {
+    return fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8));
+  }
+
+  /**
+   * Returns an immutable sorted map containing the given entries, sorted by the natural ordering of
+   * their keys.
+   *
+   * @throws IllegalArgumentException if any two keys are equal according to their natural ordering
+   * @since 31.0
+   */
+  @SuppressWarnings("unchecked")
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9) {
+    return fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8),
+        entryOf(k9, v9));
+  }
+
+  /**
+   * Returns an immutable sorted map containing the given entries, sorted by the natural ordering of
+   * their keys.
+   *
+   * @throws IllegalArgumentException if any two keys are equal according to their natural ordering
+   * @since 31.0
+   */
+  @SuppressWarnings("unchecked")
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9,
+      K k10,
+      V v10) {
+    return fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8),
+        entryOf(k9, v9),
+        entryOf(k10, v10));
   }
 
   /**
@@ -187,8 +346,8 @@
   }
 
   /**
-   * Returns an immutable map containing the given entries, with keys sorted by the provided
-   * comparator.
+   * Returns an immutable map containing the given entries, with keys sorted by their natural
+   * ordering.
    *
    * <p>This method is not type-safe, as it may be called on a map with keys that are not mutually
    * comparable.
@@ -274,6 +433,11 @@
     return fromEntries(comparator, sameComparator, map.entrySet());
   }
 
+  private static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> fromEntries(
+      Entry<K, V>... entries) {
+    return fromEntries(Ordering.natural(), false, entries, entries.length);
+  }
+
   /**
    * Accepts a collection of possibly-null entries. If {@code sameComparator}, then it is assumed
    * that they do not need to be sorted or checked for dupes.
@@ -293,22 +457,25 @@
   private static <K, V> ImmutableSortedMap<K, V> fromEntries(
       final Comparator<? super K> comparator,
       boolean sameComparator,
-      Entry<K, V>[] entryArray,
+      @Nullable Entry<K, V>[] entryArray,
       int size) {
     switch (size) {
       case 0:
         return emptyMap(comparator);
       case 1:
-        return ImmutableSortedMap.<K, V>of(
-            comparator, entryArray[0].getKey(), entryArray[0].getValue());
+        // requireNonNull is safe because the first `size` elements have been filled in.
+        Entry<K, V> onlyEntry = requireNonNull(entryArray[0]);
+        return of(comparator, onlyEntry.getKey(), onlyEntry.getValue());
       default:
         Object[] keys = new Object[size];
         Object[] values = new Object[size];
         if (sameComparator) {
           // Need to check for nulls, but don't need to sort or validate.
           for (int i = 0; i < size; i++) {
-            Object key = entryArray[i].getKey();
-            Object value = entryArray[i].getValue();
+            // requireNonNull is safe because the first `size` elements have been filled in.
+            Entry<K, V> entry = requireNonNull(entryArray[i]);
+            Object key = entry.getKey();
+            Object value = entry.getValue();
             checkEntryNotNull(key, value);
             keys[i] = key;
             values[i] = value;
@@ -321,24 +488,31 @@
               entryArray,
               0,
               size,
-              new Comparator<Entry<K, V>>() {
+              new Comparator<@Nullable Entry<K, V>>() {
                 @Override
-                public int compare(Entry<K, V> e1, Entry<K, V> e2) {
+                public int compare(@CheckForNull Entry<K, V> e1, @CheckForNull Entry<K, V> e2) {
+                  // requireNonNull is safe because the first `size` elements have been filled in.
+                  requireNonNull(e1);
+                  requireNonNull(e2);
                   return comparator.compare(e1.getKey(), e2.getKey());
                 }
               });
-          K prevKey = entryArray[0].getKey();
+          // requireNonNull is safe because the first `size` elements have been filled in.
+          Entry<K, V> firstEntry = requireNonNull(entryArray[0]);
+          K prevKey = firstEntry.getKey();
           keys[0] = prevKey;
-          values[0] = entryArray[0].getValue();
+          values[0] = firstEntry.getValue();
           checkEntryNotNull(keys[0], values[0]);
           for (int i = 1; i < size; i++) {
-            K key = entryArray[i].getKey();
-            V value = entryArray[i].getValue();
+            // requireNonNull is safe because the first `size` elements have been filled in.
+            Entry<K, V> prevEntry = requireNonNull(entryArray[i - 1]);
+            Entry<K, V> entry = requireNonNull(entryArray[i]);
+            K key = entry.getKey();
+            V value = entry.getValue();
             checkEntryNotNull(key, value);
             keys[i] = key;
             values[i] = value;
-            checkNoConflict(
-                comparator.compare(prevKey, key) != 0, "key", entryArray[i - 1], entryArray[i]);
+            checkNoConflict(comparator.compare(prevKey, key) != 0, "key", prevEntry, entry);
             prevKey = key;
           }
         }
@@ -386,20 +560,20 @@
    *         .put(1, "one")
    *         .put(2, "two")
    *         .put(3, "three")
-   *         .build();
+   *         .buildOrThrow();
    * }</pre>
    *
    * <p>For <i>small</i> immutable sorted maps, the {@code ImmutableSortedMap.of()} methods are even
    * more convenient.
    *
-   * <p>Builder instances can be reused - it is safe to call {@link #build} multiple times to build
-   * multiple maps in series. Each map is a superset of the maps created before it.
+   * <p>Builder instances can be reused - it is safe to call {@link #buildOrThrow} multiple times to
+   * build multiple maps in series. Each map is a superset of the maps created before it.
    *
    * @since 2.0
    */
   public static class Builder<K, V> extends ImmutableMap.Builder<K, V> {
-    private transient Object[] keys;
-    private transient Object[] values;
+    private transient @Nullable Object[] keys;
+    private transient @Nullable Object[] values;
     private final Comparator<? super K> comparator;
 
     /**
@@ -413,8 +587,8 @@
 
     private Builder(Comparator<? super K> comparator, int initialCapacity) {
       this.comparator = checkNotNull(comparator);
-      this.keys = new Object[initialCapacity];
-      this.values = new Object[initialCapacity];
+      this.keys = new @Nullable Object[initialCapacity];
+      this.values = new @Nullable Object[initialCapacity];
     }
 
     private void ensureCapacity(int minCapacity) {
@@ -495,23 +669,51 @@
     @Beta
     @Override
     @Deprecated
-    public Builder<K, V> orderEntriesByValue(Comparator<? super V> valueComparator) {
+    @DoNotCall("Always throws UnsupportedOperationException")
+    public final Builder<K, V> orderEntriesByValue(Comparator<? super V> valueComparator) {
       throw new UnsupportedOperationException("Not available on ImmutableSortedMap.Builder");
     }
 
+    @CanIgnoreReturnValue
+    Builder<K, V> combine(ImmutableSortedMap.Builder<K, V> other) {
+      ensureCapacity(size + other.size);
+      System.arraycopy(other.keys, 0, this.keys, this.size, other.size);
+      System.arraycopy(other.values, 0, this.values, this.size, other.size);
+      size += other.size;
+      return this;
+    }
+
     /**
      * Returns a newly-created immutable sorted map.
      *
+     * <p>Prefer the equivalent method {@link #buildOrThrow()} to make it explicit that the method
+     * will throw an exception if there are duplicate keys. The {@code build()} method will soon be
+     * deprecated.
+     *
      * @throws IllegalArgumentException if any two keys are equal according to the comparator (which
      *     might be the keys' natural order)
      */
     @Override
     public ImmutableSortedMap<K, V> build() {
+      return buildOrThrow();
+    }
+
+    /**
+     * Returns a newly-created immutable sorted map, or throws an exception if any two keys are
+     * equal.
+     *
+     * @throws IllegalArgumentException if any two keys are equal according to the comparator (which
+     *     might be the keys' natural order)
+     * @since 31.0
+     */
+    @Override
+    public ImmutableSortedMap<K, V> buildOrThrow() {
       switch (size) {
         case 0:
           return emptyMap(comparator);
         case 1:
-          return of(comparator, (K) keys[0], (V) values[0]);
+          // requireNonNull is safe because the first `size` elements have been filled in.
+          return of(comparator, (K) requireNonNull(keys[0]), (V) requireNonNull(values[0]));
         default:
           Object[] sortedKeys = Arrays.copyOf(keys, size);
           Arrays.sort((K[]) sortedKeys, comparator);
@@ -529,8 +731,10 @@
                       + " and "
                       + sortedKeys[i]);
             }
-            int index = Arrays.binarySearch((K[]) sortedKeys, (K) keys[i], comparator);
-            sortedValues[index] = values[i];
+            // requireNonNull is safe because the first `size` elements have been filled in.
+            int index =
+                Arrays.binarySearch((K[]) sortedKeys, (K) requireNonNull(keys[i]), comparator);
+            sortedValues[index] = requireNonNull(values[i]);
           }
           return new ImmutableSortedMap<K, V>(
               new RegularImmutableSortedSet<K>(
@@ -542,7 +746,7 @@
 
   private final transient RegularImmutableSortedSet<K> keySet;
   private final transient ImmutableList<V> valueList;
-  private transient ImmutableSortedMap<K, V> descendingMap;
+  @CheckForNull private transient ImmutableSortedMap<K, V> descendingMap;
 
   ImmutableSortedMap(RegularImmutableSortedSet<K> keySet, ImmutableList<V> valueList) {
     this(keySet, valueList, null);
@@ -551,7 +755,7 @@
   ImmutableSortedMap(
       RegularImmutableSortedSet<K> keySet,
       ImmutableList<V> valueList,
-      ImmutableSortedMap<K, V> descendingMap) {
+      @CheckForNull ImmutableSortedMap<K, V> descendingMap) {
     this.keySet = keySet;
     this.valueList = valueList;
     this.descendingMap = descendingMap;
@@ -563,7 +767,8 @@
   }
 
   @Override
-  public V get(@NullableDecl Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     int index = keySet.indexOf(key);
     return (index == -1) ? null : valueList.get(index);
   }
@@ -774,51 +979,61 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> lowerEntry(K key) {
     return headMap(key, false).lastEntry();
   }
 
   @Override
+  @CheckForNull
   public K lowerKey(K key) {
     return keyOrNull(lowerEntry(key));
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> floorEntry(K key) {
     return headMap(key, true).lastEntry();
   }
 
   @Override
+  @CheckForNull
   public K floorKey(K key) {
     return keyOrNull(floorEntry(key));
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> ceilingEntry(K key) {
     return tailMap(key, true).firstEntry();
   }
 
   @Override
+  @CheckForNull
   public K ceilingKey(K key) {
     return keyOrNull(ceilingEntry(key));
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> higherEntry(K key) {
     return tailMap(key, false).firstEntry();
   }
 
   @Override
+  @CheckForNull
   public K higherKey(K key) {
     return keyOrNull(higherEntry(key));
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> firstEntry() {
     return isEmpty() ? null : entrySet().asList().get(0);
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> lastEntry() {
     return isEmpty() ? null : entrySet().asList().get(size() - 1);
   }
@@ -832,6 +1047,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final Entry<K, V> pollFirstEntry() {
     throw new UnsupportedOperationException();
   }
@@ -845,6 +1062,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final Entry<K, V> pollLastEntry() {
     throw new UnsupportedOperationException();
   }
diff --git a/android/guava/src/com/google/common/collect/ImmutableSortedMapFauxverideShim.java b/android/guava/src/com/google/common/collect/ImmutableSortedMapFauxverideShim.java
index 1e875a3..9b40f55 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSortedMapFauxverideShim.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSortedMapFauxverideShim.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotCall;
 
 /**
  * "Overrides" the {@link ImmutableMap} static methods that lack {@link ImmutableSortedMap}
@@ -26,6 +27,7 @@
  * @author Chris Povirk
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class ImmutableSortedMapFauxverideShim<K, V> extends ImmutableMap<K, V> {
   /**
    * Not supported. Use {@link ImmutableSortedMap#naturalOrder}, which offers better type-safety,
@@ -35,6 +37,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link ImmutableSortedMap#naturalOrder}, which offers better type-safety.
    */
+  @DoNotCall("Use naturalOrder")
   @Deprecated
   public static <K, V> ImmutableSortedMap.Builder<K, V> builder() {
     throw new UnsupportedOperationException();
@@ -46,6 +49,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Not supported for ImmutableSortedMap.
    */
+  @DoNotCall("Use naturalOrder (which does not accept an expected size)")
   @Deprecated
   public static <K, V> ImmutableSortedMap.Builder<K, V> builderWithExpectedSize(int expectedSize) {
     throw new UnsupportedOperationException();
@@ -60,6 +64,7 @@
    * @deprecated <b>Pass a key of type {@code Comparable} to use {@link
    *     ImmutableSortedMap#of(Comparable, Object)}.</b>
    */
+  @DoNotCall("Pass a key of type Comparable")
   @Deprecated
   public static <K, V> ImmutableSortedMap<K, V> of(K k1, V v1) {
     throw new UnsupportedOperationException();
@@ -74,6 +79,7 @@
    * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
    *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object)}.</b>
    */
+  @DoNotCall("Pass keys of type Comparable")
   @Deprecated
   public static <K, V> ImmutableSortedMap<K, V> of(K k1, V v1, K k2, V v2) {
     throw new UnsupportedOperationException();
@@ -88,6 +94,7 @@
    * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
    *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object)}.</b>
    */
+  @DoNotCall("Pass keys of type Comparable")
   @Deprecated
   public static <K, V> ImmutableSortedMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3) {
     throw new UnsupportedOperationException();
@@ -103,6 +110,7 @@
    *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
    *     Comparable, Object)}.</b>
    */
+  @DoNotCall("Pass keys of type Comparable")
   @Deprecated
   public static <K, V> ImmutableSortedMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
     throw new UnsupportedOperationException();
@@ -118,11 +126,160 @@
    *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
    *     Comparable, Object, Comparable, Object)}.</b>
    */
+  @DoNotCall("Pass keys of type Comparable")
   @Deprecated
   public static <K, V> ImmutableSortedMap<K, V> of(
       K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {
     throw new UnsupportedOperationException();
   }
 
+  /**
+   * Not supported. <b>You are attempting to create a map that may contain non-{@code Comparable}
+   * keys.</b> Proper calls will resolve to the version in {@code ImmutableSortedMap}, not this
+   * dummy version.
+   *
+   * @throws UnsupportedOperationException always
+   * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
+   *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
+   *     Comparable, Object, Comparable, Object)}.</b>
+   */
+  @DoNotCall("Pass keys of type Comparable")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Not supported. <b>You are attempting to create a map that may contain non-{@code Comparable}
+   * keys.</b> Proper calls will resolve to the version in {@code ImmutableSortedMap}, not this
+   * dummy version.
+   *
+   * @throws UnsupportedOperationException always
+   * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
+   *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
+   *     Comparable, Object, Comparable, Object)}.</b>
+   */
+  @DoNotCall("Pass keys of type Comparable")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Not supported. <b>You are attempting to create a map that may contain non-{@code Comparable}
+   * keys.</b> Proper calls will resolve to the version in {@code ImmutableSortedMap}, not this
+   * dummy version.
+   *
+   * @throws UnsupportedOperationException always
+   * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
+   *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
+   *     Comparable, Object, Comparable, Object)}.</b>
+   */
+  @DoNotCall("Pass keys of type Comparable")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Not supported. <b>You are attempting to create a map that may contain non-{@code Comparable}
+   * keys.</b> Proper calls will resolve to the version in {@code ImmutableSortedMap}, not this
+   * dummy version.
+   *
+   * @throws UnsupportedOperationException always
+   * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
+   *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
+   *     Comparable, Object, Comparable, Object)}.</b>
+   */
+  @DoNotCall("Pass keys of type Comparable")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Not supported. <b>You are attempting to create a map that may contain non-{@code Comparable}
+   * keys.</b> Proper calls will resolve to the version in {@code ImmutableSortedMap}, not this
+   * dummy version.
+   *
+   * @throws UnsupportedOperationException always
+   * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
+   *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
+   *     Comparable, Object, Comparable, Object)}.</b>
+   */
+  @DoNotCall("Pass keys of type Comparable")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9,
+      K k10,
+      V v10) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Not supported. Use {@code ImmutableSortedMap.copyOf(ImmutableMap.ofEntries(...))}.
+   *
+   * @deprecated Use {@code ImmutableSortedMap.copyOf(ImmutableMap.ofEntries(...))}.
+   */
+  @DoNotCall("ImmutableSortedMap.ofEntries not currently available; use ImmutableSortedMap.copyOf")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> ofEntries(
+      Entry<? extends K, ? extends V>... entries) {
+    throw new UnsupportedOperationException();
+  }
+
   // No copyOf() fauxveride; see ImmutableSortedSetFauxverideShim.
 }
diff --git a/android/guava/src/com/google/common/collect/ImmutableSortedMultiset.java b/android/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
index 1b4cec7..5a7529e 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
@@ -21,6 +21,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.math.IntMath;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.io.Serializable;
 import java.util.Arrays;
@@ -29,6 +30,7 @@
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link SortedMultiset} whose contents will never change, with many other important properties
@@ -47,11 +49,16 @@
  * @since 12.0
  */
 @GwtIncompatible // hasn't been tested yet
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableSortedMultiset<E> extends ImmutableSortedMultisetFauxverideShim<E>
     implements SortedMultiset<E> {
   // TODO(lowasser): GWT compatibility
 
-  /** Returns the empty immutable sorted multiset. */
+  /**
+   * Returns the empty immutable sorted multiset.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked")
   public static <E> ImmutableSortedMultiset<E> of() {
     return (ImmutableSortedMultiset) RegularImmutableSortedMultiset.NATURAL_EMPTY_MULTISET;
@@ -71,7 +78,6 @@
    *
    * @throws NullPointerException if any element is null
    */
-  @SuppressWarnings("unchecked")
   public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(E e1, E e2) {
     return copyOf(Ordering.natural(), Arrays.asList(e1, e2));
   }
@@ -82,7 +88,6 @@
    *
    * @throws NullPointerException if any element is null
    */
-  @SuppressWarnings("unchecked")
   public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(E e1, E e2, E e3) {
     return copyOf(Ordering.natural(), Arrays.asList(e1, e2, e3));
   }
@@ -93,7 +98,6 @@
    *
    * @throws NullPointerException if any element is null
    */
-  @SuppressWarnings("unchecked")
   public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(
       E e1, E e2, E e3, E e4) {
     return copyOf(Ordering.natural(), Arrays.asList(e1, e2, e3, e4));
@@ -105,7 +109,6 @@
    *
    * @throws NullPointerException if any element is null
    */
-  @SuppressWarnings("unchecked")
   public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(
       E e1, E e2, E e3, E e4, E e5) {
     return copyOf(Ordering.natural(), Arrays.asList(e1, e2, e3, e4, e5));
@@ -117,7 +120,6 @@
    *
    * @throws NullPointerException if any element is null
    */
-  @SuppressWarnings("unchecked")
   public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(
       E e1, E e2, E e3, E e4, E e5, E e6, E... remaining) {
     int size = remaining.length + 6;
@@ -281,7 +283,7 @@
   @Override
   public abstract ImmutableSortedSet<E> elementSet();
 
-  @LazyInit transient ImmutableSortedMultiset<E> descendingMultiset;
+  @LazyInit @CheckForNull transient ImmutableSortedMultiset<E> descendingMultiset;
 
   @Override
   public ImmutableSortedMultiset<E> descendingMultiset() {
@@ -306,6 +308,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final Entry<E> pollFirstEntry() {
     throw new UnsupportedOperationException();
   }
@@ -321,6 +325,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final Entry<E> pollLastEntry() {
     throw new UnsupportedOperationException();
   }
diff --git a/android/guava/src/com/google/common/collect/ImmutableSortedMultisetFauxverideShim.java b/android/guava/src/com/google/common/collect/ImmutableSortedMultisetFauxverideShim.java
index 39d41ed..c8a7ed7 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSortedMultisetFauxverideShim.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSortedMultisetFauxverideShim.java
@@ -15,6 +15,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotCall;
 
 /**
  * "Overrides" the {@link ImmutableMultiset} static methods that lack {@link
@@ -34,6 +35,7 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class ImmutableSortedMultisetFauxverideShim<E> extends ImmutableMultiset<E> {
   /**
    * Not supported. Use {@link ImmutableSortedMultiset#naturalOrder}, which offers better
@@ -43,6 +45,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link ImmutableSortedMultiset#naturalOrder}, which offers better type-safety.
    */
+  @DoNotCall("Use naturalOrder.")
   @Deprecated
   public static <E> ImmutableSortedMultiset.Builder<E> builder() {
     throw new UnsupportedOperationException();
@@ -57,6 +60,7 @@
    * @deprecated <b>Pass a parameter of type {@code Comparable} to use {@link
    *     ImmutableSortedMultiset#of(Comparable)}.</b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(E element) {
     throw new UnsupportedOperationException();
@@ -71,6 +75,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedMultiset#of(Comparable, Comparable)}.</b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(E e1, E e2) {
     throw new UnsupportedOperationException();
@@ -85,6 +90,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedMultiset#of(Comparable, Comparable, Comparable)}.</b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(E e1, E e2, E e3) {
     throw new UnsupportedOperationException();
@@ -99,6 +105,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedMultiset#of(Comparable, Comparable, Comparable, Comparable)}. </b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(E e1, E e2, E e3, E e4) {
     throw new UnsupportedOperationException();
@@ -114,6 +121,7 @@
    *     ImmutableSortedMultiset#of(Comparable, Comparable, Comparable, Comparable, Comparable)} .
    *     </b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(E e1, E e2, E e3, E e4, E e5) {
     throw new UnsupportedOperationException();
@@ -129,6 +137,7 @@
    *     ImmutableSortedMultiset#of(Comparable, Comparable, Comparable, Comparable, Comparable,
    *     Comparable, Comparable...)} . </b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(
       E e1, E e2, E e3, E e4, E e5, E e6, E... remaining) {
@@ -144,6 +153,7 @@
    * @deprecated <b>Pass parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedMultiset#copyOf(Comparable[])}.</b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> copyOf(E[] elements) {
     throw new UnsupportedOperationException();
diff --git a/android/guava/src/com/google/common/collect/ImmutableSortedSet.java b/android/guava/src/com/google/common/collect/ImmutableSortedSet.java
index 485bfa5..fabf599 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSortedSet.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSortedSet.java
@@ -23,6 +23,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
@@ -34,7 +35,8 @@
 import java.util.Iterator;
 import java.util.NavigableSet;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link NavigableSet} whose contents will never change, with many other important properties
@@ -56,6 +58,7 @@
 // TODO(benyu): benchmark and optimize all creation paths, which are a mess now
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableSortedSet<E> extends ImmutableSortedSetFauxverideShim<E>
     implements NavigableSet<E>, SortedIterable<E> {
   static <E> RegularImmutableSortedSet<E> emptySet(Comparator<? super E> comparator) {
@@ -66,7 +69,11 @@
     }
   }
 
-  /** Returns the empty immutable sorted set. */
+  /**
+   * Returns the empty immutable sorted set.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   public static <E> ImmutableSortedSet<E> of() {
     return (ImmutableSortedSet<E>) RegularImmutableSortedSet.NATURAL_EMPTY_SET;
   }
@@ -480,6 +487,13 @@
       return this;
     }
 
+    @CanIgnoreReturnValue
+    @Override
+    Builder<E> combine(ImmutableSet.Builder<E> builder) {
+      super.combine(builder);
+      return this;
+    }
+
     /**
      * Returns a newly-created {@code ImmutableSortedSet} based on the contents of the {@code
      * Builder} and its comparator.
@@ -495,16 +509,16 @@
     }
   }
 
-  int unsafeCompare(Object a, Object b) {
+  int unsafeCompare(Object a, @CheckForNull Object b) {
     return unsafeCompare(comparator, a, b);
   }
 
-  static int unsafeCompare(Comparator<?> comparator, Object a, Object b) {
+  static int unsafeCompare(Comparator<?> comparator, Object a, @CheckForNull Object b) {
     // Pretend the comparator can compare anything. If it turns out it can't
-    // compare a and b, we should get a CCE on the subsequent line. Only methods
-    // that are spec'd to throw CCE should call this.
-    @SuppressWarnings("unchecked")
-    Comparator<Object> unsafeComparator = (Comparator<Object>) comparator;
+    // compare a and b, we should get a CCE or NPE on the subsequent line. Only methods
+    // that are spec'd to throw CCE and NPE should call this.
+    @SuppressWarnings({"unchecked", "nullness"})
+    Comparator<@Nullable Object> unsafeComparator = (Comparator<@Nullable Object>) comparator;
     return unsafeComparator.compare(a, b);
   }
 
@@ -611,18 +625,21 @@
   /** @since 12.0 */
   @GwtIncompatible // NavigableSet
   @Override
+  @CheckForNull
   public E lower(E e) {
     return Iterators.getNext(headSet(e, false).descendingIterator(), null);
   }
 
   /** @since 12.0 */
   @Override
+  @CheckForNull
   public E floor(E e) {
     return Iterators.getNext(headSet(e, true).descendingIterator(), null);
   }
 
   /** @since 12.0 */
   @Override
+  @CheckForNull
   public E ceiling(E e) {
     return Iterables.getFirst(tailSet(e, true), null);
   }
@@ -630,6 +647,7 @@
   /** @since 12.0 */
   @GwtIncompatible // NavigableSet
   @Override
+  @CheckForNull
   public E higher(E e) {
     return Iterables.getFirst(tailSet(e, false), null);
   }
@@ -655,6 +673,8 @@
   @Deprecated
   @GwtIncompatible // NavigableSet
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final E pollFirst() {
     throw new UnsupportedOperationException();
   }
@@ -670,12 +690,15 @@
   @Deprecated
   @GwtIncompatible // NavigableSet
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final E pollLast() {
     throw new UnsupportedOperationException();
   }
 
   @GwtIncompatible // NavigableSet
   @LazyInit
+  @CheckForNull
   transient ImmutableSortedSet<E> descendingSet;
 
   /** @since 12.0 */
@@ -703,7 +726,7 @@
   public abstract UnmodifiableIterator<E> descendingIterator();
 
   /** Returns the position of an element within the set, or -1 if not present. */
-  abstract int indexOf(@NullableDecl Object target);
+  abstract int indexOf(@CheckForNull Object target);
 
   /*
    * This class is used to serialize all ImmutableSortedSet instances,
diff --git a/android/guava/src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java b/android/guava/src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java
index 9d2af2c..ca19d79 100644
--- a/android/guava/src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java
+++ b/android/guava/src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotCall;
 
 /**
  * "Overrides" the {@link ImmutableSet} static methods that lack {@link ImmutableSortedSet}
@@ -36,6 +37,7 @@
  * @author Chris Povirk
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class ImmutableSortedSetFauxverideShim<E> extends ImmutableSet<E> {
   /**
    * Not supported. Use {@link ImmutableSortedSet#naturalOrder}, which offers better type-safety,
@@ -45,6 +47,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link ImmutableSortedSet#naturalOrder}, which offers better type-safety.
    */
+  @DoNotCall("Use naturalOrder")
   @Deprecated
   public static <E> ImmutableSortedSet.Builder<E> builder() {
     throw new UnsupportedOperationException();
@@ -57,6 +60,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Not supported by ImmutableSortedSet.
    */
+  @DoNotCall("Use naturalOrder (which does not accept an expected size)")
   @Deprecated
   public static <E> ImmutableSortedSet.Builder<E> builderWithExpectedSize(int expectedSize) {
     throw new UnsupportedOperationException();
@@ -71,6 +75,7 @@
    * @deprecated <b>Pass a parameter of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#of(Comparable)}.</b>
    */
+  @DoNotCall("Pass a parameter of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E element) {
     throw new UnsupportedOperationException();
@@ -85,6 +90,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#of(Comparable, Comparable)}.</b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E e1, E e2) {
     throw new UnsupportedOperationException();
@@ -99,6 +105,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#of(Comparable, Comparable, Comparable)}.</b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E e1, E e2, E e3) {
     throw new UnsupportedOperationException();
@@ -113,6 +120,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#of(Comparable, Comparable, Comparable, Comparable)}. </b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E e1, E e2, E e3, E e4) {
     throw new UnsupportedOperationException();
@@ -127,6 +135,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#of( Comparable, Comparable, Comparable, Comparable, Comparable)}. </b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E e1, E e2, E e3, E e4, E e5) {
     throw new UnsupportedOperationException();
@@ -142,6 +151,7 @@
    *     ImmutableSortedSet#of(Comparable, Comparable, Comparable, Comparable, Comparable,
    *     Comparable, Comparable...)}. </b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E... remaining) {
     throw new UnsupportedOperationException();
@@ -156,6 +166,7 @@
    * @deprecated <b>Pass parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#copyOf(Comparable[])}.</b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> copyOf(E[] elements) {
     throw new UnsupportedOperationException();
diff --git a/android/guava/src/com/google/common/collect/ImmutableTable.java b/android/guava/src/com/google/common/collect/ImmutableTable.java
index a833423..9dcb50c 100644
--- a/android/guava/src/com/google/common/collect/ImmutableTable.java
+++ b/android/guava/src/com/google/common/collect/ImmutableTable.java
@@ -21,13 +21,14 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.MoreObjects;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link Table} whose contents will never change, with many other important properties detailed
@@ -40,9 +41,15 @@
  * @since 11.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableTable<R, C, V> extends AbstractTable<R, C, V>
     implements Serializable {
-  /** Returns an empty immutable table. */
+
+  /**
+   * Returns an empty immutable table.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked")
   public static <R, C, V> ImmutableTable<R, C, V> of() {
     return (ImmutableTable<R, C, V>) SparseImmutableTable.EMPTY;
@@ -77,7 +84,7 @@
     }
   }
 
-  private static <R, C, V> ImmutableTable<R, C, V> copyOf(
+  static <R, C, V> ImmutableTable<R, C, V> copyOf(
       Iterable<? extends Cell<? extends R, ? extends C, ? extends V>> cells) {
     ImmutableTable.Builder<R, C, V> builder = ImmutableTable.builder();
     for (Cell<? extends R, ? extends C, ? extends V> cell : cells) {
@@ -115,7 +122,7 @@
    *         .put(1, 'A', "foo")
    *         .put(1, 'B', "bar")
    *         .put(2, 'A', "baz")
-   *         .build();
+   *         .buildOrThrow();
    * }</pre>
    *
    * <p>By default, the order in which cells are added to the builder determines the iteration
@@ -126,16 +133,16 @@
    * <p>For empty or single-cell immutable tables, {@link #of()} and {@link #of(Object, Object,
    * Object)} are even more convenient.
    *
-   * <p>Builder instances can be reused - it is safe to call {@link #build} multiple times to build
-   * multiple tables in series. Each table is a superset of the tables created before it.
+   * <p>Builder instances can be reused - it is safe to call {@link #buildOrThrow} multiple times to
+   * build multiple tables in series. Each table is a superset of the tables created before it.
    *
    * @since 11.0
    */
   @DoNotMock
   public static final class Builder<R, C, V> {
     private final List<Cell<R, C, V>> cells = Lists.newArrayList();
-    @NullableDecl private Comparator<? super R> rowComparator;
-    @NullableDecl private Comparator<? super C> columnComparator;
+    @CheckForNull private Comparator<? super R> rowComparator;
+    @CheckForNull private Comparator<? super C> columnComparator;
 
     /**
      * Creates a new builder. The returned builder is equivalent to the builder generated by {@link
@@ -200,12 +207,33 @@
       return this;
     }
 
+    @CanIgnoreReturnValue
+    Builder<R, C, V> combine(Builder<R, C, V> other) {
+      this.cells.addAll(other.cells);
+      return this;
+    }
+
     /**
      * Returns a newly-created immutable table.
      *
+     * <p>Prefer the equivalent method {@link #buildOrThrow()} to make it explicit that the method
+     * will throw an exception if there are duplicate key pairs. The {@code build()} method will
+     * soon be deprecated.
+     *
      * @throws IllegalArgumentException if duplicate key pairs were added
      */
     public ImmutableTable<R, C, V> build() {
+      return buildOrThrow();
+    }
+
+    /**
+     * Returns a newly-created immutable table, or throws an exception if duplicate key pairs were
+     * added.
+     *
+     * @throws IllegalArgumentException if duplicate key pairs were added
+     * @since 31.0
+     */
+    public ImmutableTable<R, C, V> buildOrThrow() {
       int size = cells.size();
       switch (size) {
         case 0:
@@ -299,12 +327,12 @@
   public abstract ImmutableMap<R, Map<C, V>> rowMap();
 
   @Override
-  public boolean contains(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+  public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return get(rowKey, columnKey) != null;
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return values().contains(value);
   }
 
@@ -316,6 +344,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void clear() {
     throw new UnsupportedOperationException();
   }
@@ -329,6 +358,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final V put(R rowKey, C columnKey, V value) {
     throw new UnsupportedOperationException();
   }
@@ -341,6 +372,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void putAll(Table<? extends R, ? extends C, ? extends V> table) {
     throw new UnsupportedOperationException();
   }
@@ -354,7 +386,9 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public final V remove(Object rowKey, Object columnKey) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
+  public final V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     throw new UnsupportedOperationException();
   }
 
diff --git a/android/guava/src/com/google/common/collect/IndexedImmutableSet.java b/android/guava/src/com/google/common/collect/IndexedImmutableSet.java
index a31d3b2..25aae94 100644
--- a/android/guava/src/com/google/common/collect/IndexedImmutableSet.java
+++ b/android/guava/src/com/google/common/collect/IndexedImmutableSet.java
@@ -18,8 +18,10 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class IndexedImmutableSet<E> extends ImmutableSet<E> {
   abstract E get(int index);
 
@@ -30,7 +32,7 @@
 
   @Override
   @GwtIncompatible
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     return asList().copyIntoArray(dst, offset);
   }
 
diff --git a/android/guava/src/com/google/common/collect/Interner.java b/android/guava/src/com/google/common/collect/Interner.java
index 310bfca..bfc2035 100644
--- a/android/guava/src/com/google/common/collect/Interner.java
+++ b/android/guava/src/com/google/common/collect/Interner.java
@@ -16,7 +16,6 @@
 
 package com.google.common.collect;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.DoNotMock;
@@ -32,9 +31,9 @@
  * @author Kevin Bourrillion
  * @since 3.0
  */
-@Beta
 @DoNotMock("Use Interners.new*Interner")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface Interner<E> {
   /**
    * Chooses and returns the representative instance for any of a collection of instances that are
diff --git a/android/guava/src/com/google/common/collect/Interners.java b/android/guava/src/com/google/common/collect/Interners.java
index 061a1cf..a3ae374 100644
--- a/android/guava/src/com/google/common/collect/Interners.java
+++ b/android/guava/src/com/google/common/collect/Interners.java
@@ -16,13 +16,13 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Equivalence;
 import com.google.common.base.Function;
 import com.google.common.collect.MapMaker.Dummy;
 import com.google.common.collect.MapMakerInternalMap.InternalEntry;
+import javax.annotation.CheckForNull;
 
 /**
  * Contains static methods pertaining to instances of {@link Interner}.
@@ -30,8 +30,8 @@
  * @author Kevin Bourrillion
  * @since 3.0
  */
-@Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Interners {
   private Interners() {}
 
@@ -124,11 +124,15 @@
     public E intern(E sample) {
       while (true) {
         // trying to read the canonical...
-        InternalEntry<E, Dummy, ?> entry = map.getEntry(sample);
+        @SuppressWarnings("rawtypes") // using raw types to avoid a bug in our nullness checker :(
+        InternalEntry entry = map.getEntry(sample);
         if (entry != null) {
-          E canonical = entry.getKey();
+          Object canonical = entry.getKey();
           if (canonical != null) { // only matters if weak/soft keys are used
-            return canonical;
+            // The compiler would know this is safe if not for our use of raw types (see above).
+            @SuppressWarnings("unchecked")
+            E result = (E) canonical;
+            return result;
           }
         }
 
@@ -176,7 +180,7 @@
     }
 
     @Override
-    public boolean equals(Object other) {
+    public boolean equals(@CheckForNull Object other) {
       if (other instanceof InternerFunction) {
         InternerFunction<?> that = (InternerFunction<?>) other;
         return interner.equals(that.interner);
diff --git a/android/guava/src/com/google/common/collect/Iterables.java b/android/guava/src/com/google/common/collect/Iterables.java
index 08df7f2..2b4edb2 100644
--- a/android/guava/src/com/google/common/collect/Iterables.java
+++ b/android/guava/src/com/google/common/collect/Iterables.java
@@ -36,7 +36,8 @@
 import java.util.Queue;
 import java.util.RandomAccess;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An assortment of mainly legacy static utility methods that operate on or return objects of type
@@ -61,11 +62,13 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Iterables {
   private Iterables() {}
 
   /** Returns an unmodifiable view of {@code iterable}. */
-  public static <T> Iterable<T> unmodifiableIterable(final Iterable<? extends T> iterable) {
+  public static <T extends @Nullable Object> Iterable<T> unmodifiableIterable(
+      final Iterable<? extends T> iterable) {
     checkNotNull(iterable);
     if (iterable instanceof UnmodifiableIterable || iterable instanceof ImmutableCollection) {
       @SuppressWarnings("unchecked") // Since it's unmodifiable, the covariant cast is safe
@@ -86,7 +89,8 @@
     return checkNotNull(iterable);
   }
 
-  private static final class UnmodifiableIterable<T> extends FluentIterable<T> {
+  private static final class UnmodifiableIterable<T extends @Nullable Object>
+      extends FluentIterable<T> {
     private final Iterable<? extends T> iterable;
 
     private UnmodifiableIterable(Iterable<? extends T> iterable) {
@@ -118,7 +122,9 @@
    * cases where {@link Collection#contains} might throw {@link NullPointerException} or {@link
    * ClassCastException}.
    */
-  public static boolean contains(Iterable<?> iterable, @NullableDecl Object element) {
+  // <? extends @Nullable Object> instead of <?> because of Kotlin b/189937072, discussed in Joiner.
+  public static boolean contains(
+      Iterable<? extends @Nullable Object> iterable, @CheckForNull Object element) {
     if (iterable instanceof Collection) {
       Collection<?> collection = (Collection<?>) iterable;
       return Collections2.safeContains(collection, element);
@@ -174,14 +180,15 @@
    * @since 2.0
    */
   @CanIgnoreReturnValue
-  public static <T> boolean removeIf(Iterable<T> removeFrom, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean removeIf(
+      Iterable<T> removeFrom, Predicate<? super T> predicate) {
     if (removeFrom instanceof RandomAccess && removeFrom instanceof List) {
       return removeIfFromRandomAccessList((List<T>) removeFrom, checkNotNull(predicate));
     }
     return Iterators.removeIf(removeFrom.iterator(), predicate);
   }
 
-  private static <T> boolean removeIfFromRandomAccessList(
+  private static <T extends @Nullable Object> boolean removeIfFromRandomAccessList(
       List<T> list, Predicate<? super T> predicate) {
     // Note: Not all random access lists support set(). Additionally, it's possible
     // for a list to reject setting an element, such as when the list does not permit
@@ -213,7 +220,7 @@
     return from != to;
   }
 
-  private static <T> void slowRemoveIfForRemainingElements(
+  private static <T extends @Nullable Object> void slowRemoveIfForRemainingElements(
       List<T> list, Predicate<? super T> predicate, int to, int from) {
     // Here we know that:
     // * (to < from) and that both are valid indices.
@@ -237,8 +244,9 @@
   }
 
   /** Removes and returns the first matching element, or returns {@code null} if there is none. */
-  @NullableDecl
-  static <T> T removeFirstMatching(Iterable<T> removeFrom, Predicate<? super T> predicate) {
+  @CheckForNull
+  static <T extends @Nullable Object> T removeFirstMatching(
+      Iterable<T> removeFrom, Predicate<? super T> predicate) {
     checkNotNull(predicate);
     Iterator<T> iterator = removeFrom.iterator();
     while (iterator.hasNext()) {
@@ -288,7 +296,8 @@
    * @throws NoSuchElementException if the iterable is empty
    * @throws IllegalArgumentException if the iterable contains multiple elements
    */
-  public static <T> T getOnlyElement(Iterable<T> iterable) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getOnlyElement(Iterable<T> iterable) {
     return Iterators.getOnlyElement(iterable.iterator());
   }
 
@@ -301,8 +310,9 @@
    *
    * @throws IllegalArgumentException if the iterator contains multiple elements
    */
-  @NullableDecl
-  public static <T> T getOnlyElement(Iterable<? extends T> iterable, @NullableDecl T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getOnlyElement(
+      Iterable<? extends T> iterable, @ParametricNullness T defaultValue) {
     return Iterators.getOnlyElement(iterable.iterator(), defaultValue);
   }
 
@@ -314,11 +324,16 @@
    * @return a newly-allocated array into which all the elements of the iterable have been copied
    */
   @GwtIncompatible // Array.newInstance(Class, int)
-  public static <T> T[] toArray(Iterable<? extends T> iterable, Class<T> type) {
+  /*
+   * If we could express Class<@Nonnull T>, we could generalize the type parameter to <T extends
+   * @Nullable Object>, and then we could accept an Iterable<? extends T> and return a plain T[]
+   * instead of a @Nullable T[].
+   */
+  public static <T> @Nullable T[] toArray(Iterable<? extends @Nullable T> iterable, Class<T> type) {
     return toArray(iterable, ObjectArrays.newArray(type, 0));
   }
 
-  static <T> T[] toArray(Iterable<? extends T> iterable, T[] array) {
+  static <T extends @Nullable Object> T[] toArray(Iterable<? extends T> iterable, T[] array) {
     Collection<? extends T> collection = castOrCopyToCollection(iterable);
     return collection.toArray(array);
   }
@@ -329,7 +344,7 @@
    * @param iterable the iterable to copy
    * @return a newly-allocated array into which all the elements of the iterable have been copied
    */
-  static Object[] toArray(Iterable<?> iterable) {
+  static @Nullable Object[] toArray(Iterable<?> iterable) {
     return castOrCopyToCollection(iterable).toArray();
   }
 
@@ -338,7 +353,8 @@
    * returned. Otherwise, an {@link java.util.ArrayList} is created with the contents of the
    * iterable in the same iteration order.
    */
-  private static <E> Collection<E> castOrCopyToCollection(Iterable<E> iterable) {
+  private static <E extends @Nullable Object> Collection<E> castOrCopyToCollection(
+      Iterable<E> iterable) {
     return (iterable instanceof Collection)
         ? (Collection<E>) iterable
         : Lists.newArrayList(iterable.iterator());
@@ -350,7 +366,8 @@
    * @return {@code true} if {@code collection} was modified as a result of this operation.
    */
   @CanIgnoreReturnValue
-  public static <T> boolean addAll(Collection<T> addTo, Iterable<? extends T> elementsToAdd) {
+  public static <T extends @Nullable Object> boolean addAll(
+      Collection<T> addTo, Iterable<? extends T> elementsToAdd) {
     if (elementsToAdd instanceof Collection) {
       Collection<? extends T> c = (Collection<? extends T>) elementsToAdd;
       return addTo.addAll(c);
@@ -369,7 +386,7 @@
    * @see java.util.Collections#frequency(Collection, Object) Collections.frequency(Collection,
    *     Object)
    */
-  public static int frequency(Iterable<?> iterable, @NullableDecl Object element) {
+  public static int frequency(Iterable<?> iterable, @CheckForNull Object element) {
     if ((iterable instanceof Multiset)) {
       return ((Multiset<?>) iterable).count(element);
     } else if ((iterable instanceof Set)) {
@@ -396,7 +413,7 @@
    * <p><b>Java 8 users:</b> The {@code Stream} equivalent of this method is {@code
    * Stream.generate(() -> iterable).flatMap(Streams::stream)}.
    */
-  public static <T> Iterable<T> cycle(final Iterable<T> iterable) {
+  public static <T extends @Nullable Object> Iterable<T> cycle(final Iterable<T> iterable) {
     checkNotNull(iterable);
     return new FluentIterable<T>() {
       @Override
@@ -432,7 +449,7 @@
    * and use {@code Stream.generate(() -> collection).flatMap(Collection::stream)}.
    */
   @SafeVarargs
-  public static <T> Iterable<T> cycle(T... elements) {
+  public static <T extends @Nullable Object> Iterable<T> cycle(T... elements) {
     return cycle(Lists.newArrayList(elements));
   }
 
@@ -447,7 +464,8 @@
    * <p><b>Java 8 users:</b> The {@code Stream} equivalent of this method is {@code Stream.concat(a,
    * b)}.
    */
-  public static <T> Iterable<T> concat(Iterable<? extends T> a, Iterable<? extends T> b) {
+  public static <T extends @Nullable Object> Iterable<T> concat(
+      Iterable<? extends T> a, Iterable<? extends T> b) {
     return FluentIterable.concat(a, b);
   }
 
@@ -462,7 +480,7 @@
    * <p><b>Java 8 users:</b> The {@code Stream} equivalent of this method is {@code
    * Streams.concat(a, b, c)}.
    */
-  public static <T> Iterable<T> concat(
+  public static <T extends @Nullable Object> Iterable<T> concat(
       Iterable<? extends T> a, Iterable<? extends T> b, Iterable<? extends T> c) {
     return FluentIterable.concat(a, b, c);
   }
@@ -479,7 +497,7 @@
    * <p><b>Java 8 users:</b> The {@code Stream} equivalent of this method is {@code
    * Streams.concat(a, b, c, d)}.
    */
-  public static <T> Iterable<T> concat(
+  public static <T extends @Nullable Object> Iterable<T> concat(
       Iterable<? extends T> a,
       Iterable<? extends T> b,
       Iterable<? extends T> c,
@@ -501,7 +519,7 @@
    * @throws NullPointerException if any of the provided iterables is null
    */
   @SafeVarargs
-  public static <T> Iterable<T> concat(Iterable<? extends T>... inputs) {
+  public static <T extends @Nullable Object> Iterable<T> concat(Iterable<? extends T>... inputs) {
     return FluentIterable.concat(inputs);
   }
 
@@ -517,7 +535,8 @@
    * <p><b>Java 8 users:</b> The {@code Stream} equivalent of this method is {@code
    * streamOfStreams.flatMap(s -> s)}.
    */
-  public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs) {
+  public static <T extends @Nullable Object> Iterable<T> concat(
+      Iterable<? extends Iterable<? extends T>> inputs) {
     return FluentIterable.concat(inputs);
   }
 
@@ -539,7 +558,8 @@
    *     into partitions
    * @throws IllegalArgumentException if {@code size} is nonpositive
    */
-  public static <T> Iterable<List<T>> partition(final Iterable<T> iterable, final int size) {
+  public static <T extends @Nullable Object> Iterable<List<T>> partition(
+      final Iterable<T> iterable, final int size) {
     checkNotNull(iterable);
     checkArgument(size > 0);
     return new FluentIterable<List<T>>() {
@@ -565,12 +585,13 @@
    *     into partitions (the final iterable may have trailing null elements)
    * @throws IllegalArgumentException if {@code size} is nonpositive
    */
-  public static <T> Iterable<List<T>> paddedPartition(final Iterable<T> iterable, final int size) {
+  public static <T extends @Nullable Object> Iterable<List<@Nullable T>> paddedPartition(
+      final Iterable<T> iterable, final int size) {
     checkNotNull(iterable);
     checkArgument(size > 0);
-    return new FluentIterable<List<T>>() {
+    return new FluentIterable<List<@Nullable T>>() {
       @Override
-      public Iterator<List<T>> iterator() {
+      public Iterator<List<@Nullable T>> iterator() {
         return Iterators.paddedPartition(iterable.iterator(), size);
       }
     };
@@ -582,7 +603,7 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link Stream#filter}.
    */
-  public static <T> Iterable<T> filter(
+  public static <T extends @Nullable Object> Iterable<T> filter(
       final Iterable<T> unfiltered, final Predicate<? super T> retainIfTrue) {
     checkNotNull(unfiltered);
     checkNotNull(retainIfTrue);
@@ -621,7 +642,8 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link Stream#anyMatch}.
    */
-  public static <T> boolean any(Iterable<T> iterable, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean any(
+      Iterable<T> iterable, Predicate<? super T> predicate) {
     return Iterators.any(iterable.iterator(), predicate);
   }
 
@@ -631,7 +653,8 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link Stream#allMatch}.
    */
-  public static <T> boolean all(Iterable<T> iterable, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean all(
+      Iterable<T> iterable, Predicate<? super T> predicate) {
     return Iterators.all(iterable.iterator(), predicate);
   }
 
@@ -644,7 +667,9 @@
    *
    * @throws NoSuchElementException if no element in {@code iterable} matches the given predicate
    */
-  public static <T> T find(Iterable<T> iterable, Predicate<? super T> predicate) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T find(
+      Iterable<T> iterable, Predicate<? super T> predicate) {
     return Iterators.find(iterable.iterator(), predicate);
   }
 
@@ -658,11 +683,26 @@
    *
    * @since 7.0
    */
-  @NullableDecl
-  public static <T> T find(
+  // The signature we really want here is...
+  //
+  // <T extends @Nullable Object> @JointlyNullable T find(
+  //     Iterable<? extends T> iterable,
+  //     Predicate<? super T> predicate,
+  //     @JointlyNullable T defaultValue);
+  //
+  // ...where "@JointlyNullable" is similar to @PolyNull but slightly different:
+  //
+  // - @PolyNull means "@Nullable or @Nonnull"
+  //   (That would be unsound for an input Iterable<@Nullable Foo>. So, if we wanted to use
+  //   @PolyNull, we would have to restrict this method to non-null <T>. But it has users who pass
+  //   iterables with null elements.)
+  //
+  // - @JointlyNullable means "@Nullable or no annotation"
+  @CheckForNull
+  public static <T extends @Nullable Object> T find(
       Iterable<? extends T> iterable,
       Predicate<? super T> predicate,
-      @NullableDecl T defaultValue) {
+      @CheckForNull T defaultValue) {
     return Iterators.find(iterable.iterator(), predicate, defaultValue);
   }
 
@@ -691,7 +731,8 @@
    *
    * @since 2.0
    */
-  public static <T> int indexOf(Iterable<T> iterable, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> int indexOf(
+      Iterable<T> iterable, Predicate<? super T> predicate) {
     return Iterators.indexOf(iterable.iterator(), predicate);
   }
 
@@ -708,7 +749,7 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link Stream#map}
    */
-  public static <F, T> Iterable<T> transform(
+  public static <F extends @Nullable Object, T extends @Nullable Object> Iterable<T> transform(
       final Iterable<F> fromIterable, final Function<? super F, ? extends T> function) {
     checkNotNull(fromIterable);
     checkNotNull(function);
@@ -731,7 +772,8 @@
    * @throws IndexOutOfBoundsException if {@code position} is negative or greater than or equal to
    *     the size of {@code iterable}
    */
-  public static <T> T get(Iterable<T> iterable, int position) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T get(Iterable<T> iterable, int position) {
     checkNotNull(iterable);
     return (iterable instanceof List)
         ? ((List<T>) iterable).get(position)
@@ -753,9 +795,9 @@
    * @throws IndexOutOfBoundsException if {@code position} is negative
    * @since 4.0
    */
-  @NullableDecl
-  public static <T> T get(
-      Iterable<? extends T> iterable, int position, @NullableDecl T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T get(
+      Iterable<? extends T> iterable, int position, @ParametricNullness T defaultValue) {
     checkNotNull(iterable);
     Iterators.checkNonnegative(position);
     if (iterable instanceof List) {
@@ -785,8 +827,9 @@
    * @return the first element of {@code iterable} or the default value
    * @since 7.0
    */
-  @NullableDecl
-  public static <T> T getFirst(Iterable<? extends T> iterable, @NullableDecl T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getFirst(
+      Iterable<? extends T> iterable, @ParametricNullness T defaultValue) {
     return Iterators.getNext(iterable.iterator(), defaultValue);
   }
 
@@ -799,7 +842,8 @@
    * @return the last element of {@code iterable}
    * @throws NoSuchElementException if the iterable is empty
    */
-  public static <T> T getLast(Iterable<T> iterable) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getLast(Iterable<T> iterable) {
     // TODO(kevinb): Support a concurrently modified collection?
     if (iterable instanceof List) {
       List<T> list = (List<T>) iterable;
@@ -823,8 +867,9 @@
    * @return the last element of {@code iterable} or the default value
    * @since 3.0
    */
-  @NullableDecl
-  public static <T> T getLast(Iterable<? extends T> iterable, @NullableDecl T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getLast(
+      Iterable<? extends T> iterable, @ParametricNullness T defaultValue) {
     if (iterable instanceof Collection) {
       Collection<? extends T> c = (Collection<? extends T>) iterable;
       if (c.isEmpty()) {
@@ -837,7 +882,8 @@
     return Iterators.getLast(iterable.iterator(), defaultValue);
   }
 
-  private static <T> T getLastInNonemptyList(List<T> list) {
+  @ParametricNullness
+  private static <T extends @Nullable Object> T getLastInNonemptyList(List<T> list) {
     return list.get(list.size() - 1);
   }
 
@@ -860,7 +906,8 @@
    *
    * @since 3.0
    */
-  public static <T> Iterable<T> skip(final Iterable<T> iterable, final int numberToSkip) {
+  public static <T extends @Nullable Object> Iterable<T> skip(
+      final Iterable<T> iterable, final int numberToSkip) {
     checkNotNull(iterable);
     checkArgument(numberToSkip >= 0, "number to skip cannot be negative");
 
@@ -890,6 +937,7 @@
           }
 
           @Override
+          @ParametricNullness
           public T next() {
             T result = iterator.next();
             atStart = false; // not called if next() fails
@@ -919,7 +967,8 @@
    * @throws IllegalArgumentException if {@code limitSize} is negative
    * @since 3.0
    */
-  public static <T> Iterable<T> limit(final Iterable<T> iterable, final int limitSize) {
+  public static <T extends @Nullable Object> Iterable<T> limit(
+      final Iterable<T> iterable, final int limitSize) {
     checkNotNull(iterable);
     checkArgument(limitSize >= 0, "limit is negative");
     return new FluentIterable<T>() {
@@ -946,7 +995,8 @@
    * @see Iterators#consumingIterator(Iterator)
    * @since 2.0
    */
-  public static <T> Iterable<T> consumingIterable(final Iterable<T> iterable) {
+  public static <T extends @Nullable Object> Iterable<T> consumingIterable(
+      final Iterable<T> iterable) {
     checkNotNull(iterable);
 
     return new FluentIterable<T>() {
@@ -997,7 +1047,7 @@
    * @since 11.0
    */
   @Beta
-  public static <T> Iterable<T> mergeSorted(
+  public static <T extends @Nullable Object> Iterable<T> mergeSorted(
       final Iterable<? extends Iterable<? extends T>> iterables,
       final Comparator<? super T> comparator) {
     checkNotNull(iterables, "iterables");
@@ -1015,7 +1065,8 @@
 
   // TODO(user): Is this the best place for this? Move to fluent functions?
   // Useful as a public method?
-  static <T> Function<Iterable<? extends T>, Iterator<? extends T>> toIterator() {
+  static <T extends @Nullable Object>
+      Function<Iterable<? extends T>, Iterator<? extends T>> toIterator() {
     return new Function<Iterable<? extends T>, Iterator<? extends T>>() {
       @Override
       public Iterator<? extends T> apply(Iterable<? extends T> iterable) {
diff --git a/android/guava/src/com/google/common/collect/Iterators.java b/android/guava/src/com/google/common/collect/Iterators.java
index ac36b20..5ea2da9 100644
--- a/android/guava/src/com/google/common/collect/Iterators.java
+++ b/android/guava/src/com/google/common/collect/Iterators.java
@@ -21,6 +21,8 @@
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.base.Predicates.instanceOf;
 import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -45,7 +47,8 @@
 import java.util.NoSuchElementException;
 import java.util.PriorityQueue;
 import java.util.Queue;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * This class contains static utility methods that operate on or return objects of type {@link
@@ -65,6 +68,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Iterators {
   private Iterators() {}
 
@@ -73,7 +77,7 @@
    *
    * <p>The {@link Iterable} equivalent of this method is {@link ImmutableSet#of()}.
    */
-  static <T> UnmodifiableIterator<T> emptyIterator() {
+  static <T extends @Nullable Object> UnmodifiableIterator<T> emptyIterator() {
     return emptyListIterator();
   }
 
@@ -84,7 +88,7 @@
    */
   // Casting to any type is safe since there are no actual elements.
   @SuppressWarnings("unchecked")
-  static <T> UnmodifiableListIterator<T> emptyListIterator() {
+  static <T extends @Nullable Object> UnmodifiableListIterator<T> emptyListIterator() {
     return (UnmodifiableListIterator<T>) ArrayItr.EMPTY;
   }
 
@@ -117,12 +121,12 @@
    */
   // Casting to any type is safe since there are no actual elements.
   @SuppressWarnings("unchecked")
-  static <T> Iterator<T> emptyModifiableIterator() {
+  static <T extends @Nullable Object> Iterator<T> emptyModifiableIterator() {
     return (Iterator<T>) EmptyModifiableIterator.INSTANCE;
   }
 
   /** Returns an unmodifiable view of {@code iterator}. */
-  public static <T> UnmodifiableIterator<T> unmodifiableIterator(
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> unmodifiableIterator(
       final Iterator<? extends T> iterator) {
     checkNotNull(iterator);
     if (iterator instanceof UnmodifiableIterator) {
@@ -137,6 +141,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         return iterator.next();
       }
@@ -150,7 +155,8 @@
    * @since 10.0
    */
   @Deprecated
-  public static <T> UnmodifiableIterator<T> unmodifiableIterator(UnmodifiableIterator<T> iterator) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> unmodifiableIterator(
+      UnmodifiableIterator<T> iterator) {
     return checkNotNull(iterator);
   }
 
@@ -168,7 +174,7 @@
   }
 
   /** Returns {@code true} if {@code iterator} contains {@code element}. */
-  public static boolean contains(Iterator<?> iterator, @NullableDecl Object element) {
+  public static boolean contains(Iterator<?> iterator, @CheckForNull Object element) {
     if (element == null) {
       while (iterator.hasNext()) {
         if (iterator.next() == null) {
@@ -216,7 +222,8 @@
    * @since 2.0
    */
   @CanIgnoreReturnValue
-  public static <T> boolean removeIf(Iterator<T> removeFrom, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean removeIf(
+      Iterator<T> removeFrom, Predicate<? super T> predicate) {
     checkNotNull(predicate);
     boolean modified = false;
     while (removeFrom.hasNext()) {
@@ -297,7 +304,8 @@
    * @throws IllegalArgumentException if the iterator contains multiple elements. The state of the
    *     iterator is unspecified.
    */
-  public static <T> T getOnlyElement(Iterator<T> iterator) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getOnlyElement(Iterator<T> iterator) {
     T first = iterator.next();
     if (!iterator.hasNext()) {
       return first;
@@ -322,8 +330,9 @@
    * @throws IllegalArgumentException if the iterator contains multiple elements. The state of the
    *     iterator is unspecified.
    */
-  @NullableDecl
-  public static <T> T getOnlyElement(Iterator<? extends T> iterator, @NullableDecl T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getOnlyElement(
+      Iterator<? extends T> iterator, @ParametricNullness T defaultValue) {
     return iterator.hasNext() ? getOnlyElement(iterator) : defaultValue;
   }
 
@@ -336,8 +345,9 @@
    * @return a newly-allocated array into which all the elements of the iterator have been copied
    */
   @GwtIncompatible // Array.newInstance(Class, int)
-  public static <T> T[] toArray(Iterator<? extends T> iterator, Class<T> type) {
-    List<T> list = Lists.newArrayList(iterator);
+  // For discussion of this signature, see the corresponding overload of *Iterables*.toArray.
+  public static <T> @Nullable T[] toArray(Iterator<? extends @Nullable T> iterator, Class<T> type) {
+    List<@Nullable T> list = Lists.newArrayList(iterator);
     return Iterables.toArray(list, type);
   }
 
@@ -348,7 +358,8 @@
    * @return {@code true} if {@code collection} was modified as a result of this operation
    */
   @CanIgnoreReturnValue
-  public static <T> boolean addAll(Collection<T> addTo, Iterator<? extends T> iterator) {
+  public static <T extends @Nullable Object> boolean addAll(
+      Collection<T> addTo, Iterator<? extends T> iterator) {
     checkNotNull(addTo);
     checkNotNull(iterator);
     boolean wasModified = false;
@@ -364,7 +375,7 @@
    *
    * @see Collections#frequency
    */
-  public static int frequency(Iterator<?> iterator, @NullableDecl Object element) {
+  public static int frequency(Iterator<?> iterator, @CheckForNull Object element) {
     int count = 0;
     while (contains(iterator, element)) {
       // Since it lives in the same class, we know contains gets to the element and then stops,
@@ -386,7 +397,7 @@
    * should use an explicit {@code break} or be certain that you will eventually remove all the
    * elements.
    */
-  public static <T> Iterator<T> cycle(final Iterable<T> iterable) {
+  public static <T extends @Nullable Object> Iterator<T> cycle(final Iterable<T> iterable) {
     checkNotNull(iterable);
     return new Iterator<T>() {
       Iterator<T> iterator = emptyModifiableIterator();
@@ -406,6 +417,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         if (!iterator.hasNext()) {
           iterator = iterable.iterator();
@@ -436,7 +448,7 @@
    * elements.
    */
   @SafeVarargs
-  public static <T> Iterator<T> cycle(T... elements) {
+  public static <T extends @Nullable Object> Iterator<T> cycle(T... elements) {
     return cycle(Lists.newArrayList(elements));
   }
 
@@ -444,10 +456,15 @@
    * Returns an Iterator that walks the specified array, nulling out elements behind it. This can
    * avoid memory leaks when an element is no longer necessary.
    *
+   * <p>This method accepts an array with element type {@code @Nullable T}, but callers must pass an
+   * array whose contents are initially non-null. The {@code @Nullable} annotation indicates that
+   * this method will write nulls into the array during iteration.
+   *
    * <p>This is mainly just to avoid the intermediate ArrayDeque in ConsumingQueueIterator.
    */
-  private static <T> Iterator<T> consumingForArray(final T... elements) {
-    return new UnmodifiableIterator<T>() {
+  private static <I extends Iterator<?>> Iterator<I> consumingForArray(
+      final @Nullable I... elements) {
+    return new UnmodifiableIterator<I>() {
       int index = 0;
 
       @Override
@@ -456,11 +473,15 @@
       }
 
       @Override
-      public T next() {
+      public I next() {
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
-        T result = elements[index];
+        /*
+         * requireNonNull is safe because our callers always pass non-null arguments. Each element
+         * of the array becomes null only when we iterate past it and then clear it.
+         */
+        I result = requireNonNull(elements[index]);
         elements[index] = null;
         index++;
         return result;
@@ -476,7 +497,8 @@
    * <p>The returned iterator supports {@code remove()} when the corresponding input iterator
    * supports it.
    */
-  public static <T> Iterator<T> concat(Iterator<? extends T> a, Iterator<? extends T> b) {
+  public static <T extends @Nullable Object> Iterator<T> concat(
+      Iterator<? extends T> a, Iterator<? extends T> b) {
     checkNotNull(a);
     checkNotNull(b);
     return concat(consumingForArray(a, b));
@@ -490,7 +512,7 @@
    * <p>The returned iterator supports {@code remove()} when the corresponding input iterator
    * supports it.
    */
-  public static <T> Iterator<T> concat(
+  public static <T extends @Nullable Object> Iterator<T> concat(
       Iterator<? extends T> a, Iterator<? extends T> b, Iterator<? extends T> c) {
     checkNotNull(a);
     checkNotNull(b);
@@ -507,7 +529,7 @@
    * <p>The returned iterator supports {@code remove()} when the corresponding input iterator
    * supports it.
    */
-  public static <T> Iterator<T> concat(
+  public static <T extends @Nullable Object> Iterator<T> concat(
       Iterator<? extends T> a,
       Iterator<? extends T> b,
       Iterator<? extends T> c,
@@ -529,7 +551,7 @@
    *
    * @throws NullPointerException if any of the provided iterators is null
    */
-  public static <T> Iterator<T> concat(Iterator<? extends T>... inputs) {
+  public static <T extends @Nullable Object> Iterator<T> concat(Iterator<? extends T>... inputs) {
     return concatNoDefensiveCopy(Arrays.copyOf(inputs, inputs.length));
   }
 
@@ -542,12 +564,14 @@
    * supports it. The methods of the returned iterator may throw {@code NullPointerException} if any
    * of the input iterators is null.
    */
-  public static <T> Iterator<T> concat(Iterator<? extends Iterator<? extends T>> inputs) {
+  public static <T extends @Nullable Object> Iterator<T> concat(
+      Iterator<? extends Iterator<? extends T>> inputs) {
     return new ConcatenatedIterator<T>(inputs);
   }
 
   /** Concats a varargs array of iterators without making a defensive copy of the array. */
-  static <T> Iterator<T> concatNoDefensiveCopy(Iterator<? extends T>... inputs) {
+  static <T extends @Nullable Object> Iterator<T> concatNoDefensiveCopy(
+      Iterator<? extends T>... inputs) {
     for (Iterator<? extends T> input : checkNotNull(inputs)) {
       checkNotNull(input);
     }
@@ -568,7 +592,8 @@
    *     partitions
    * @throws IllegalArgumentException if {@code size} is nonpositive
    */
-  public static <T> UnmodifiableIterator<List<T>> partition(Iterator<T> iterator, int size) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<List<T>> partition(
+      Iterator<T> iterator, int size) {
     return partitionImpl(iterator, size, false);
   }
 
@@ -586,26 +611,29 @@
    *     partitions (the final iterable may have trailing null elements)
    * @throws IllegalArgumentException if {@code size} is nonpositive
    */
-  public static <T> UnmodifiableIterator<List<T>> paddedPartition(Iterator<T> iterator, int size) {
+  public static <T extends @Nullable Object>
+      UnmodifiableIterator<List<@Nullable T>> paddedPartition(Iterator<T> iterator, int size) {
     return partitionImpl(iterator, size, true);
   }
 
-  private static <T> UnmodifiableIterator<List<T>> partitionImpl(
+  private static <T extends @Nullable Object> UnmodifiableIterator<List<@Nullable T>> partitionImpl(
       final Iterator<T> iterator, final int size, final boolean pad) {
     checkNotNull(iterator);
     checkArgument(size > 0);
-    return new UnmodifiableIterator<List<T>>() {
+    return new UnmodifiableIterator<List<@Nullable T>>() {
       @Override
       public boolean hasNext() {
         return iterator.hasNext();
       }
 
       @Override
-      public List<T> next() {
+      public List<@Nullable T> next() {
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
-        Object[] array = new Object[size];
+        @SuppressWarnings("unchecked") // we only put Ts in it
+        @Nullable
+        T[] array = (@Nullable T[]) new Object[size];
         int count = 0;
         for (; count < size && iterator.hasNext(); count++) {
           array[count] = iterator.next();
@@ -614,9 +642,13 @@
           array[i] = null; // for GWT
         }
 
-        @SuppressWarnings("unchecked") // we only put Ts in it
-        List<T> list = Collections.unmodifiableList((List<T>) Arrays.asList(array));
-        return (pad || count == size) ? list : list.subList(0, count);
+        List<@Nullable T> list = Collections.unmodifiableList(Arrays.asList(array));
+        // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+        if (pad || count == size) {
+          return list;
+        } else {
+          return list.subList(0, count);
+        }
       }
     };
   }
@@ -625,12 +657,13 @@
    * Returns a view of {@code unfiltered} containing all elements that satisfy the input predicate
    * {@code retainIfTrue}.
    */
-  public static <T> UnmodifiableIterator<T> filter(
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> filter(
       final Iterator<T> unfiltered, final Predicate<? super T> retainIfTrue) {
     checkNotNull(unfiltered);
     checkNotNull(retainIfTrue);
     return new AbstractIterator<T>() {
       @Override
+      @CheckForNull
       protected T computeNext() {
         while (unfiltered.hasNext()) {
           T element = unfiltered.next();
@@ -657,7 +690,8 @@
    * Returns {@code true} if one or more elements returned by {@code iterator} satisfy the given
    * predicate.
    */
-  public static <T> boolean any(Iterator<T> iterator, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean any(
+      Iterator<T> iterator, Predicate<? super T> predicate) {
     return indexOf(iterator, predicate) != -1;
   }
 
@@ -665,7 +699,8 @@
    * Returns {@code true} if every element returned by {@code iterator} satisfies the given
    * predicate. If {@code iterator} is empty, {@code true} is returned.
    */
-  public static <T> boolean all(Iterator<T> iterator, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean all(
+      Iterator<T> iterator, Predicate<? super T> predicate) {
     checkNotNull(predicate);
     while (iterator.hasNext()) {
       T element = iterator.next();
@@ -685,7 +720,9 @@
    *
    * @throws NoSuchElementException if no element in {@code iterator} matches the given predicate
    */
-  public static <T> T find(Iterator<T> iterator, Predicate<? super T> predicate) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T find(
+      Iterator<T> iterator, Predicate<? super T> predicate) {
     checkNotNull(iterator);
     checkNotNull(predicate);
     while (iterator.hasNext()) {
@@ -705,11 +742,12 @@
    *
    * @since 7.0
    */
-  @NullableDecl
-  public static <T> T find(
+  // For discussion of this signature, see the corresponding overload of *Iterables*.find.
+  @CheckForNull
+  public static <T extends @Nullable Object> T find(
       Iterator<? extends T> iterator,
       Predicate<? super T> predicate,
-      @NullableDecl T defaultValue) {
+      @CheckForNull T defaultValue) {
     checkNotNull(iterator);
     checkNotNull(predicate);
     while (iterator.hasNext()) {
@@ -758,7 +796,8 @@
    *
    * @since 2.0
    */
-  public static <T> int indexOf(Iterator<T> iterator, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> int indexOf(
+      Iterator<T> iterator, Predicate<? super T> predicate) {
     checkNotNull(predicate, "predicate");
     for (int i = 0; iterator.hasNext(); i++) {
       T current = iterator.next();
@@ -777,12 +816,13 @@
    * successful {@code remove()} call, {@code fromIterator} no longer contains the corresponding
    * element.
    */
-  public static <F, T> Iterator<T> transform(
+  public static <F extends @Nullable Object, T extends @Nullable Object> Iterator<T> transform(
       final Iterator<F> fromIterator, final Function<? super F, ? extends T> function) {
     checkNotNull(function);
     return new TransformedIterator<F, T>(fromIterator) {
+      @ParametricNullness
       @Override
-      T transform(F from) {
+      T transform(@ParametricNullness F from) {
         return function.apply(from);
       }
     };
@@ -797,7 +837,8 @@
    * @throws IndexOutOfBoundsException if {@code position} is negative or greater than or equal to
    *     the number of elements remaining in {@code iterator}
    */
-  public static <T> T get(Iterator<T> iterator, int position) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T get(Iterator<T> iterator, int position) {
     checkNonnegative(position);
     int skipped = advance(iterator, position);
     if (!iterator.hasNext()) {
@@ -823,9 +864,9 @@
    * @throws IndexOutOfBoundsException if {@code position} is negative
    * @since 4.0
    */
-  @NullableDecl
-  public static <T> T get(
-      Iterator<? extends T> iterator, int position, @NullableDecl T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T get(
+      Iterator<? extends T> iterator, int position, @ParametricNullness T defaultValue) {
     checkNonnegative(position);
     advance(iterator, position);
     return getNext(iterator, defaultValue);
@@ -845,8 +886,9 @@
    * @return the next element of {@code iterator} or the default value
    * @since 7.0
    */
-  @NullableDecl
-  public static <T> T getNext(Iterator<? extends T> iterator, @NullableDecl T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getNext(
+      Iterator<? extends T> iterator, @ParametricNullness T defaultValue) {
     return iterator.hasNext() ? iterator.next() : defaultValue;
   }
 
@@ -856,7 +898,8 @@
    * @return the last element of {@code iterator}
    * @throws NoSuchElementException if the iterator is empty
    */
-  public static <T> T getLast(Iterator<T> iterator) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getLast(Iterator<T> iterator) {
     while (true) {
       T current = iterator.next();
       if (!iterator.hasNext()) {
@@ -873,8 +916,9 @@
    * @return the last element of {@code iterator}
    * @since 3.0
    */
-  @NullableDecl
-  public static <T> T getLast(Iterator<? extends T> iterator, @NullableDecl T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getLast(
+      Iterator<? extends T> iterator, @ParametricNullness T defaultValue) {
     return iterator.hasNext() ? getLast(iterator) : defaultValue;
   }
 
@@ -907,7 +951,8 @@
    * @throws IllegalArgumentException if {@code limitSize} is negative
    * @since 3.0
    */
-  public static <T> Iterator<T> limit(final Iterator<T> iterator, final int limitSize) {
+  public static <T extends @Nullable Object> Iterator<T> limit(
+      final Iterator<T> iterator, final int limitSize) {
     checkNotNull(iterator);
     checkArgument(limitSize >= 0, "limit is negative");
     return new Iterator<T>() {
@@ -919,6 +964,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         if (!hasNext()) {
           throw new NoSuchElementException();
@@ -945,7 +991,8 @@
    * @return an iterator that removes and returns elements from the supplied iterator
    * @since 2.0
    */
-  public static <T> Iterator<T> consumingIterator(final Iterator<T> iterator) {
+  public static <T extends @Nullable Object> Iterator<T> consumingIterator(
+      final Iterator<T> iterator) {
     checkNotNull(iterator);
     return new UnmodifiableIterator<T>() {
       @Override
@@ -954,6 +1001,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         T next = iterator.next();
         iterator.remove();
@@ -971,8 +1019,8 @@
    * Deletes and returns the next value from the iterator, or returns {@code null} if there is no
    * such value.
    */
-  @NullableDecl
-  static <T> T pollNext(Iterator<T> iterator) {
+  @CheckForNull
+  static <T extends @Nullable Object> T pollNext(Iterator<T> iterator) {
     if (iterator.hasNext()) {
       T result = iterator.next();
       iterator.remove();
@@ -1004,7 +1052,7 @@
    * {@link ImmutableList#copyOf(Object[])}}, or {@link ImmutableList#of}.
    */
   @SafeVarargs
-  public static <T> UnmodifiableIterator<T> forArray(final T... array) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> forArray(final T... array) {
     return forArray(array, 0, array.length, 0);
   }
 
@@ -1015,7 +1063,7 @@
    * <p>The {@code Iterable} equivalent of this method is {@code
    * Arrays.asList(array).subList(offset, offset + length).listIterator(index)}.
    */
-  static <T> UnmodifiableListIterator<T> forArray(
+  static <T extends @Nullable Object> UnmodifiableListIterator<T> forArray(
       final T[] array, final int offset, int length, int index) {
     checkArgument(length >= 0);
     int end = offset + length;
@@ -1029,7 +1077,8 @@
     return new ArrayItr<T>(array, offset, length, index);
   }
 
-  private static final class ArrayItr<T> extends AbstractIndexedListIterator<T> {
+  private static final class ArrayItr<T extends @Nullable Object>
+      extends AbstractIndexedListIterator<T> {
     static final UnmodifiableListIterator<Object> EMPTY = new ArrayItr<>(new Object[0], 0, 0, 0);
 
     private final T[] array;
@@ -1042,6 +1091,7 @@
     }
 
     @Override
+    @ParametricNullness
     protected T get(int index) {
       return array[offset + index];
     }
@@ -1052,7 +1102,8 @@
    *
    * <p>The {@link Iterable} equivalent of this method is {@link Collections#singleton}.
    */
-  public static <T> UnmodifiableIterator<T> singletonIterator(@NullableDecl final T value) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> singletonIterator(
+      @ParametricNullness final T value) {
     return new UnmodifiableIterator<T>() {
       boolean done;
 
@@ -1062,6 +1113,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         if (done) {
           throw new NoSuchElementException();
@@ -1082,7 +1134,8 @@
    * <p><b>Java 9 users:</b> use {@code enumeration.asIterator()} instead, unless it is important to
    * return an {@code UnmodifiableIterator} instead of a plain {@code Iterator}.
    */
-  public static <T> UnmodifiableIterator<T> forEnumeration(final Enumeration<T> enumeration) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> forEnumeration(
+      final Enumeration<T> enumeration) {
     checkNotNull(enumeration);
     return new UnmodifiableIterator<T>() {
       @Override
@@ -1091,6 +1144,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         return enumeration.nextElement();
       }
@@ -1103,7 +1157,8 @@
    * <p>The {@code Iterable} equivalent of this method is either {@link Collections#enumeration} (if
    * you have a {@link Collection}), or {@code Iterators.asEnumeration(collection.iterator())}.
    */
-  public static <T> Enumeration<T> asEnumeration(final Iterator<T> iterator) {
+  public static <T extends @Nullable Object> Enumeration<T> asEnumeration(
+      final Iterator<T> iterator) {
     checkNotNull(iterator);
     return new Enumeration<T>() {
       @Override
@@ -1112,6 +1167,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T nextElement() {
         return iterator.next();
       }
@@ -1119,11 +1175,11 @@
   }
 
   /** Implementation of PeekingIterator that avoids peeking unless necessary. */
-  private static class PeekingImpl<E> implements PeekingIterator<E> {
+  private static class PeekingImpl<E extends @Nullable Object> implements PeekingIterator<E> {
 
     private final Iterator<? extends E> iterator;
     private boolean hasPeeked;
-    @NullableDecl private E peekedElement;
+    @CheckForNull private E peekedElement;
 
     public PeekingImpl(Iterator<? extends E> iterator) {
       this.iterator = checkNotNull(iterator);
@@ -1135,11 +1191,13 @@
     }
 
     @Override
+    @ParametricNullness
     public E next() {
       if (!hasPeeked) {
         return iterator.next();
       }
-      E result = peekedElement;
+      // The cast is safe because of the hasPeeked check.
+      E result = uncheckedCastNullableTToT(peekedElement);
       hasPeeked = false;
       peekedElement = null;
       return result;
@@ -1152,12 +1210,14 @@
     }
 
     @Override
+    @ParametricNullness
     public E peek() {
       if (!hasPeeked) {
         peekedElement = iterator.next();
         hasPeeked = true;
       }
-      return peekedElement;
+      // The cast is safe because of the hasPeeked check.
+      return uncheckedCastNullableTToT(peekedElement);
     }
   }
 
@@ -1197,7 +1257,8 @@
    * @return a peeking iterator backed by that iterator. Apart from the additional {@link
    *     PeekingIterator#peek()} method, this iterator behaves exactly the same as {@code iterator}.
    */
-  public static <T> PeekingIterator<T> peekingIterator(Iterator<? extends T> iterator) {
+  public static <T extends @Nullable Object> PeekingIterator<T> peekingIterator(
+      Iterator<? extends T> iterator) {
     if (iterator instanceof PeekingImpl) {
       // Safe to cast <? extends T> to <T> because PeekingImpl only uses T
       // covariantly (and cannot be subclassed to add non-covariant uses).
@@ -1215,7 +1276,8 @@
    * @since 10.0
    */
   @Deprecated
-  public static <T> PeekingIterator<T> peekingIterator(PeekingIterator<T> iterator) {
+  public static <T extends @Nullable Object> PeekingIterator<T> peekingIterator(
+      PeekingIterator<T> iterator) {
     return checkNotNull(iterator);
   }
 
@@ -1232,7 +1294,7 @@
    * @since 11.0
    */
   @Beta
-  public static <T> UnmodifiableIterator<T> mergeSorted(
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> mergeSorted(
       Iterable<? extends Iterator<? extends T>> iterators, Comparator<? super T> comparator) {
     checkNotNull(iterators, "iterators");
     checkNotNull(comparator, "comparator");
@@ -1249,7 +1311,7 @@
    * iterators. (Retrieving all elements takes approximately O(N*log(M)) time, where N is the total
    * number of elements.)
    */
-  private static class MergingIterator<T> extends UnmodifiableIterator<T> {
+  private static class MergingIterator<T extends @Nullable Object> extends UnmodifiableIterator<T> {
     final Queue<PeekingIterator<T>> queue;
 
     public MergingIterator(
@@ -1280,6 +1342,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T next() {
       PeekingIterator<T> nextIter = queue.remove();
       T next = nextIter.next();
@@ -1290,9 +1353,9 @@
     }
   }
 
-  private static class ConcatenatedIterator<T> implements Iterator<T> {
+  private static class ConcatenatedIterator<T extends @Nullable Object> implements Iterator<T> {
     /* The last iterator to return an element.  Calls to remove() go to this iterator. */
-    @NullableDecl private Iterator<? extends T> toRemove;
+    @CheckForNull private Iterator<? extends T> toRemove;
 
     /* The iterator currently returning elements. */
     private Iterator<? extends T> iterator;
@@ -1304,10 +1367,10 @@
      * operation O(1).
      */
 
-    private Iterator<? extends Iterator<? extends T>> topMetaIterator;
+    @CheckForNull private Iterator<? extends Iterator<? extends T>> topMetaIterator;
 
     // Only becomes nonnull if we encounter nested concatenations.
-    @NullableDecl private Deque<Iterator<? extends Iterator<? extends T>>> metaIterators;
+    @CheckForNull private Deque<Iterator<? extends Iterator<? extends T>>> metaIterators;
 
     ConcatenatedIterator(Iterator<? extends Iterator<? extends T>> metaIterator) {
       iterator = emptyIterator();
@@ -1315,7 +1378,7 @@
     }
 
     // Returns a nonempty meta-iterator or, if all meta-iterators are empty, null.
-    @NullableDecl
+    @CheckForNull
     private Iterator<? extends Iterator<? extends T>> getTopMetaIterator() {
       while (topMetaIterator == null || !topMetaIterator.hasNext()) {
         if (metaIterators != null && !metaIterators.isEmpty()) {
@@ -1366,6 +1429,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T next() {
       if (hasNext()) {
         toRemove = iterator;
@@ -1377,14 +1441,16 @@
 
     @Override
     public void remove() {
-      CollectPreconditions.checkRemove(toRemove != null);
+      if (toRemove == null) {
+        throw new IllegalStateException("no calls to next() since the last call to remove()");
+      }
       toRemove.remove();
       toRemove = null;
     }
   }
 
   /** Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557 */
-  static <T> ListIterator<T> cast(Iterator<T> iterator) {
+  static <T extends @Nullable Object> ListIterator<T> cast(Iterator<T> iterator) {
     return (ListIterator<T>) iterator;
   }
 }
diff --git a/android/guava/src/com/google/common/collect/LexicographicalOrdering.java b/android/guava/src/com/google/common/collect/LexicographicalOrdering.java
index 0e6c196..91fc7bf 100644
--- a/android/guava/src/com/google/common/collect/LexicographicalOrdering.java
+++ b/android/guava/src/com/google/common/collect/LexicographicalOrdering.java
@@ -20,11 +20,14 @@
 import java.io.Serializable;
 import java.util.Comparator;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering which sorts iterables by comparing corresponding elements pairwise. */
 @GwtCompatible(serializable = true)
-final class LexicographicalOrdering<T> extends Ordering<Iterable<T>> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class LexicographicalOrdering<T extends @Nullable Object> extends Ordering<Iterable<T>>
+    implements Serializable {
   final Comparator<? super T> elementOrder;
 
   LexicographicalOrdering(Comparator<? super T> elementOrder) {
@@ -51,7 +54,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/collect/LinkedHashMultimap.java b/android/guava/src/com/google/common/collect/LinkedHashMultimap.java
index 3616617..b0f1302 100644
--- a/android/guava/src/com/google/common/collect/LinkedHashMultimap.java
+++ b/android/guava/src/com/google/common/collect/LinkedHashMultimap.java
@@ -16,8 +16,9 @@
 
 package com.google.common.collect;
 
+import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -36,7 +37,8 @@
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@code Multimap} that does not allow duplicate key-value entries and that
@@ -65,6 +67,10 @@
  * read operations will work correctly. To allow concurrent update operations, wrap your multimap
  * with a call to {@link Multimaps#synchronizedSetMultimap}.
  *
+ * <p><b>Warning:</b> Do not modify either a key <i>or a value</i> of a {@code LinkedHashMultimap}
+ * in a way that affects its {@link Object#equals} behavior. Undefined behavior and bugs will
+ * result.
+ *
  * <p>See the Guava User Guide article on <a href=
  * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
  * Multimap}</a>.
@@ -74,11 +80,13 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public final class LinkedHashMultimap<K, V>
+@ElementTypesAreNonnullByDefault
+public final class LinkedHashMultimap<K extends @Nullable Object, V extends @Nullable Object>
     extends LinkedHashMultimapGwtSerializationDependencies<K, V> {
 
   /** Creates a new, empty {@code LinkedHashMultimap} with the default initial capacities. */
-  public static <K, V> LinkedHashMultimap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMultimap<K, V> create() {
     return new LinkedHashMultimap<>(DEFAULT_KEY_CAPACITY, DEFAULT_VALUE_SET_CAPACITY);
   }
 
@@ -91,7 +99,8 @@
    * @throws IllegalArgumentException if {@code expectedKeys} or {@code expectedValuesPerKey} is
    *     negative
    */
-  public static <K, V> LinkedHashMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
     return new LinkedHashMultimap<>(
         Maps.capacity(expectedKeys), Maps.capacity(expectedValuesPerKey));
   }
@@ -104,14 +113,14 @@
    *
    * @param multimap the multimap whose contents are copied to this multimap
    */
-  public static <K, V> LinkedHashMultimap<K, V> create(
-      Multimap<? extends K, ? extends V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
     LinkedHashMultimap<K, V> result = create(multimap.keySet().size(), DEFAULT_VALUE_SET_CAPACITY);
     result.putAll(multimap);
     return result;
   }
 
-  private interface ValueSetLink<K, V> {
+  private interface ValueSetLink<K extends @Nullable Object, V extends @Nullable Object> {
     ValueSetLink<K, V> getPredecessorInValueSet();
 
     ValueSetLink<K, V> getSuccessorInValueSet();
@@ -121,21 +130,25 @@
     void setSuccessorInValueSet(ValueSetLink<K, V> entry);
   }
 
-  private static <K, V> void succeedsInValueSet(ValueSetLink<K, V> pred, ValueSetLink<K, V> succ) {
+  private static <K extends @Nullable Object, V extends @Nullable Object> void succeedsInValueSet(
+      ValueSetLink<K, V> pred, ValueSetLink<K, V> succ) {
     pred.setSuccessorInValueSet(succ);
     succ.setPredecessorInValueSet(pred);
   }
 
-  private static <K, V> void succeedsInMultimap(ValueEntry<K, V> pred, ValueEntry<K, V> succ) {
+  private static <K extends @Nullable Object, V extends @Nullable Object> void succeedsInMultimap(
+      ValueEntry<K, V> pred, ValueEntry<K, V> succ) {
     pred.setSuccessorInMultimap(succ);
     succ.setPredecessorInMultimap(pred);
   }
 
-  private static <K, V> void deleteFromValueSet(ValueSetLink<K, V> entry) {
+  private static <K extends @Nullable Object, V extends @Nullable Object> void deleteFromValueSet(
+      ValueSetLink<K, V> entry) {
     succeedsInValueSet(entry.getPredecessorInValueSet(), entry.getSuccessorInValueSet());
   }
 
-  private static <K, V> void deleteFromMultimap(ValueEntry<K, V> entry) {
+  private static <K extends @Nullable Object, V extends @Nullable Object> void deleteFromMultimap(
+      ValueEntry<K, V> entry) {
     succeedsInMultimap(entry.getPredecessorInMultimap(), entry.getSuccessorInMultimap());
   }
 
@@ -146,39 +159,69 @@
    * whole.
    */
   @VisibleForTesting
-  static final class ValueEntry<K, V> extends ImmutableEntry<K, V> implements ValueSetLink<K, V> {
+  static final class ValueEntry<K extends @Nullable Object, V extends @Nullable Object>
+      extends ImmutableEntry<K, V> implements ValueSetLink<K, V> {
     final int smearedValueHash;
 
-    @NullableDecl ValueEntry<K, V> nextInValueBucket;
+    @CheckForNull ValueEntry<K, V> nextInValueBucket;
+    /*
+     * The *InValueSet and *InMultimap fields below are null after construction, but we almost
+     * always call succeedsIn*() to initialize them immediately thereafter.
+     *
+     * The exception is the *InValueSet fields of multimapHeaderEntry, which are never set. (That
+     * works out fine as long as we continue to be careful not to try delete them or iterate past
+     * them.)
+     *
+     * We could consider "lying" and omitting @CheckNotNull from all these fields. Normally, I'm not
+     * a fan of that: What if we someday implement (presumably to be enabled during tests only)
+     * bytecode rewriting that checks for any null value that passes through an API with a
+     * known-non-null type? But that particular problem might not arise here, since we're not
+     * actually reading from the fields in any case in which they might be null (as proven by the
+     * requireNonNull checks below). Plus, we're *already* lying here, since newHeader passes a null
+     * key and value, which we pass to the superconstructor, even though the key and value type for
+     * a given entry might not include null. The right fix for the header problems is probably to
+     * define a separate MultimapLink interface with a separate "header" implementation, which
+     * hopefully could avoid implementing Entry or ValueSetLink at all. (But note that that approach
+     * requires us to define extra classes -- unfortunate under Android.) *Then* we could consider
+     * lying about the fields below on the grounds that we always initialize them just after the
+     * constructor -- an example of the kind of lying that our hypotheticaly bytecode rewriter would
+     * already have to deal with, thanks to DI frameworks that perform field and method injection,
+     * frameworks like Android that define post-construct hooks like Activity.onCreate, etc.
+     */
 
-    @NullableDecl ValueSetLink<K, V> predecessorInValueSet;
-    @NullableDecl ValueSetLink<K, V> successorInValueSet;
+    @CheckForNull ValueSetLink<K, V> predecessorInValueSet;
+    @CheckForNull ValueSetLink<K, V> successorInValueSet;
 
-    @NullableDecl ValueEntry<K, V> predecessorInMultimap;
-    @NullableDecl ValueEntry<K, V> successorInMultimap;
+    @CheckForNull ValueEntry<K, V> predecessorInMultimap;
+    @CheckForNull ValueEntry<K, V> successorInMultimap;
 
     ValueEntry(
-        @NullableDecl K key,
-        @NullableDecl V value,
+        @ParametricNullness K key,
+        @ParametricNullness V value,
         int smearedValueHash,
-        @NullableDecl ValueEntry<K, V> nextInValueBucket) {
+        @CheckForNull ValueEntry<K, V> nextInValueBucket) {
       super(key, value);
       this.smearedValueHash = smearedValueHash;
       this.nextInValueBucket = nextInValueBucket;
     }
 
-    boolean matchesValue(@NullableDecl Object v, int smearedVHash) {
+    @SuppressWarnings("nullness") // see the comment on the class fields, especially about newHeader
+    static <K extends @Nullable Object, V extends @Nullable Object> ValueEntry<K, V> newHeader() {
+      return new ValueEntry<>(null, null, 0, null);
+    }
+
+    boolean matchesValue(@CheckForNull Object v, int smearedVHash) {
       return smearedValueHash == smearedVHash && Objects.equal(getValue(), v);
     }
 
     @Override
     public ValueSetLink<K, V> getPredecessorInValueSet() {
-      return predecessorInValueSet;
+      return requireNonNull(predecessorInValueSet); // see the comment on the class fields
     }
 
     @Override
     public ValueSetLink<K, V> getSuccessorInValueSet() {
-      return successorInValueSet;
+      return requireNonNull(successorInValueSet); // see the comment on the class fields
     }
 
     @Override
@@ -192,11 +235,11 @@
     }
 
     public ValueEntry<K, V> getPredecessorInMultimap() {
-      return predecessorInMultimap;
+      return requireNonNull(predecessorInMultimap); // see the comment on the class fields
     }
 
     public ValueEntry<K, V> getSuccessorInMultimap() {
-      return successorInMultimap;
+      return requireNonNull(successorInMultimap); // see the comment on the class fields
     }
 
     public void setSuccessorInMultimap(ValueEntry<K, V> multimapSuccessor) {
@@ -220,7 +263,7 @@
     checkNonnegative(valueSetCapacity, "expectedValuesPerKey");
 
     this.valueSetCapacity = valueSetCapacity;
-    this.multimapHeaderEntry = new ValueEntry<>(null, null, 0, null);
+    this.multimapHeaderEntry = ValueEntry.newHeader();
     succeedsInMultimap(multimapHeaderEntry, multimapHeaderEntry);
   }
 
@@ -246,7 +289,7 @@
    * @return a new decorated set containing a collection of values for one key
    */
   @Override
-  Collection<V> createCollection(K key) {
+  Collection<V> createCollection(@ParametricNullness K key) {
     return new ValueSet(key, valueSetCapacity);
   }
 
@@ -259,7 +302,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public Set<V> replaceValues(@NullableDecl K key, Iterable<? extends V> values) {
+  public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return super.replaceValues(key, values);
   }
 
@@ -314,8 +357,8 @@
      * consumption.
      */
 
-    private final K key;
-    @VisibleForTesting ValueEntry<K, V>[] hashTable;
+    @ParametricNullness private final K key;
+    @VisibleForTesting @Nullable ValueEntry<K, V>[] hashTable;
     private int size = 0;
     private int modCount = 0;
 
@@ -324,15 +367,16 @@
     private ValueSetLink<K, V> firstEntry;
     private ValueSetLink<K, V> lastEntry;
 
-    ValueSet(K key, int expectedValues) {
+    ValueSet(@ParametricNullness K key, int expectedValues) {
       this.key = key;
       this.firstEntry = this;
       this.lastEntry = this;
       // Round expected values up to a power of 2 to get the table size.
       int tableSize = Hashing.closedTableSize(expectedValues, VALUE_SET_LOAD_FACTOR);
 
-      @SuppressWarnings("unchecked")
-      ValueEntry<K, V>[] hashTable = new ValueEntry[tableSize];
+      @SuppressWarnings({"rawtypes", "unchecked"})
+      @Nullable
+      ValueEntry<K, V>[] hashTable = new @Nullable ValueEntry[tableSize];
       this.hashTable = hashTable;
     }
 
@@ -364,7 +408,7 @@
     public Iterator<V> iterator() {
       return new Iterator<V>() {
         ValueSetLink<K, V> nextEntry = firstEntry;
-        @NullableDecl ValueEntry<K, V> toRemove;
+        @CheckForNull ValueEntry<K, V> toRemove;
         int expectedModCount = modCount;
 
         private void checkForComodification() {
@@ -380,6 +424,7 @@
         }
 
         @Override
+        @ParametricNullness
         public V next() {
           if (!hasNext()) {
             throw new NoSuchElementException();
@@ -394,7 +439,7 @@
         @Override
         public void remove() {
           checkForComodification();
-          checkRemove(toRemove != null);
+          checkState(toRemove != null, "no calls to next() since the last call to remove()");
           ValueSet.this.remove(toRemove.getValue());
           expectedModCount = modCount;
           toRemove = null;
@@ -408,7 +453,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       int smearedHash = Hashing.smearedHash(o);
       for (ValueEntry<K, V> entry = hashTable[smearedHash & mask()];
           entry != null;
@@ -421,7 +466,7 @@
     }
 
     @Override
-    public boolean add(@NullableDecl V value) {
+    public boolean add(@ParametricNullness V value) {
       int smearedHash = Hashing.smearedHash(value);
       int bucket = smearedHash & mask();
       ValueEntry<K, V> rowHead = hashTable[bucket];
@@ -462,7 +507,7 @@
 
     @CanIgnoreReturnValue
     @Override
-    public boolean remove(@NullableDecl Object o) {
+    public boolean remove(@CheckForNull Object o) {
       int smearedHash = Hashing.smearedHash(o);
       int bucket = smearedHash & mask();
       ValueEntry<K, V> prev = null;
@@ -504,8 +549,8 @@
   @Override
   Iterator<Entry<K, V>> entryIterator() {
     return new Iterator<Entry<K, V>>() {
-      ValueEntry<K, V> nextEntry = multimapHeaderEntry.successorInMultimap;
-      @NullableDecl ValueEntry<K, V> toRemove;
+      ValueEntry<K, V> nextEntry = multimapHeaderEntry.getSuccessorInMultimap();
+      @CheckForNull ValueEntry<K, V> toRemove;
 
       @Override
       public boolean hasNext() {
@@ -519,13 +564,13 @@
         }
         ValueEntry<K, V> result = nextEntry;
         toRemove = result;
-        nextEntry = nextEntry.successorInMultimap;
+        nextEntry = nextEntry.getSuccessorInMultimap();
         return result;
       }
 
       @Override
       public void remove() {
-        checkRemove(toRemove != null);
+        checkState(toRemove != null, "no calls to next() since the last call to remove()");
         LinkedHashMultimap.this.remove(toRemove.getKey(), toRemove.getValue());
         toRemove = null;
       }
@@ -564,7 +609,7 @@
   @GwtIncompatible // java.io.ObjectInputStream
   private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
     stream.defaultReadObject();
-    multimapHeaderEntry = new ValueEntry<>(null, null, 0, null);
+    multimapHeaderEntry = ValueEntry.newHeader();
     succeedsInMultimap(multimapHeaderEntry, multimapHeaderEntry);
     valueSetCapacity = DEFAULT_VALUE_SET_CAPACITY;
     int distinctKeys = stream.readInt();
@@ -580,7 +625,11 @@
       K key = (K) stream.readObject();
       @SuppressWarnings("unchecked")
       V value = (V) stream.readObject();
-      map.get(key).add(value);
+      /*
+       * requireNonNull is safe for a properly serialized multimap: We've already inserted a
+       * collection for each key that we expect.
+       */
+      requireNonNull(map.get(key)).add(value);
     }
     setMap(map);
   }
diff --git a/android/guava/src/com/google/common/collect/LinkedHashMultiset.java b/android/guava/src/com/google/common/collect/LinkedHashMultiset.java
index 6f95d4d..9630786 100644
--- a/android/guava/src/com/google/common/collect/LinkedHashMultiset.java
+++ b/android/guava/src/com/google/common/collect/LinkedHashMultiset.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@code Multiset} implementation with predictable iteration order. Its iterator orders elements
@@ -34,10 +35,12 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public final class LinkedHashMultiset<E> extends AbstractMapBasedMultiset<E> {
+@ElementTypesAreNonnullByDefault
+public final class LinkedHashMultiset<E extends @Nullable Object>
+    extends AbstractMapBasedMultiset<E> {
 
   /** Creates a new, empty {@code LinkedHashMultiset} using the default initial capacity. */
-  public static <E> LinkedHashMultiset<E> create() {
+  public static <E extends @Nullable Object> LinkedHashMultiset<E> create() {
     return create(ObjectCountHashMap.DEFAULT_SIZE);
   }
 
@@ -48,7 +51,7 @@
    * @param distinctElements the expected number of distinct elements
    * @throws IllegalArgumentException if {@code distinctElements} is negative
    */
-  public static <E> LinkedHashMultiset<E> create(int distinctElements) {
+  public static <E extends @Nullable Object> LinkedHashMultiset<E> create(int distinctElements) {
     return new LinkedHashMultiset<E>(distinctElements);
   }
 
@@ -59,7 +62,8 @@
    *
    * @param elements the elements that the multiset should contain
    */
-  public static <E> LinkedHashMultiset<E> create(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> LinkedHashMultiset<E> create(
+      Iterable<? extends E> elements) {
     LinkedHashMultiset<E> multiset = create(Multisets.inferDistinctElements(elements));
     Iterables.addAll(multiset, elements);
     return multiset;
@@ -70,7 +74,7 @@
   }
 
   @Override
-  void init(int distinctElements) {
-    backingMap = new ObjectCountLinkedHashMap<>(distinctElements);
+  ObjectCountHashMap<E> newBackingMap(int distinctElements) {
+    return new ObjectCountLinkedHashMap<>(distinctElements);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/LinkedListMultimap.java b/android/guava/src/com/google/common/collect/LinkedListMultimap.java
index 3aa1efd..31874b2 100644
--- a/android/guava/src/com/google/common/collect/LinkedListMultimap.java
+++ b/android/guava/src/com/google/common/collect/LinkedListMultimap.java
@@ -18,8 +18,8 @@
 
 import static com.google.common.base.Preconditions.checkPositionIndex;
 import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
 import static java.util.Collections.unmodifiableList;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -39,7 +39,8 @@
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An implementation of {@code ListMultimap} that supports deterministic iteration order for both
@@ -94,8 +95,9 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public class LinkedListMultimap<K, V> extends AbstractMultimap<K, V>
-    implements ListMultimap<K, V>, Serializable {
+@ElementTypesAreNonnullByDefault
+public class LinkedListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMultimap<K, V> implements ListMultimap<K, V>, Serializable {
   /*
    * Order is maintained using a linked list containing all key-value pairs. In
    * addition, a series of disjoint linked lists of "siblings", each containing
@@ -103,38 +105,42 @@
    * ValueForKeyIterator} in constant time.
    */
 
-  private static final class Node<K, V> extends AbstractMapEntry<K, V> {
-    @NullableDecl final K key;
-    @NullableDecl V value;
-    @NullableDecl Node<K, V> next; // the next node (with any key)
-    @NullableDecl Node<K, V> previous; // the previous node (with any key)
-    @NullableDecl Node<K, V> nextSibling; // the next node with the same key
-    @NullableDecl Node<K, V> previousSibling; // the previous node with the same key
+  private static final class Node<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMapEntry<K, V> {
+    @ParametricNullness final K key;
+    @ParametricNullness V value;
+    @CheckForNull Node<K, V> next; // the next node (with any key)
+    @CheckForNull Node<K, V> previous; // the previous node (with any key)
+    @CheckForNull Node<K, V> nextSibling; // the next node with the same key
+    @CheckForNull Node<K, V> previousSibling; // the previous node with the same key
 
-    Node(@NullableDecl K key, @NullableDecl V value) {
+    Node(@ParametricNullness K key, @ParametricNullness V value) {
       this.key = key;
       this.value = value;
     }
 
     @Override
+    @ParametricNullness
     public K getKey() {
       return key;
     }
 
     @Override
+    @ParametricNullness
     public V getValue() {
       return value;
     }
 
     @Override
-    public V setValue(@NullableDecl V newValue) {
+    @ParametricNullness
+    public V setValue(@ParametricNullness V newValue) {
       V result = value;
       this.value = newValue;
       return result;
     }
   }
 
-  private static class KeyList<K, V> {
+  private static class KeyList<K extends @Nullable Object, V extends @Nullable Object> {
     Node<K, V> head;
     Node<K, V> tail;
     int count;
@@ -148,8 +154,8 @@
     }
   }
 
-  @NullableDecl private transient Node<K, V> head; // the head for all keys
-  @NullableDecl private transient Node<K, V> tail; // the tail for all keys
+  @CheckForNull private transient Node<K, V> head; // the head for all keys
+  @CheckForNull private transient Node<K, V> tail; // the tail for all keys
   private transient Map<K, KeyList<K, V>> keyToKeyList;
   private transient int size;
 
@@ -161,7 +167,8 @@
   private transient int modCount;
 
   /** Creates a new, empty {@code LinkedListMultimap} with the default initial capacity. */
-  public static <K, V> LinkedListMultimap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedListMultimap<K, V> create() {
     return new LinkedListMultimap<>();
   }
 
@@ -172,7 +179,8 @@
    * @param expectedKeys the expected number of distinct keys
    * @throws IllegalArgumentException if {@code expectedKeys} is negative
    */
-  public static <K, V> LinkedListMultimap<K, V> create(int expectedKeys) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedListMultimap<K, V> create(int expectedKeys) {
     return new LinkedListMultimap<>(expectedKeys);
   }
 
@@ -183,8 +191,8 @@
    *
    * @param multimap the multimap whose contents are copied to this multimap
    */
-  public static <K, V> LinkedListMultimap<K, V> create(
-      Multimap<? extends K, ? extends V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedListMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
     return new LinkedListMultimap<>(multimap);
   }
 
@@ -208,14 +216,17 @@
    */
   @CanIgnoreReturnValue
   private Node<K, V> addNode(
-      @NullableDecl K key, @NullableDecl V value, @NullableDecl Node<K, V> nextSibling) {
+      @ParametricNullness K key,
+      @ParametricNullness V value,
+      @CheckForNull Node<K, V> nextSibling) {
     Node<K, V> node = new Node<>(key, value);
     if (head == null) { // empty list
       head = tail = node;
       keyToKeyList.put(key, new KeyList<K, V>(node));
       modCount++;
     } else if (nextSibling == null) { // non-empty list, add to tail
-      tail.next = node;
+      // requireNonNull is safe because the list is non-empty.
+      requireNonNull(tail).next = node;
       node.previous = tail;
       tail = node;
       KeyList<K, V> keyList = keyToKeyList.get(key);
@@ -230,14 +241,19 @@
         keyList.tail = node;
       }
     } else { // non-empty list, insert before nextSibling
-      KeyList<K, V> keyList = keyToKeyList.get(key);
+      /*
+       * requireNonNull is safe as long as callers pass a nextSibling that (a) has the same key and
+       * (b) is present in the multimap. (And they do, except maybe in case of concurrent
+       * modification, in which case all bets are off.)
+       */
+      KeyList<K, V> keyList = requireNonNull(keyToKeyList.get(key));
       keyList.count++;
       node.previous = nextSibling.previous;
       node.previousSibling = nextSibling.previousSibling;
       node.next = nextSibling;
       node.nextSibling = nextSibling;
       if (nextSibling.previousSibling == null) { // nextSibling was key head
-        keyToKeyList.get(key).head = node;
+        keyList.head = node;
       } else {
         nextSibling.previousSibling.nextSibling = node;
       }
@@ -269,21 +285,29 @@
       tail = node.previous;
     }
     if (node.previousSibling == null && node.nextSibling == null) {
-      KeyList<K, V> keyList = keyToKeyList.remove(node.key);
+      /*
+       * requireNonNull is safe as long as we call removeNode only for nodes that are still in the
+       * Multimap. This should be the case (except in case of concurrent modification, when all bets
+       * are off).
+       */
+      KeyList<K, V> keyList = requireNonNull(keyToKeyList.remove(node.key));
       keyList.count = 0;
       modCount++;
     } else {
-      KeyList<K, V> keyList = keyToKeyList.get(node.key);
+      // requireNonNull is safe (under the conditions listed in the comment in the branch above).
+      KeyList<K, V> keyList = requireNonNull(keyToKeyList.get(node.key));
       keyList.count--;
 
       if (node.previousSibling == null) {
-        keyList.head = node.nextSibling;
+        // requireNonNull is safe because we checked that not *both* siblings were null.
+        keyList.head = requireNonNull(node.nextSibling);
       } else {
         node.previousSibling.nextSibling = node.nextSibling;
       }
 
       if (node.nextSibling == null) {
-        keyList.tail = node.previousSibling;
+        // requireNonNull is safe because we checked that not *both* siblings were null.
+        keyList.tail = requireNonNull(node.previousSibling);
       } else {
         node.nextSibling.previousSibling = node.previousSibling;
       }
@@ -292,23 +316,16 @@
   }
 
   /** Removes all nodes for the specified key. */
-  private void removeAllNodes(@NullableDecl Object key) {
+  private void removeAllNodes(@ParametricNullness K key) {
     Iterators.clear(new ValueForKeyIterator(key));
   }
 
-  /** Helper method for verifying that an iterator element is present. */
-  private static void checkElement(@NullableDecl Object node) {
-    if (node == null) {
-      throw new NoSuchElementException();
-    }
-  }
-
   /** An {@code Iterator} over all nodes. */
   private class NodeIterator implements ListIterator<Entry<K, V>> {
     int nextIndex;
-    @NullableDecl Node<K, V> next;
-    @NullableDecl Node<K, V> current;
-    @NullableDecl Node<K, V> previous;
+    @CheckForNull Node<K, V> next;
+    @CheckForNull Node<K, V> current;
+    @CheckForNull Node<K, V> previous;
     int expectedModCount = modCount;
 
     NodeIterator(int index) {
@@ -345,7 +362,9 @@
     @Override
     public Node<K, V> next() {
       checkForConcurrentModification();
-      checkElement(next);
+      if (next == null) {
+        throw new NoSuchElementException();
+      }
       previous = current = next;
       next = next.next;
       nextIndex++;
@@ -355,7 +374,7 @@
     @Override
     public void remove() {
       checkForConcurrentModification();
-      checkRemove(current != null);
+      checkState(current != null, "no calls to next() since the last call to remove()");
       if (current != next) { // after call to next()
         previous = current.previous;
         nextIndex--;
@@ -377,7 +396,9 @@
     @Override
     public Node<K, V> previous() {
       checkForConcurrentModification();
-      checkElement(previous);
+      if (previous == null) {
+        throw new NoSuchElementException();
+      }
       next = current = previous;
       previous = previous.previous;
       nextIndex--;
@@ -404,7 +425,7 @@
       throw new UnsupportedOperationException();
     }
 
-    void setValue(V value) {
+    void setValue(@ParametricNullness V value) {
       checkState(current != null);
       current.value = value;
     }
@@ -413,8 +434,8 @@
   /** An {@code Iterator} over distinct keys in key head order. */
   private class DistinctKeyIterator implements Iterator<K> {
     final Set<K> seenKeys = Sets.<K>newHashSetWithExpectedSize(keySet().size());
-    Node<K, V> next = head;
-    @NullableDecl Node<K, V> current;
+    @CheckForNull Node<K, V> next = head;
+    @CheckForNull Node<K, V> current;
     int expectedModCount = modCount;
 
     private void checkForConcurrentModification() {
@@ -430,9 +451,12 @@
     }
 
     @Override
+    @ParametricNullness
     public K next() {
       checkForConcurrentModification();
-      checkElement(next);
+      if (next == null) {
+        throw new NoSuchElementException();
+      }
       current = next;
       seenKeys.add(current.key);
       do { // skip ahead to next unseen key
@@ -444,7 +468,7 @@
     @Override
     public void remove() {
       checkForConcurrentModification();
-      checkRemove(current != null);
+      checkState(current != null, "no calls to next() since the last call to remove()");
       removeAllNodes(current.key);
       current = null;
       expectedModCount = modCount;
@@ -453,14 +477,14 @@
 
   /** A {@code ListIterator} over values for a specified key. */
   private class ValueForKeyIterator implements ListIterator<V> {
-    @NullableDecl final Object key;
+    @ParametricNullness final K key;
     int nextIndex;
-    @NullableDecl Node<K, V> next;
-    @NullableDecl Node<K, V> current;
-    @NullableDecl Node<K, V> previous;
+    @CheckForNull Node<K, V> next;
+    @CheckForNull Node<K, V> current;
+    @CheckForNull Node<K, V> previous;
 
     /** Constructs a new iterator over all values for the specified key. */
-    ValueForKeyIterator(@NullableDecl Object key) {
+    ValueForKeyIterator(@ParametricNullness K key) {
       this.key = key;
       KeyList<K, V> keyList = keyToKeyList.get(key);
       next = (keyList == null) ? null : keyList.head;
@@ -474,7 +498,7 @@
      *
      * @throws IndexOutOfBoundsException if index is invalid
      */
-    public ValueForKeyIterator(@NullableDecl Object key, int index) {
+    public ValueForKeyIterator(@ParametricNullness K key, int index) {
       KeyList<K, V> keyList = keyToKeyList.get(key);
       int size = (keyList == null) ? 0 : keyList.count;
       checkPositionIndex(index, size);
@@ -501,8 +525,11 @@
 
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public V next() {
-      checkElement(next);
+      if (next == null) {
+        throw new NoSuchElementException();
+      }
       previous = current = next;
       next = next.nextSibling;
       nextIndex++;
@@ -516,8 +543,11 @@
 
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public V previous() {
-      checkElement(previous);
+      if (previous == null) {
+        throw new NoSuchElementException();
+      }
       next = current = previous;
       previous = previous.previousSibling;
       nextIndex--;
@@ -536,7 +566,7 @@
 
     @Override
     public void remove() {
-      checkRemove(current != null);
+      checkState(current != null, "no calls to next() since the last call to remove()");
       if (current != next) { // after call to next()
         previous = current.previousSibling;
         nextIndex--;
@@ -548,15 +578,14 @@
     }
 
     @Override
-    public void set(V value) {
+    public void set(@ParametricNullness V value) {
       checkState(current != null);
       current.value = value;
     }
 
     @Override
-    @SuppressWarnings("unchecked")
-    public void add(V value) {
-      previous = addNode((K) key, value, next);
+    public void add(@ParametricNullness V value) {
+      previous = addNode(key, value, next);
       nextIndex++;
       current = null;
     }
@@ -575,12 +604,12 @@
   }
 
   @Override
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return keyToKeyList.containsKey(key);
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return values().contains(value);
   }
 
@@ -595,7 +624,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public boolean put(@NullableDecl K key, @NullableDecl V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     addNode(key, value, null);
     return true;
   }
@@ -612,7 +641,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public List<V> replaceValues(@NullableDecl K key, Iterable<? extends V> values) {
+  public List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     List<V> oldValues = getCopy(key);
     ListIterator<V> keyValues = new ValueForKeyIterator(key);
     Iterator<? extends V> newValues = values.iterator();
@@ -637,7 +666,7 @@
     return oldValues;
   }
 
-  private List<V> getCopy(@NullableDecl Object key) {
+  private List<V> getCopy(@ParametricNullness K key) {
     return unmodifiableList(Lists.newArrayList(new ValueForKeyIterator(key)));
   }
 
@@ -648,9 +677,16 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public List<V> removeAll(@NullableDecl Object key) {
-    List<V> oldValues = getCopy(key);
-    removeAllNodes(key);
+  public List<V> removeAll(@Nullable Object key) {
+    /*
+     * Safe because all we do is remove values for the key, not add them. (If we wanted to make sure
+     * to call getCopy and removeAllNodes only with a true K, then we could check containsKey first.
+     * But that check wouldn't eliminate the warnings.)
+     */
+    @SuppressWarnings({"unchecked", "nullness"})
+    K castKey = (K) key;
+    List<V> oldValues = getCopy(castKey);
+    removeAllNodes(castKey);
     return oldValues;
   }
 
@@ -675,7 +711,7 @@
    * <p>The returned list is not serializable and does not have random access.
    */
   @Override
-  public List<V> get(@NullableDecl final K key) {
+  public List<V> get(@ParametricNullness final K key) {
     return new AbstractSequentialList<V>() {
       @Override
       public int size() {
@@ -705,12 +741,12 @@
       }
 
       @Override
-      public boolean contains(Object key) { // for performance
+      public boolean contains(@CheckForNull Object key) { // for performance
         return containsKey(key);
       }
 
       @Override
-      public boolean remove(Object o) { // for performance
+      public boolean remove(@CheckForNull Object o) { // for performance
         return !LinkedListMultimap.this.removeAll(o).isEmpty();
       }
     }
@@ -749,12 +785,13 @@
         final NodeIterator nodeItr = new NodeIterator(index);
         return new TransformedListIterator<Entry<K, V>, V>(nodeItr) {
           @Override
+          @ParametricNullness
           V transform(Entry<K, V> entry) {
             return entry.getValue();
           }
 
           @Override
-          public void set(V value) {
+          public void set(@ParametricNullness V value) {
             nodeItr.setValue(value);
           }
         };
diff --git a/android/guava/src/com/google/common/collect/ListMultimap.java b/android/guava/src/com/google/common/collect/ListMultimap.java
index 46c18ac..1686068 100644
--- a/android/guava/src/com/google/common/collect/ListMultimap.java
+++ b/android/guava/src/com/google/common/collect/ListMultimap.java
@@ -21,7 +21,8 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@code Multimap} that can hold duplicate key-value pairs and that maintains the insertion
@@ -40,7 +41,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public interface ListMultimap<K, V> extends Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface ListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends Multimap<K, V> {
   /**
    * {@inheritDoc}
    *
@@ -49,7 +52,7 @@
    * the {@link Multimap} interface.
    */
   @Override
-  List<V> get(@NullableDecl K key);
+  List<V> get(@ParametricNullness K key);
 
   /**
    * {@inheritDoc}
@@ -60,7 +63,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  List<V> removeAll(@NullableDecl Object key);
+  List<V> removeAll(@CheckForNull Object key);
 
   /**
    * {@inheritDoc}
@@ -71,7 +74,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  List<V> replaceValues(K key, Iterable<? extends V> values);
+  List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values);
 
   /**
    * {@inheritDoc}
@@ -93,5 +96,5 @@
    * empty {@code SetMultimap}.
    */
   @Override
-  boolean equals(@NullableDecl Object obj);
+  boolean equals(@CheckForNull Object obj);
 }
diff --git a/android/guava/src/com/google/common/collect/Lists.java b/android/guava/src/com/google/common/collect/Lists.java
index 33f6533..a583950 100644
--- a/android/guava/src/com/google/common/collect/Lists.java
+++ b/android/guava/src/com/google/common/collect/Lists.java
@@ -48,7 +48,8 @@
 import java.util.NoSuchElementException;
 import java.util.RandomAccess;
 import java.util.concurrent.CopyOnWriteArrayList;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to {@link List} instances. Also see this class's counterparts
@@ -63,6 +64,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Lists {
   private Lists() {}
 
@@ -78,7 +80,7 @@
    * directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayList() {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayList() {
     return new ArrayList<>();
   }
 
@@ -98,7 +100,7 @@
    */
   @SafeVarargs
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayList(E... elements) {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayList(E... elements) {
     checkNotNull(elements); // for GWT
     // Avoid integer overflow when a large array is passed in
     int capacity = computeArrayListCapacity(elements.length);
@@ -121,7 +123,8 @@
    * syntax</a>.
    */
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayList(
+      Iterable<? extends E> elements) {
     checkNotNull(elements); // for GWT
     // Let ArrayList's sizing logic work, if possible
     return (elements instanceof Collection)
@@ -137,7 +140,8 @@
    * ImmutableList#copyOf(Iterator)} instead.
    */
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayList(Iterator<? extends E> elements) {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayList(
+      Iterator<? extends E> elements) {
     ArrayList<E> list = newArrayList();
     Iterators.addAll(list, elements);
     return list;
@@ -168,7 +172,8 @@
    * @throws IllegalArgumentException if {@code initialArraySize} is negative
    */
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayListWithCapacity(int initialArraySize) {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayListWithCapacity(
+      int initialArraySize) {
     checkNonnegative(initialArraySize, "initialArraySize"); // for GWT.
     return new ArrayList<>(initialArraySize);
   }
@@ -187,7 +192,8 @@
    * @throws IllegalArgumentException if {@code estimatedSize} is negative
    */
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayListWithExpectedSize(int estimatedSize) {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayListWithExpectedSize(
+      int estimatedSize) {
     return new ArrayList<>(computeArrayListCapacity(estimatedSize));
   }
 
@@ -209,7 +215,7 @@
    * syntax</a>.
    */
   @GwtCompatible(serializable = true)
-  public static <E> LinkedList<E> newLinkedList() {
+  public static <E extends @Nullable Object> LinkedList<E> newLinkedList() {
     return new LinkedList<>();
   }
 
@@ -231,7 +237,8 @@
    * syntax</a>.
    */
   @GwtCompatible(serializable = true)
-  public static <E> LinkedList<E> newLinkedList(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> LinkedList<E> newLinkedList(
+      Iterable<? extends E> elements) {
     LinkedList<E> list = newLinkedList();
     Iterables.addAll(list, elements);
     return list;
@@ -247,7 +254,7 @@
    * @since 12.0
    */
   @GwtIncompatible // CopyOnWriteArrayList
-  public static <E> CopyOnWriteArrayList<E> newCopyOnWriteArrayList() {
+  public static <E extends @Nullable Object> CopyOnWriteArrayList<E> newCopyOnWriteArrayList() {
     return new CopyOnWriteArrayList<>();
   }
 
@@ -259,7 +266,7 @@
    * @since 12.0
    */
   @GwtIncompatible // CopyOnWriteArrayList
-  public static <E> CopyOnWriteArrayList<E> newCopyOnWriteArrayList(
+  public static <E extends @Nullable Object> CopyOnWriteArrayList<E> newCopyOnWriteArrayList(
       Iterable<? extends E> elements) {
     // We copy elements to an ArrayList first, rather than incurring the
     // quadratic cost of adding them to the COWAL directly.
@@ -284,7 +291,7 @@
    * @param rest an array of additional elements, possibly empty
    * @return an unmodifiable list containing the specified elements
    */
-  public static <E> List<E> asList(@NullableDecl E first, E[] rest) {
+  public static <E extends @Nullable Object> List<E> asList(@ParametricNullness E first, E[] rest) {
     return new OnePlusArrayList<>(first, rest);
   }
 
@@ -304,17 +311,18 @@
    * @param rest an array of additional elements, possibly empty
    * @return an unmodifiable list containing the specified elements
    */
-  public static <E> List<E> asList(@NullableDecl E first, @NullableDecl E second, E[] rest) {
+  public static <E extends @Nullable Object> List<E> asList(
+      @ParametricNullness E first, @ParametricNullness E second, E[] rest) {
     return new TwoPlusArrayList<>(first, second, rest);
   }
 
   /** @see Lists#asList(Object, Object[]) */
-  private static class OnePlusArrayList<E> extends AbstractList<E>
+  private static class OnePlusArrayList<E extends @Nullable Object> extends AbstractList<E>
       implements Serializable, RandomAccess {
-    @NullableDecl final E first;
+    @ParametricNullness final E first;
     final E[] rest;
 
-    OnePlusArrayList(@NullableDecl E first, E[] rest) {
+    OnePlusArrayList(@ParametricNullness E first, E[] rest) {
       this.first = first;
       this.rest = checkNotNull(rest);
     }
@@ -325,6 +333,7 @@
     }
 
     @Override
+    @ParametricNullness
     public E get(int index) {
       // check explicitly so the IOOBE will have the right message
       checkElementIndex(index, size());
@@ -335,13 +344,13 @@
   }
 
   /** @see Lists#asList(Object, Object, Object[]) */
-  private static class TwoPlusArrayList<E> extends AbstractList<E>
+  private static class TwoPlusArrayList<E extends @Nullable Object> extends AbstractList<E>
       implements Serializable, RandomAccess {
-    @NullableDecl final E first;
-    @NullableDecl final E second;
+    @ParametricNullness final E first;
+    @ParametricNullness final E second;
     final E[] rest;
 
-    TwoPlusArrayList(@NullableDecl E first, @NullableDecl E second, E[] rest) {
+    TwoPlusArrayList(@ParametricNullness E first, @ParametricNullness E second, E[] rest) {
       this.first = first;
       this.second = second;
       this.rest = checkNotNull(rest);
@@ -353,6 +362,7 @@
     }
 
     @Override
+    @ParametricNullness
     public E get(int index) {
       switch (index) {
         case 0:
@@ -518,7 +528,7 @@
    * java.util.stream.Stream#map}. This method is not being deprecated, but we gently encourage you
    * to migrate to streams.
    */
-  public static <F, T> List<T> transform(
+  public static <F extends @Nullable Object, T extends @Nullable Object> List<T> transform(
       List<F> fromList, Function<? super F, ? extends T> function) {
     return (fromList instanceof RandomAccess)
         ? new TransformingRandomAccessList<>(fromList, function)
@@ -530,8 +540,9 @@
    *
    * @see Lists#transform
    */
-  private static class TransformingSequentialList<F, T> extends AbstractSequentialList<T>
-      implements Serializable {
+  private static class TransformingSequentialList<
+          F extends @Nullable Object, T extends @Nullable Object>
+      extends AbstractSequentialList<T> implements Serializable {
     final List<F> fromList;
     final Function<? super F, ? extends T> function;
 
@@ -558,7 +569,8 @@
     public ListIterator<T> listIterator(final int index) {
       return new TransformedListIterator<F, T>(fromList.listIterator(index)) {
         @Override
-        T transform(F from) {
+        @ParametricNullness
+        T transform(@ParametricNullness F from) {
           return function.apply(from);
         }
       };
@@ -574,8 +586,9 @@
    *
    * @see Lists#transform
    */
-  private static class TransformingRandomAccessList<F, T> extends AbstractList<T>
-      implements RandomAccess, Serializable {
+  private static class TransformingRandomAccessList<
+          F extends @Nullable Object, T extends @Nullable Object>
+      extends AbstractList<T> implements RandomAccess, Serializable {
     final List<F> fromList;
     final Function<? super F, ? extends T> function;
 
@@ -590,6 +603,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T get(int index) {
       return function.apply(fromList.get(index));
     }
@@ -642,7 +656,7 @@
    * @return a list of consecutive sublists
    * @throws IllegalArgumentException if {@code partitionSize} is nonpositive
    */
-  public static <T> List<List<T>> partition(List<T> list, int size) {
+  public static <T extends @Nullable Object> List<List<T>> partition(List<T> list, int size) {
     checkNotNull(list);
     checkArgument(size > 0);
     return (list instanceof RandomAccess)
@@ -650,7 +664,7 @@
         : new Partition<>(list, size);
   }
 
-  private static class Partition<T> extends AbstractList<List<T>> {
+  private static class Partition<T extends @Nullable Object> extends AbstractList<List<T>> {
     final List<T> list;
     final int size;
 
@@ -678,7 +692,8 @@
     }
   }
 
-  private static class RandomAccessPartition<T> extends Partition<T> implements RandomAccess {
+  private static class RandomAccessPartition<T extends @Nullable Object> extends Partition<T>
+      implements RandomAccess {
     RandomAccessPartition(List<T> list, int size) {
       super(list, size);
     }
@@ -717,12 +732,12 @@
     }
 
     @Override
-    public int indexOf(@NullableDecl Object object) {
+    public int indexOf(@CheckForNull Object object) {
       return (object instanceof Character) ? string.indexOf((Character) object) : -1;
     }
 
     @Override
-    public int lastIndexOf(@NullableDecl Object object) {
+    public int lastIndexOf(@CheckForNull Object object) {
       return (object instanceof Character) ? string.lastIndexOf((Character) object) : -1;
     }
 
@@ -779,9 +794,13 @@
    *
    * @since 7.0
    */
-  public static <T> List<T> reverse(List<T> list) {
+  public static <T extends @Nullable Object> List<T> reverse(List<T> list) {
     if (list instanceof ImmutableList) {
-      return ((ImmutableList<T>) list).reverse();
+      // Avoid nullness warnings.
+      List<?> reversed = ((ImmutableList<?>) list).reverse();
+      @SuppressWarnings("unchecked")
+      List<T> result = (List<T>) reversed;
+      return result;
     } else if (list instanceof ReverseList) {
       return ((ReverseList<T>) list).getForwardList();
     } else if (list instanceof RandomAccess) {
@@ -791,7 +810,7 @@
     }
   }
 
-  private static class ReverseList<T> extends AbstractList<T> {
+  private static class ReverseList<T extends @Nullable Object> extends AbstractList<T> {
     private final List<T> forwardList;
 
     ReverseList(List<T> forwardList) {
@@ -815,7 +834,7 @@
     }
 
     @Override
-    public void add(int index, @NullableDecl T element) {
+    public void add(int index, @ParametricNullness T element) {
       forwardList.add(reversePosition(index), element);
     }
 
@@ -825,6 +844,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T remove(int index) {
       return forwardList.remove(reverseIndex(index));
     }
@@ -835,11 +855,13 @@
     }
 
     @Override
-    public T set(int index, @NullableDecl T element) {
+    @ParametricNullness
+    public T set(int index, @ParametricNullness T element) {
       return forwardList.set(reverseIndex(index), element);
     }
 
     @Override
+    @ParametricNullness
     public T get(int index) {
       return forwardList.get(reverseIndex(index));
     }
@@ -869,7 +891,7 @@
         boolean canRemoveOrSet;
 
         @Override
-        public void add(T e) {
+        public void add(@ParametricNullness T e) {
           forwardIterator.add(e);
           forwardIterator.previous();
           canRemoveOrSet = false;
@@ -886,6 +908,7 @@
         }
 
         @Override
+        @ParametricNullness
         public T next() {
           if (!hasNext()) {
             throw new NoSuchElementException();
@@ -900,6 +923,7 @@
         }
 
         @Override
+        @ParametricNullness
         public T previous() {
           if (!hasPrevious()) {
             throw new NoSuchElementException();
@@ -921,7 +945,7 @@
         }
 
         @Override
-        public void set(T e) {
+        public void set(@ParametricNullness T e) {
           checkState(canRemoveOrSet);
           forwardIterator.set(e);
         }
@@ -929,7 +953,8 @@
     }
   }
 
-  private static class RandomAccessReverseList<T> extends ReverseList<T> implements RandomAccess {
+  private static class RandomAccessReverseList<T extends @Nullable Object> extends ReverseList<T>
+      implements RandomAccess {
     RandomAccessReverseList(List<T> forwardList) {
       super(forwardList);
     }
@@ -949,7 +974,7 @@
   }
 
   /** An implementation of {@link List#equals(Object)}. */
-  static boolean equalsImpl(List<?> thisList, @NullableDecl Object other) {
+  static boolean equalsImpl(List<?> thisList, @CheckForNull Object other) {
     if (other == checkNotNull(thisList)) {
       return true;
     }
@@ -975,7 +1000,8 @@
   }
 
   /** An implementation of {@link List#addAll(int, Collection)}. */
-  static <E> boolean addAllImpl(List<E> list, int index, Iterable<? extends E> elements) {
+  static <E extends @Nullable Object> boolean addAllImpl(
+      List<E> list, int index, Iterable<? extends E> elements) {
     boolean changed = false;
     ListIterator<E> listIterator = list.listIterator(index);
     for (E e : elements) {
@@ -986,7 +1012,7 @@
   }
 
   /** An implementation of {@link List#indexOf(Object)}. */
-  static int indexOfImpl(List<?> list, @NullableDecl Object element) {
+  static int indexOfImpl(List<?> list, @CheckForNull Object element) {
     if (list instanceof RandomAccess) {
       return indexOfRandomAccess(list, element);
     } else {
@@ -1000,7 +1026,7 @@
     }
   }
 
-  private static int indexOfRandomAccess(List<?> list, @NullableDecl Object element) {
+  private static int indexOfRandomAccess(List<?> list, @CheckForNull Object element) {
     int size = list.size();
     if (element == null) {
       for (int i = 0; i < size; i++) {
@@ -1019,7 +1045,7 @@
   }
 
   /** An implementation of {@link List#lastIndexOf(Object)}. */
-  static int lastIndexOfImpl(List<?> list, @NullableDecl Object element) {
+  static int lastIndexOfImpl(List<?> list, @CheckForNull Object element) {
     if (list instanceof RandomAccess) {
       return lastIndexOfRandomAccess(list, element);
     } else {
@@ -1033,7 +1059,7 @@
     }
   }
 
-  private static int lastIndexOfRandomAccess(List<?> list, @NullableDecl Object element) {
+  private static int lastIndexOfRandomAccess(List<?> list, @CheckForNull Object element) {
     if (element == null) {
       for (int i = list.size() - 1; i >= 0; i--) {
         if (list.get(i) == null) {
@@ -1051,12 +1077,13 @@
   }
 
   /** Returns an implementation of {@link List#listIterator(int)}. */
-  static <E> ListIterator<E> listIteratorImpl(List<E> list, int index) {
+  static <E extends @Nullable Object> ListIterator<E> listIteratorImpl(List<E> list, int index) {
     return new AbstractListWrapper<>(list).listIterator(index);
   }
 
   /** An implementation of {@link List#subList(int, int)}. */
-  static <E> List<E> subListImpl(final List<E> list, int fromIndex, int toIndex) {
+  static <E extends @Nullable Object> List<E> subListImpl(
+      final List<E> list, int fromIndex, int toIndex) {
     List<E> wrapper;
     if (list instanceof RandomAccess) {
       wrapper =
@@ -1082,7 +1109,7 @@
     return wrapper.subList(fromIndex, toIndex);
   }
 
-  private static class AbstractListWrapper<E> extends AbstractList<E> {
+  private static class AbstractListWrapper<E extends @Nullable Object> extends AbstractList<E> {
     final List<E> backingList;
 
     AbstractListWrapper(List<E> backingList) {
@@ -1090,7 +1117,7 @@
     }
 
     @Override
-    public void add(int index, E element) {
+    public void add(int index, @ParametricNullness E element) {
       backingList.add(index, element);
     }
 
@@ -1100,22 +1127,25 @@
     }
 
     @Override
+    @ParametricNullness
     public E get(int index) {
       return backingList.get(index);
     }
 
     @Override
+    @ParametricNullness
     public E remove(int index) {
       return backingList.remove(index);
     }
 
     @Override
-    public E set(int index, E element) {
+    @ParametricNullness
+    public E set(int index, @ParametricNullness E element) {
       return backingList.set(index, element);
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return backingList.contains(o);
     }
 
@@ -1125,15 +1155,15 @@
     }
   }
 
-  private static class RandomAccessListWrapper<E> extends AbstractListWrapper<E>
-      implements RandomAccess {
+  private static class RandomAccessListWrapper<E extends @Nullable Object>
+      extends AbstractListWrapper<E> implements RandomAccess {
     RandomAccessListWrapper(List<E> backingList) {
       super(backingList);
     }
   }
 
   /** Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557 */
-  static <T> List<T> cast(Iterable<T> iterable) {
+  static <T extends @Nullable Object> List<T> cast(Iterable<T> iterable) {
     return (List<T>) iterable;
   }
 }
diff --git a/android/guava/src/com/google/common/collect/MapDifference.java b/android/guava/src/com/google/common/collect/MapDifference.java
index 9933770..5000e4b 100644
--- a/android/guava/src/com/google/common/collect/MapDifference.java
+++ b/android/guava/src/com/google/common/collect/MapDifference.java
@@ -19,7 +19,8 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An object representing the differences between two maps.
@@ -29,7 +30,8 @@
  */
 @DoNotMock("Use Maps.difference")
 @GwtCompatible
-public interface MapDifference<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface MapDifference<K extends @Nullable Object, V extends @Nullable Object> {
   /**
    * Returns {@code true} if there are no differences between the two maps; that is, if the maps are
    * equal.
@@ -67,7 +69,7 @@
    * #entriesDiffering()} of the two instances are equal.
    */
   @Override
-  boolean equals(@NullableDecl Object object);
+  boolean equals(@CheckForNull Object object);
 
   /**
    * Returns the hash code for this instance. This is defined as the hash code of
@@ -87,11 +89,13 @@
    * @since 2.0
    */
   @DoNotMock("Use Maps.difference")
-  interface ValueDifference<V> {
+  interface ValueDifference<V extends @Nullable Object> {
     /** Returns the value from the left map (possibly null). */
+    @ParametricNullness
     V leftValue();
 
     /** Returns the value from the right map (possibly null). */
+    @ParametricNullness
     V rightValue();
 
     /**
@@ -99,7 +103,7 @@
      * {@link #rightValue()} values are also equal.
      */
     @Override
-    boolean equals(@NullableDecl Object other);
+    boolean equals(@CheckForNull Object other);
 
     /**
      * The hash code equals the value {@code Arrays.asList(leftValue(), rightValue()).hashCode()}.
diff --git a/android/guava/src/com/google/common/collect/MapMaker.java b/android/guava/src/com/google/common/collect/MapMaker.java
index 4f837a0..a2612c1 100644
--- a/android/guava/src/com/google/common/collect/MapMaker.java
+++ b/android/guava/src/com/google/common/collect/MapMaker.java
@@ -30,7 +30,7 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A builder of {@link ConcurrentMap} instances that can have keys or values automatically wrapped
@@ -86,6 +86,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class MapMaker {
   private static final int DEFAULT_INITIAL_CAPACITY = 16;
   private static final int DEFAULT_CONCURRENCY_LEVEL = 4;
@@ -98,10 +99,10 @@
   int initialCapacity = UNSET_INT;
   int concurrencyLevel = UNSET_INT;
 
-  @NullableDecl Strength keyStrength;
-  @NullableDecl Strength valueStrength;
+  @CheckForNull Strength keyStrength;
+  @CheckForNull Strength valueStrength;
 
-  @NullableDecl Equivalence<Object> keyEquivalence;
+  @CheckForNull Equivalence<Object> keyEquivalence;
 
   /**
    * Constructs a new {@code MapMaker} instance with default settings, including strong keys, strong
diff --git a/android/guava/src/com/google/common/collect/MapMakerInternalMap.java b/android/guava/src/com/google/common/collect/MapMakerInternalMap.java
index b72d0ea..4e66a84 100644
--- a/android/guava/src/com/google/common/collect/MapMakerInternalMap.java
+++ b/android/guava/src/com/google/common/collect/MapMakerInternalMap.java
@@ -65,7 +65,11 @@
  */
 // TODO(kak): Consider removing @CanIgnoreReturnValue from this class.
 @GwtIncompatible
-@SuppressWarnings("GuardedBy") // TODO(b/35466881): Fix or suppress.
+@SuppressWarnings({
+  "GuardedBy", // TODO(b/35466881): Fix or suppress.
+  "nullness", // too much trouble for the payoff
+})
+// TODO(cpovirk): Annotate for nullness.
 class MapMakerInternalMap<
         K,
         V,
diff --git a/android/guava/src/com/google/common/collect/Maps.java b/android/guava/src/com/google/common/collect/Maps.java
index f0bac2a..b415f25 100644
--- a/android/guava/src/com/google/common/collect/Maps.java
+++ b/android/guava/src/com/google/common/collect/Maps.java
@@ -21,6 +21,8 @@
 import static com.google.common.base.Predicates.compose;
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -61,7 +63,8 @@
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to {@link Map} instances (including instances of {@link
@@ -78,20 +81,21 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Maps {
   private Maps() {}
 
-  private enum EntryFunction implements Function<Entry<?, ?>, Object> {
+  private enum EntryFunction implements Function<Entry<?, ?>, @Nullable Object> {
     KEY {
       @Override
-      @NullableDecl
+      @CheckForNull
       public Object apply(Entry<?, ?> entry) {
         return entry.getKey();
       }
     },
     VALUE {
       @Override
-      @NullableDecl
+      @CheckForNull
       public Object apply(Entry<?, ?> entry) {
         return entry.getValue();
       }
@@ -99,27 +103,31 @@
   }
 
   @SuppressWarnings("unchecked")
-  static <K> Function<Entry<K, ?>, K> keyFunction() {
+  static <K extends @Nullable Object> Function<Entry<K, ?>, K> keyFunction() {
     return (Function) EntryFunction.KEY;
   }
 
   @SuppressWarnings("unchecked")
-  static <V> Function<Entry<?, V>, V> valueFunction() {
+  static <V extends @Nullable Object> Function<Entry<?, V>, V> valueFunction() {
     return (Function) EntryFunction.VALUE;
   }
 
-  static <K, V> Iterator<K> keyIterator(Iterator<Entry<K, V>> entryIterator) {
+  static <K extends @Nullable Object, V extends @Nullable Object> Iterator<K> keyIterator(
+      Iterator<Entry<K, V>> entryIterator) {
     return new TransformedIterator<Entry<K, V>, K>(entryIterator) {
       @Override
+      @ParametricNullness
       K transform(Entry<K, V> entry) {
         return entry.getKey();
       }
     };
   }
 
-  static <K, V> Iterator<V> valueIterator(Iterator<Entry<K, V>> entryIterator) {
+  static <K extends @Nullable Object, V extends @Nullable Object> Iterator<V> valueIterator(
+      Iterator<Entry<K, V>> entryIterator) {
     return new TransformedIterator<Entry<K, V>, V>(entryIterator) {
       @Override
+      @ParametricNullness
       V transform(Entry<K, V> entry) {
         return entry.getValue();
       }
@@ -179,7 +187,8 @@
    *
    * @return a new, empty {@code HashMap}
    */
-  public static <K, V> HashMap<K, V> newHashMap() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      HashMap<K, V> newHashMap() {
     return new HashMap<>();
   }
 
@@ -197,7 +206,8 @@
    * @param map the mappings to be placed in the new map
    * @return a new {@code HashMap} initialized with the mappings from {@code map}
    */
-  public static <K, V> HashMap<K, V> newHashMap(Map<? extends K, ? extends V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashMap<K, V> newHashMap(
+      Map<? extends K, ? extends V> map) {
     return new HashMap<>(map);
   }
 
@@ -212,7 +222,8 @@
    *     without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <K, V> HashMap<K, V> newHashMapWithExpectedSize(int expectedSize) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      HashMap<K, V> newHashMapWithExpectedSize(int expectedSize) {
     return new HashMap<>(capacity(expectedSize));
   }
 
@@ -245,7 +256,8 @@
    *
    * @return a new, empty {@code LinkedHashMap}
    */
-  public static <K, V> LinkedHashMap<K, V> newLinkedHashMap() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMap<K, V> newLinkedHashMap() {
     return new LinkedHashMap<>();
   }
 
@@ -262,7 +274,8 @@
    * @param map the mappings to be placed in the new map
    * @return a new, {@code LinkedHashMap} initialized with the mappings from {@code map}
    */
-  public static <K, V> LinkedHashMap<K, V> newLinkedHashMap(Map<? extends K, ? extends V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMap<K, V> newLinkedHashMap(Map<? extends K, ? extends V> map) {
     return new LinkedHashMap<>(map);
   }
 
@@ -278,7 +291,8 @@
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    * @since 19.0
    */
-  public static <K, V> LinkedHashMap<K, V> newLinkedHashMapWithExpectedSize(int expectedSize) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMap<K, V> newLinkedHashMapWithExpectedSize(int expectedSize) {
     return new LinkedHashMap<>(capacity(expectedSize));
   }
 
@@ -303,7 +317,7 @@
    *
    * @return a new, empty {@code TreeMap}
    */
-  public static <K extends Comparable, V> TreeMap<K, V> newTreeMap() {
+  public static <K extends Comparable, V extends @Nullable Object> TreeMap<K, V> newTreeMap() {
     return new TreeMap<>();
   }
 
@@ -323,7 +337,8 @@
    * @return a new {@code TreeMap} initialized with the mappings from {@code map} and using the
    *     comparator of {@code map}
    */
-  public static <K, V> TreeMap<K, V> newTreeMap(SortedMap<K, ? extends V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> TreeMap<K, V> newTreeMap(
+      SortedMap<K, ? extends V> map) {
     return new TreeMap<>(map);
   }
 
@@ -340,8 +355,8 @@
    * @param comparator the comparator to sort the keys with
    * @return a new, empty {@code TreeMap}
    */
-  public static <C, K extends C, V> TreeMap<K, V> newTreeMap(
-      @NullableDecl Comparator<C> comparator) {
+  public static <C extends @Nullable Object, K extends C, V extends @Nullable Object>
+      TreeMap<K, V> newTreeMap(@CheckForNull Comparator<C> comparator) {
     // Ideally, the extra type parameter "C" shouldn't be necessary. It is a
     // work-around of a compiler type inference quirk that prevents the
     // following code from being compiled:
@@ -356,7 +371,8 @@
    * @param type the key type for this map
    * @return a new, empty {@code EnumMap}
    */
-  public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap(Class<K> type) {
+  public static <K extends Enum<K>, V extends @Nullable Object> EnumMap<K, V> newEnumMap(
+      Class<K> type) {
     return new EnumMap<>(checkNotNull(type));
   }
 
@@ -372,7 +388,8 @@
    * @throws IllegalArgumentException if {@code m} is not an {@code EnumMap} instance and contains
    *     no mappings
    */
-  public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap(Map<K, ? extends V> map) {
+  public static <K extends Enum<K>, V extends @Nullable Object> EnumMap<K, V> newEnumMap(
+      Map<K, ? extends V> map) {
     return new EnumMap<>(map);
   }
 
@@ -385,7 +402,8 @@
    *
    * @return a new, empty {@code IdentityHashMap}
    */
-  public static <K, V> IdentityHashMap<K, V> newIdentityHashMap() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      IdentityHashMap<K, V> newIdentityHashMap() {
     return new IdentityHashMap<>();
   }
 
@@ -405,13 +423,27 @@
    * @return the difference between the two maps
    */
   @SuppressWarnings("unchecked")
-  public static <K, V> MapDifference<K, V> difference(
-      Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      MapDifference<K, V> difference(
+          Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
     if (left instanceof SortedMap) {
       SortedMap<K, ? extends V> sortedLeft = (SortedMap<K, ? extends V>) left;
       return difference(sortedLeft, right);
     }
-    return difference(left, right, Equivalence.equals());
+    /*
+     * This cast is safe: The Equivalence-accepting overload of difference() (which we call below)
+     * has a weird signature because Equivalence is itself a little weird. Still, we know that
+     * Equivalence.equals() can handle all inputs, and we know that the resulting MapDifference will
+     * contain only Ks and Vs (as opposed to possibly containing @Nullable objects even when K and V
+     * are *not* @Nullable).
+     *
+     * An alternative to suppressing the warning would be to inline the body of the other
+     * difference() method into this one.
+     */
+    @SuppressWarnings("nullness")
+    MapDifference<K, V> result =
+        (MapDifference<K, V>) difference(left, right, Equivalence.equals());
+    return result;
   }
 
   /**
@@ -428,7 +460,33 @@
    * @return the difference between the two maps
    * @since 10.0
    */
-  public static <K, V> MapDifference<K, V> difference(
+  /*
+   * This method should really be annotated to accept maps with @Nullable value types. Fortunately,
+   * no existing Google callers appear to pass null values (much less pass null values *and* run a
+   * nullness checker).
+   *
+   * Still, if we decide that we want to make that work, we'd need to introduce a new type parameter
+   * for the Equivalence input type:
+   *
+   * <E, K extends @Nullable Object, V extends @Nullable E> ... difference(..., Equivalence<E> ...)
+   *
+   * Maybe we should, even though it will break source compatibility.
+   *
+   * Alternatively, this is a case in which it would be useful to be able to express Equivalence<?
+   * super @Nonnull T>).
+   *
+   * As things stand now, though, we have to either:
+   *
+   * - require non-null inputs so that we can guarantee non-null outputs
+   *
+   * - accept nullable inputs but force users to cope with nullable outputs
+   *
+   * And the non-null option is far more useful to existing users.
+   *
+   * (Vaguely related: Another thing we could consider is an overload that accepts a BiPredicate:
+   * https://github.com/google/guava/issues/3913)
+   */
+  public static <K extends @Nullable Object, V> MapDifference<K, V> difference(
       Map<? extends K, ? extends V> left,
       Map<? extends K, ? extends V> right,
       Equivalence<? super V> valueEquivalence) {
@@ -459,8 +517,9 @@
    * @return the difference between the two maps
    * @since 11.0
    */
-  public static <K, V> SortedMapDifference<K, V> difference(
-      SortedMap<K, ? extends V> left, Map<? extends K, ? extends V> right) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedMapDifference<K, V> difference(
+          SortedMap<K, ? extends V> left, Map<? extends K, ? extends V> right) {
     checkNotNull(left);
     checkNotNull(right);
     Comparator<? super K> comparator = orNaturalOrder(left.comparator());
@@ -473,7 +532,7 @@
     return new SortedMapDifferenceImpl<>(onlyOnLeft, onlyOnRight, onBoth, differences);
   }
 
-  private static <K, V> void doDifference(
+  private static <K extends @Nullable Object, V extends @Nullable Object> void doDifference(
       Map<? extends K, ? extends V> left,
       Map<? extends K, ? extends V> right,
       Equivalence<? super V> valueEquivalence,
@@ -485,7 +544,17 @@
       K leftKey = entry.getKey();
       V leftValue = entry.getValue();
       if (right.containsKey(leftKey)) {
-        V rightValue = onlyOnRight.remove(leftKey);
+        /*
+         * The cast is safe because onlyOnRight contains all the keys of right.
+         *
+         * TODO(cpovirk): Consider checking onlyOnRight.containsKey instead of right.containsKey.
+         * That could change behavior if the input maps use different equivalence relations (and so
+         * a key that appears once in `right` might appear multiple times in `left`). We don't
+         * guarantee behavior in that case, anyway, and the current behavior is likely undesirable.
+         * So that's either a reason to feel free to change it or a reason to not bother thinking
+         * further about this.
+         */
+        V rightValue = uncheckedCastNullableTToT(onlyOnRight.remove(leftKey));
         if (valueEquivalence.equivalent(leftValue, rightValue)) {
           onBoth.put(leftKey, leftValue);
         } else {
@@ -497,7 +566,8 @@
     }
   }
 
-  private static <K, V> Map<K, V> unmodifiableMap(Map<K, ? extends V> map) {
+  private static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> unmodifiableMap(
+      Map<K, ? extends V> map) {
     if (map instanceof SortedMap) {
       return Collections.unmodifiableSortedMap((SortedMap<K, ? extends V>) map);
     } else {
@@ -505,7 +575,8 @@
     }
   }
 
-  static class MapDifferenceImpl<K, V> implements MapDifference<K, V> {
+  static class MapDifferenceImpl<K extends @Nullable Object, V extends @Nullable Object>
+      implements MapDifference<K, V> {
     final Map<K, V> onlyOnLeft;
     final Map<K, V> onlyOnRight;
     final Map<K, V> onBoth;
@@ -548,7 +619,7 @@
     }
 
     @Override
-    public boolean equals(Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
@@ -588,31 +659,35 @@
     }
   }
 
-  static class ValueDifferenceImpl<V> implements MapDifference.ValueDifference<V> {
-    @NullableDecl private final V left;
-    @NullableDecl private final V right;
+  static class ValueDifferenceImpl<V extends @Nullable Object>
+      implements MapDifference.ValueDifference<V> {
+    @ParametricNullness private final V left;
+    @ParametricNullness private final V right;
 
-    static <V> ValueDifference<V> create(@NullableDecl V left, @NullableDecl V right) {
+    static <V extends @Nullable Object> ValueDifference<V> create(
+        @ParametricNullness V left, @ParametricNullness V right) {
       return new ValueDifferenceImpl<V>(left, right);
     }
 
-    private ValueDifferenceImpl(@NullableDecl V left, @NullableDecl V right) {
+    private ValueDifferenceImpl(@ParametricNullness V left, @ParametricNullness V right) {
       this.left = left;
       this.right = right;
     }
 
     @Override
+    @ParametricNullness
     public V leftValue() {
       return left;
     }
 
     @Override
+    @ParametricNullness
     public V rightValue() {
       return right;
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof MapDifference.ValueDifference) {
         MapDifference.ValueDifference<?> that = (MapDifference.ValueDifference<?>) object;
         return Objects.equal(this.left, that.leftValue())
@@ -632,8 +707,8 @@
     }
   }
 
-  static class SortedMapDifferenceImpl<K, V> extends MapDifferenceImpl<K, V>
-      implements SortedMapDifference<K, V> {
+  static class SortedMapDifferenceImpl<K extends @Nullable Object, V extends @Nullable Object>
+      extends MapDifferenceImpl<K, V> implements SortedMapDifference<K, V> {
     SortedMapDifferenceImpl(
         SortedMap<K, V> onlyOnLeft,
         SortedMap<K, V> onlyOnRight,
@@ -669,7 +744,8 @@
    * ugly type-casting in one place.
    */
   @SuppressWarnings("unchecked")
-  static <E> Comparator<? super E> orNaturalOrder(@NullableDecl Comparator<? super E> comparator) {
+  static <E extends @Nullable Object> Comparator<? super E> orNaturalOrder(
+      @CheckForNull Comparator<? super E> comparator) {
     if (comparator != null) { // can't use ? : because of javac bug 5080917
       return comparator;
     }
@@ -700,7 +776,8 @@
    *
    * @since 14.0
    */
-  public static <K, V> Map<K, V> asMap(Set<K> set, Function<? super K, V> function) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> asMap(
+      Set<K> set, Function<? super K, V> function) {
     return new AsMapView<>(set, function);
   }
 
@@ -727,7 +804,8 @@
    *
    * @since 14.0
    */
-  public static <K, V> SortedMap<K, V> asMap(SortedSet<K> set, Function<? super K, V> function) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> SortedMap<K, V> asMap(
+      SortedSet<K> set, Function<? super K, V> function) {
     return new SortedAsMapView<>(set, function);
   }
 
@@ -755,12 +833,13 @@
    * @since 14.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> asMap(
+  public static <K extends @Nullable Object, V extends @Nullable Object> NavigableMap<K, V> asMap(
       NavigableSet<K> set, Function<? super K, V> function) {
     return new NavigableAsMapView<>(set, function);
   }
 
-  private static class AsMapView<K, V> extends ViewCachingAbstractMap<K, V> {
+  private static class AsMapView<K extends @Nullable Object, V extends @Nullable Object>
+      extends ViewCachingAbstractMap<K, V> {
 
     private final Set<K> set;
     final Function<? super K, V> function;
@@ -790,12 +869,13 @@
     }
 
     @Override
-    public boolean containsKey(@NullableDecl Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return backingSet().contains(key);
     }
 
     @Override
-    public V get(@NullableDecl Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       if (Collections2.safeContains(backingSet(), key)) {
         @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
         K k = (K) key;
@@ -806,7 +886,8 @@
     }
 
     @Override
-    public V remove(@NullableDecl Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       if (backingSet().remove(key)) {
         @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
         K k = (K) key;
@@ -839,17 +920,18 @@
     }
   }
 
-  static <K, V> Iterator<Entry<K, V>> asMapEntryIterator(
-      Set<K> set, final Function<? super K, V> function) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      Iterator<Entry<K, V>> asMapEntryIterator(Set<K> set, final Function<? super K, V> function) {
     return new TransformedIterator<K, Entry<K, V>>(set.iterator()) {
       @Override
-      Entry<K, V> transform(final K key) {
+      Entry<K, V> transform(@ParametricNullness final K key) {
         return immutableEntry(key, function.apply(key));
       }
     };
   }
 
-  private static class SortedAsMapView<K, V> extends AsMapView<K, V> implements SortedMap<K, V> {
+  private static class SortedAsMapView<K extends @Nullable Object, V extends @Nullable Object>
+      extends AsMapView<K, V> implements SortedMap<K, V> {
 
     SortedAsMapView(SortedSet<K> set, Function<? super K, V> function) {
       super(set, function);
@@ -861,6 +943,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return backingSet().comparator();
     }
@@ -871,33 +954,37 @@
     }
 
     @Override
-    public SortedMap<K, V> subMap(K fromKey, K toKey) {
+    public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return asMap(backingSet().subSet(fromKey, toKey), function);
     }
 
     @Override
-    public SortedMap<K, V> headMap(K toKey) {
+    public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
       return asMap(backingSet().headSet(toKey), function);
     }
 
     @Override
-    public SortedMap<K, V> tailMap(K fromKey) {
+    public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
       return asMap(backingSet().tailSet(fromKey), function);
     }
 
     @Override
+    @ParametricNullness
     public K firstKey() {
       return backingSet().first();
     }
 
     @Override
+    @ParametricNullness
     public K lastKey() {
       return backingSet().last();
     }
   }
 
   @GwtIncompatible // NavigableMap
-  private static final class NavigableAsMapView<K, V> extends AbstractNavigableMap<K, V> {
+  private static final class NavigableAsMapView<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractNavigableMap<K, V> {
     /*
      * Using AbstractNavigableMap is simpler than extending SortedAsMapView and rewriting all the
      * NavigableMap methods.
@@ -913,28 +1000,32 @@
 
     @Override
     public NavigableMap<K, V> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return asMap(set.subSet(fromKey, fromInclusive, toKey, toInclusive), function);
     }
 
     @Override
-    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, V> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return asMap(set.headSet(toKey, inclusive), function);
     }
 
     @Override
-    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, V> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
       return asMap(set.tailSet(fromKey, inclusive), function);
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return set.comparator();
     }
 
     @Override
-    @NullableDecl
-    public V get(@NullableDecl Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       if (Collections2.safeContains(set, key)) {
         @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
         K k = (K) key;
@@ -975,7 +1066,7 @@
     }
   }
 
-  private static <E> Set<E> removeOnlySet(final Set<E> set) {
+  private static <E extends @Nullable Object> Set<E> removeOnlySet(final Set<E> set) {
     return new ForwardingSet<E>() {
       @Override
       protected Set<E> delegate() {
@@ -983,7 +1074,7 @@
       }
 
       @Override
-      public boolean add(E element) {
+      public boolean add(@ParametricNullness E element) {
         throw new UnsupportedOperationException();
       }
 
@@ -994,7 +1085,8 @@
     };
   }
 
-  private static <E> SortedSet<E> removeOnlySortedSet(final SortedSet<E> set) {
+  private static <E extends @Nullable Object> SortedSet<E> removeOnlySortedSet(
+      final SortedSet<E> set) {
     return new ForwardingSortedSet<E>() {
       @Override
       protected SortedSet<E> delegate() {
@@ -1002,7 +1094,7 @@
       }
 
       @Override
-      public boolean add(E element) {
+      public boolean add(@ParametricNullness E element) {
         throw new UnsupportedOperationException();
       }
 
@@ -1012,24 +1104,26 @@
       }
 
       @Override
-      public SortedSet<E> headSet(E toElement) {
+      public SortedSet<E> headSet(@ParametricNullness E toElement) {
         return removeOnlySortedSet(super.headSet(toElement));
       }
 
       @Override
-      public SortedSet<E> subSet(E fromElement, E toElement) {
+      public SortedSet<E> subSet(
+          @ParametricNullness E fromElement, @ParametricNullness E toElement) {
         return removeOnlySortedSet(super.subSet(fromElement, toElement));
       }
 
       @Override
-      public SortedSet<E> tailSet(E fromElement) {
+      public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
         return removeOnlySortedSet(super.tailSet(fromElement));
       }
     };
   }
 
   @GwtIncompatible // NavigableSet
-  private static <E> NavigableSet<E> removeOnlyNavigableSet(final NavigableSet<E> set) {
+  private static <E extends @Nullable Object> NavigableSet<E> removeOnlyNavigableSet(
+      final NavigableSet<E> set) {
     return new ForwardingNavigableSet<E>() {
       @Override
       protected NavigableSet<E> delegate() {
@@ -1037,7 +1131,7 @@
       }
 
       @Override
-      public boolean add(E element) {
+      public boolean add(@ParametricNullness E element) {
         throw new UnsupportedOperationException();
       }
 
@@ -1047,34 +1141,38 @@
       }
 
       @Override
-      public SortedSet<E> headSet(E toElement) {
+      public SortedSet<E> headSet(@ParametricNullness E toElement) {
         return removeOnlySortedSet(super.headSet(toElement));
       }
 
       @Override
-      public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+      public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
         return removeOnlyNavigableSet(super.headSet(toElement, inclusive));
       }
 
       @Override
-      public SortedSet<E> subSet(E fromElement, E toElement) {
+      public SortedSet<E> subSet(
+          @ParametricNullness E fromElement, @ParametricNullness E toElement) {
         return removeOnlySortedSet(super.subSet(fromElement, toElement));
       }
 
       @Override
       public NavigableSet<E> subSet(
-          E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+          @ParametricNullness E fromElement,
+          boolean fromInclusive,
+          @ParametricNullness E toElement,
+          boolean toInclusive) {
         return removeOnlyNavigableSet(
             super.subSet(fromElement, fromInclusive, toElement, toInclusive));
       }
 
       @Override
-      public SortedSet<E> tailSet(E fromElement) {
+      public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
         return removeOnlySortedSet(super.tailSet(fromElement));
       }
 
       @Override
-      public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+      public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
         return removeOnlyNavigableSet(super.tailSet(fromElement, inclusive));
       }
 
@@ -1220,16 +1318,42 @@
    *
    * @param properties a {@code Properties} object to be converted
    * @return an immutable map containing all the entries in {@code properties}
-   * @throws ClassCastException if any key in {@code Properties} is not a {@code String}
-   * @throws NullPointerException if any key or value in {@code Properties} is null
+   * @throws ClassCastException if any key in {@code properties} is not a {@code String}
+   * @throws NullPointerException if any key or value in {@code properties} is null
    */
   @GwtIncompatible // java.util.Properties
   public static ImmutableMap<String, String> fromProperties(Properties properties) {
     ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
 
     for (Enumeration<?> e = properties.propertyNames(); e.hasMoreElements(); ) {
-      String key = (String) e.nextElement();
-      builder.put(key, properties.getProperty(key));
+      /*
+       * requireNonNull is safe because propertyNames contains only non-null elements.
+       *
+       * Accordingly, we have it annotated as returning `Enumeration<? extends Object>` in our
+       * prototype checker's JDK. However, the checker still sees the return type as plain
+       * `Enumeration<?>`, probably because of one of the following two bugs (and maybe those two
+       * bugs are themselves just symptoms of the same underlying problem):
+       *
+       * https://github.com/typetools/checker-framework/issues/3030
+       *
+       * https://github.com/typetools/checker-framework/issues/3236
+       */
+      String key = (String) requireNonNull(e.nextElement());
+      /*
+       * requireNonNull is safe because the key came from propertyNames...
+       *
+       * ...except that it's possible for users to insert a string key with a non-string value, and
+       * in that case, getProperty *will* return null.
+       *
+       * TODO(b/192002623): Handle that case: Either:
+       *
+       * - Skip non-string keys and values entirely, as proposed in the linked bug.
+       *
+       * - Throw ClassCastException instead of NullPointerException, as documented in the current
+       *   Javadoc. (Note that we can't necessarily "just" change our call to `getProperty` to `get`
+       *   because `get` does not consult the default properties.)
+       */
+      builder.put(key, requireNonNull(properties.getProperty(key)));
     }
 
     return builder.build();
@@ -1248,7 +1372,8 @@
    * @param value the value to be associated with the returned entry
    */
   @GwtCompatible(serializable = true)
-  public static <K, V> Entry<K, V> immutableEntry(@NullableDecl K key, @NullableDecl V value) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Entry<K, V> immutableEntry(
+      @ParametricNullness K key, @ParametricNullness V value) {
     return new ImmutableEntry<>(key, value);
   }
 
@@ -1260,7 +1385,8 @@
    * @param entrySet the entries for which to return an unmodifiable view
    * @return an unmodifiable view of the entries
    */
-  static <K, V> Set<Entry<K, V>> unmodifiableEntrySet(Set<Entry<K, V>> entrySet) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      Set<Entry<K, V>> unmodifiableEntrySet(Set<Entry<K, V>> entrySet) {
     return new UnmodifiableEntrySet<>(Collections.unmodifiableSet(entrySet));
   }
 
@@ -1273,23 +1399,27 @@
    * @param entry the entry for which to return an unmodifiable view
    * @return an unmodifiable view of the entry
    */
-  static <K, V> Entry<K, V> unmodifiableEntry(final Entry<? extends K, ? extends V> entry) {
+  static <K extends @Nullable Object, V extends @Nullable Object> Entry<K, V> unmodifiableEntry(
+      final Entry<? extends K, ? extends V> entry) {
     checkNotNull(entry);
     return new AbstractMapEntry<K, V>() {
       @Override
+      @ParametricNullness
       public K getKey() {
         return entry.getKey();
       }
 
       @Override
+      @ParametricNullness
       public V getValue() {
         return entry.getValue();
       }
     };
   }
 
-  static <K, V> UnmodifiableIterator<Entry<K, V>> unmodifiableEntryIterator(
-      final Iterator<Entry<K, V>> entryIterator) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      UnmodifiableIterator<Entry<K, V>> unmodifiableEntryIterator(
+          final Iterator<Entry<K, V>> entryIterator) {
     return new UnmodifiableIterator<Entry<K, V>>() {
       @Override
       public boolean hasNext() {
@@ -1304,7 +1434,8 @@
   }
 
   /** @see Multimaps#unmodifiableEntries */
-  static class UnmodifiableEntries<K, V> extends ForwardingCollection<Entry<K, V>> {
+  static class UnmodifiableEntries<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingCollection<Entry<K, V>> {
     private final Collection<Entry<K, V>> entries;
 
     UnmodifiableEntries(Collection<Entry<K, V>> entries) {
@@ -1325,18 +1456,26 @@
 
     @Override
     public Object[] toArray() {
-      return standardToArray();
+      /*
+       * standardToArray returns `@Nullable Object[]` rather than `Object[]` but only because it can
+       * be used with collections that may contain null. This collection never contains nulls, so we
+       * can treat it as a plain `Object[]`.
+       */
+      @SuppressWarnings("nullness")
+      Object[] result = standardToArray();
+      return result;
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return standardToArray(array);
     }
   }
 
   /** @see Maps#unmodifiableEntrySet(Set) */
-  static class UnmodifiableEntrySet<K, V> extends UnmodifiableEntries<K, V>
-      implements Set<Entry<K, V>> {
+  static class UnmodifiableEntrySet<K extends @Nullable Object, V extends @Nullable Object>
+      extends UnmodifiableEntries<K, V> implements Set<Entry<K, V>> {
     UnmodifiableEntrySet(Set<Entry<K, V>> entries) {
       super(entries);
     }
@@ -1344,7 +1483,7 @@
     // See java.util.Collections.UnmodifiableEntrySet for details on attacks.
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       return Sets.equalsImpl(this, object);
     }
 
@@ -1392,7 +1531,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof BiMapConverter) {
         BiMapConverter<?, ?> that = (BiMapConverter<?, ?>) object;
         return this.bimap.equals(that.bimap);
@@ -1443,7 +1582,8 @@
    * @param bimap the bimap to be wrapped in a synchronized view
    * @return a synchronized view of the specified bimap
    */
-  public static <K, V> BiMap<K, V> synchronizedBiMap(BiMap<K, V> bimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      BiMap<K, V> synchronizedBiMap(BiMap<K, V> bimap) {
     return Synchronized.biMap(bimap, null);
   }
 
@@ -1458,19 +1598,20 @@
    * @param bimap the bimap for which an unmodifiable view is to be returned
    * @return an unmodifiable view of the specified bimap
    */
-  public static <K, V> BiMap<K, V> unmodifiableBiMap(BiMap<? extends K, ? extends V> bimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      BiMap<K, V> unmodifiableBiMap(BiMap<? extends K, ? extends V> bimap) {
     return new UnmodifiableBiMap<>(bimap, null);
   }
 
   /** @see Maps#unmodifiableBiMap(BiMap) */
-  private static class UnmodifiableBiMap<K, V> extends ForwardingMap<K, V>
-      implements BiMap<K, V>, Serializable {
+  private static class UnmodifiableBiMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingMap<K, V> implements BiMap<K, V>, Serializable {
     final Map<K, V> unmodifiableMap;
     final BiMap<? extends K, ? extends V> delegate;
-    @RetainedWith @NullableDecl BiMap<V, K> inverse;
-    @NullableDecl transient Set<V> values;
+    @RetainedWith @CheckForNull BiMap<V, K> inverse;
+    @CheckForNull transient Set<V> values;
 
-    UnmodifiableBiMap(BiMap<? extends K, ? extends V> delegate, @NullableDecl BiMap<V, K> inverse) {
+    UnmodifiableBiMap(BiMap<? extends K, ? extends V> delegate, @CheckForNull BiMap<V, K> inverse) {
       unmodifiableMap = Collections.unmodifiableMap(delegate);
       this.delegate = delegate;
       this.inverse = inverse;
@@ -1482,7 +1623,8 @@
     }
 
     @Override
-    public V forcePut(K key, V value) {
+    @CheckForNull
+    public V forcePut(@ParametricNullness K key, @ParametricNullness V value) {
       throw new UnsupportedOperationException();
     }
 
@@ -1536,8 +1678,9 @@
    * function} should be fast. To avoid lazy evaluation when the returned map doesn't need to be a
    * view, copy the returned map into a new map of your choosing.
    */
-  public static <K, V1, V2> Map<K, V2> transformValues(
-      Map<K, V1> fromMap, Function<? super V1, V2> function) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Map<K, V2> transformValues(Map<K, V1> fromMap, Function<? super V1, V2> function) {
     return transformEntries(fromMap, asEntryTransformer(function));
   }
 
@@ -1577,8 +1720,10 @@
    *
    * @since 11.0
    */
-  public static <K, V1, V2> SortedMap<K, V2> transformValues(
-      SortedMap<K, V1> fromMap, Function<? super V1, V2> function) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      SortedMap<K, V2> transformValues(
+          SortedMap<K, V1> fromMap, Function<? super V1, V2> function) {
     return transformEntries(fromMap, asEntryTransformer(function));
   }
 
@@ -1621,8 +1766,10 @@
    * @since 13.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V1, V2> NavigableMap<K, V2> transformValues(
-      NavigableMap<K, V1> fromMap, Function<? super V1, V2> function) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      NavigableMap<K, V2> transformValues(
+          NavigableMap<K, V1> fromMap, Function<? super V1, V2> function) {
     return transformEntries(fromMap, asEntryTransformer(function));
   }
 
@@ -1673,8 +1820,10 @@
    *
    * @since 7.0
    */
-  public static <K, V1, V2> Map<K, V2> transformEntries(
-      Map<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Map<K, V2> transformEntries(
+          Map<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
     return new TransformedEntriesMap<>(fromMap, transformer);
   }
 
@@ -1725,8 +1874,10 @@
    *
    * @since 11.0
    */
-  public static <K, V1, V2> SortedMap<K, V2> transformEntries(
-      SortedMap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      SortedMap<K, V2> transformEntries(
+          SortedMap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
     return new TransformedEntriesSortedMap<>(fromMap, transformer);
   }
 
@@ -1779,8 +1930,10 @@
    * @since 13.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V1, V2> NavigableMap<K, V2> transformEntries(
-      NavigableMap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      NavigableMap<K, V2> transformEntries(
+          NavigableMap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
     return new TransformedEntriesNavigableMap<>(fromMap, transformer);
   }
 
@@ -1793,7 +1946,8 @@
    * @param <V2> the value type of the output entry
    * @since 7.0
    */
-  public interface EntryTransformer<K, V1, V2> {
+  public interface EntryTransformer<
+      K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object> {
     /**
      * Determines an output value based on a key-value pair. This method is <i>generally
      * expected</i>, but not absolutely required, to have the following properties:
@@ -1808,38 +1962,43 @@
      * @throws NullPointerException if the key or value is null and this transformer does not accept
      *     null arguments
      */
-    V2 transformEntry(@NullableDecl K key, @NullableDecl V1 value);
+    V2 transformEntry(@ParametricNullness K key, @ParametricNullness V1 value);
   }
 
   /** Views a function as an entry transformer that ignores the entry key. */
-  static <K, V1, V2> EntryTransformer<K, V1, V2> asEntryTransformer(
-      final Function<? super V1, V2> function) {
+  static <K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      EntryTransformer<K, V1, V2> asEntryTransformer(final Function<? super V1, V2> function) {
     checkNotNull(function);
     return new EntryTransformer<K, V1, V2>() {
       @Override
-      public V2 transformEntry(K key, V1 value) {
+      @ParametricNullness
+      public V2 transformEntry(@ParametricNullness K key, @ParametricNullness V1 value) {
         return function.apply(value);
       }
     };
   }
 
-  static <K, V1, V2> Function<V1, V2> asValueToValueFunction(
-      final EntryTransformer<? super K, V1, V2> transformer, final K key) {
+  static <K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Function<V1, V2> asValueToValueFunction(
+          final EntryTransformer<? super K, V1, V2> transformer, @ParametricNullness final K key) {
     checkNotNull(transformer);
     return new Function<V1, V2>() {
       @Override
-      public V2 apply(@NullableDecl V1 v1) {
+      @ParametricNullness
+      public V2 apply(@ParametricNullness V1 v1) {
         return transformer.transformEntry(key, v1);
       }
     };
   }
 
   /** Views an entry transformer as a function from {@code Entry} to values. */
-  static <K, V1, V2> Function<Entry<K, V1>, V2> asEntryToValueFunction(
-      final EntryTransformer<? super K, ? super V1, V2> transformer) {
+  static <K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Function<Entry<K, V1>, V2> asEntryToValueFunction(
+          final EntryTransformer<? super K, ? super V1, V2> transformer) {
     checkNotNull(transformer);
     return new Function<Entry<K, V1>, V2>() {
       @Override
+      @ParametricNullness
       public V2 apply(Entry<K, V1> entry) {
         return transformer.transformEntry(entry.getKey(), entry.getValue());
       }
@@ -1847,17 +2006,20 @@
   }
 
   /** Returns a view of an entry transformed by the specified transformer. */
-  static <V2, K, V1> Entry<K, V2> transformEntry(
-      final EntryTransformer<? super K, ? super V1, V2> transformer, final Entry<K, V1> entry) {
+  static <V2 extends @Nullable Object, K extends @Nullable Object, V1 extends @Nullable Object>
+      Entry<K, V2> transformEntry(
+          final EntryTransformer<? super K, ? super V1, V2> transformer, final Entry<K, V1> entry) {
     checkNotNull(transformer);
     checkNotNull(entry);
     return new AbstractMapEntry<K, V2>() {
       @Override
+      @ParametricNullness
       public K getKey() {
         return entry.getKey();
       }
 
       @Override
+      @ParametricNullness
       public V2 getValue() {
         return transformer.transformEntry(entry.getKey(), entry.getValue());
       }
@@ -1865,8 +2027,9 @@
   }
 
   /** Views an entry transformer as a function from entries to entries. */
-  static <K, V1, V2> Function<Entry<K, V1>, Entry<K, V2>> asEntryToEntryFunction(
-      final EntryTransformer<? super K, ? super V1, V2> transformer) {
+  static <K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Function<Entry<K, V1>, Entry<K, V2>> asEntryToEntryFunction(
+          final EntryTransformer<? super K, ? super V1, V2> transformer) {
     checkNotNull(transformer);
     return new Function<Entry<K, V1>, Entry<K, V2>>() {
       @Override
@@ -1876,7 +2039,9 @@
     };
   }
 
-  static class TransformedEntriesMap<K, V1, V2> extends IteratorBasedAbstractMap<K, V2> {
+  static class TransformedEntriesMap<
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      extends IteratorBasedAbstractMap<K, V2> {
     final Map<K, V1> fromMap;
     final EntryTransformer<? super K, ? super V1, V2> transformer;
 
@@ -1892,26 +2057,31 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return fromMap.containsKey(key);
     }
 
     // safe as long as the user followed the <b>Warning</b> in the javadoc
     @SuppressWarnings("unchecked")
     @Override
-    public V2 get(Object key) {
+    @CheckForNull
+    public V2 get(@CheckForNull Object key) {
       V1 value = fromMap.get(key);
-      return (value != null || fromMap.containsKey(key))
-          ? transformer.transformEntry((K) key, value)
-          : null;
+      if (value != null || fromMap.containsKey(key)) {
+        // The cast is safe because of the containsKey check.
+        return transformer.transformEntry((K) key, uncheckedCastNullableTToT(value));
+      }
+      return null;
     }
 
     // safe as long as the user followed the <b>Warning</b> in the javadoc
     @SuppressWarnings("unchecked")
     @Override
-    public V2 remove(Object key) {
+    @CheckForNull
+    public V2 remove(@CheckForNull Object key) {
       return fromMap.containsKey(key)
-          ? transformer.transformEntry((K) key, fromMap.remove(key))
+          // The cast is safe because of the containsKey check.
+          ? transformer.transformEntry((K) key, uncheckedCastNullableTToT(fromMap.remove(key)))
           : null;
     }
 
@@ -1937,8 +2107,9 @@
     }
   }
 
-  static class TransformedEntriesSortedMap<K, V1, V2> extends TransformedEntriesMap<K, V1, V2>
-      implements SortedMap<K, V2> {
+  static class TransformedEntriesSortedMap<
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      extends TransformedEntriesMap<K, V1, V2> implements SortedMap<K, V2> {
 
     protected SortedMap<K, V1> fromMap() {
       return (SortedMap<K, V1>) fromMap;
@@ -1950,38 +2121,42 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return fromMap().comparator();
     }
 
     @Override
+    @ParametricNullness
     public K firstKey() {
       return fromMap().firstKey();
     }
 
     @Override
-    public SortedMap<K, V2> headMap(K toKey) {
+    public SortedMap<K, V2> headMap(@ParametricNullness K toKey) {
       return transformEntries(fromMap().headMap(toKey), transformer);
     }
 
     @Override
+    @ParametricNullness
     public K lastKey() {
       return fromMap().lastKey();
     }
 
     @Override
-    public SortedMap<K, V2> subMap(K fromKey, K toKey) {
+    public SortedMap<K, V2> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return transformEntries(fromMap().subMap(fromKey, toKey), transformer);
     }
 
     @Override
-    public SortedMap<K, V2> tailMap(K fromKey) {
+    public SortedMap<K, V2> tailMap(@ParametricNullness K fromKey) {
       return transformEntries(fromMap().tailMap(fromKey), transformer);
     }
   }
 
   @GwtIncompatible // NavigableMap
-  private static class TransformedEntriesNavigableMap<K, V1, V2>
+  private static class TransformedEntriesNavigableMap<
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
       extends TransformedEntriesSortedMap<K, V1, V2> implements NavigableMap<K, V2> {
 
     TransformedEntriesNavigableMap(
@@ -1990,12 +2165,14 @@
     }
 
     @Override
-    public Entry<K, V2> ceilingEntry(K key) {
+    @CheckForNull
+    public Entry<K, V2> ceilingEntry(@ParametricNullness K key) {
       return transformEntry(fromMap().ceilingEntry(key));
     }
 
     @Override
-    public K ceilingKey(K key) {
+    @CheckForNull
+    public K ceilingKey(@ParametricNullness K key) {
       return fromMap().ceilingKey(key);
     }
 
@@ -2010,52 +2187,60 @@
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V2> firstEntry() {
       return transformEntry(fromMap().firstEntry());
     }
 
     @Override
-    public Entry<K, V2> floorEntry(K key) {
+    @CheckForNull
+    public Entry<K, V2> floorEntry(@ParametricNullness K key) {
       return transformEntry(fromMap().floorEntry(key));
     }
 
     @Override
-    public K floorKey(K key) {
+    @CheckForNull
+    public K floorKey(@ParametricNullness K key) {
       return fromMap().floorKey(key);
     }
 
     @Override
-    public NavigableMap<K, V2> headMap(K toKey) {
+    public NavigableMap<K, V2> headMap(@ParametricNullness K toKey) {
       return headMap(toKey, false);
     }
 
     @Override
-    public NavigableMap<K, V2> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, V2> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return transformEntries(fromMap().headMap(toKey, inclusive), transformer);
     }
 
     @Override
-    public Entry<K, V2> higherEntry(K key) {
+    @CheckForNull
+    public Entry<K, V2> higherEntry(@ParametricNullness K key) {
       return transformEntry(fromMap().higherEntry(key));
     }
 
     @Override
-    public K higherKey(K key) {
+    @CheckForNull
+    public K higherKey(@ParametricNullness K key) {
       return fromMap().higherKey(key);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V2> lastEntry() {
       return transformEntry(fromMap().lastEntry());
     }
 
     @Override
-    public Entry<K, V2> lowerEntry(K key) {
+    @CheckForNull
+    public Entry<K, V2> lowerEntry(@ParametricNullness K key) {
       return transformEntry(fromMap().lowerEntry(key));
     }
 
     @Override
-    public K lowerKey(K key) {
+    @CheckForNull
+    public K lowerKey(@ParametricNullness K key) {
       return fromMap().lowerKey(key);
     }
 
@@ -2065,39 +2250,44 @@
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V2> pollFirstEntry() {
       return transformEntry(fromMap().pollFirstEntry());
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V2> pollLastEntry() {
       return transformEntry(fromMap().pollLastEntry());
     }
 
     @Override
     public NavigableMap<K, V2> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return transformEntries(
           fromMap().subMap(fromKey, fromInclusive, toKey, toInclusive), transformer);
     }
 
     @Override
-    public NavigableMap<K, V2> subMap(K fromKey, K toKey) {
+    public NavigableMap<K, V2> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return subMap(fromKey, true, toKey, false);
     }
 
     @Override
-    public NavigableMap<K, V2> tailMap(K fromKey) {
+    public NavigableMap<K, V2> tailMap(@ParametricNullness K fromKey) {
       return tailMap(fromKey, true);
     }
 
     @Override
-    public NavigableMap<K, V2> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, V2> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
       return transformEntries(fromMap().tailMap(fromKey, inclusive), transformer);
     }
 
-    @NullableDecl
-    private Entry<K, V2> transformEntry(@NullableDecl Entry<K, V1> entry) {
+    @CheckForNull
+    private Entry<K, V2> transformEntry(@CheckForNull Entry<K, V1> entry) {
       return (entry == null) ? null : Maps.transformEntry(transformer, entry);
     }
 
@@ -2107,11 +2297,13 @@
     }
   }
 
-  static <K> Predicate<Entry<K, ?>> keyPredicateOnEntries(Predicate<? super K> keyPredicate) {
+  static <K extends @Nullable Object> Predicate<Entry<K, ?>> keyPredicateOnEntries(
+      Predicate<? super K> keyPredicate) {
     return compose(keyPredicate, Maps.<K>keyFunction());
   }
 
-  static <V> Predicate<Entry<?, V>> valuePredicateOnEntries(Predicate<? super V> valuePredicate) {
+  static <V extends @Nullable Object> Predicate<Entry<?, V>> valuePredicateOnEntries(
+      Predicate<? super V> valuePredicate) {
     return compose(valuePredicate, Maps.<V>valueFunction());
   }
 
@@ -2138,7 +2330,7 @@
    * {@link Predicate#apply}. Do not provide a predicate such as {@code
    * Predicates.instanceOf(ArrayList.class)}, which is inconsistent with equals.
    */
-  public static <K, V> Map<K, V> filterKeys(
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> filterKeys(
       Map<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     checkNotNull(keyPredicate);
     Predicate<Entry<K, ?>> entryPredicate = keyPredicateOnEntries(keyPredicate);
@@ -2173,7 +2365,7 @@
    *
    * @since 11.0
    */
-  public static <K, V> SortedMap<K, V> filterKeys(
+  public static <K extends @Nullable Object, V extends @Nullable Object> SortedMap<K, V> filterKeys(
       SortedMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     // TODO(lowasser): Return a subclass of Maps.FilteredKeyMap for slightly better
     // performance.
@@ -2207,8 +2399,9 @@
    * @since 14.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> filterKeys(
-      NavigableMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> filterKeys(
+          NavigableMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     // TODO(lowasser): Return a subclass of Maps.FilteredKeyMap for slightly better
     // performance.
     return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate));
@@ -2238,7 +2431,7 @@
    *
    * @since 14.0
    */
-  public static <K, V> BiMap<K, V> filterKeys(
+  public static <K extends @Nullable Object, V extends @Nullable Object> BiMap<K, V> filterKeys(
       BiMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     checkNotNull(keyPredicate);
     return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate));
@@ -2267,7 +2460,7 @@
    * at {@link Predicate#apply}. Do not provide a predicate such as {@code
    * Predicates.instanceOf(ArrayList.class)}, which is inconsistent with equals.
    */
-  public static <K, V> Map<K, V> filterValues(
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> filterValues(
       Map<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
@@ -2298,8 +2491,9 @@
    *
    * @since 11.0
    */
-  public static <K, V> SortedMap<K, V> filterValues(
-      SortedMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedMap<K, V> filterValues(
+          SortedMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
 
@@ -2330,8 +2524,9 @@
    * @since 14.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> filterValues(
-      NavigableMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> filterValues(
+          NavigableMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
 
@@ -2362,7 +2557,7 @@
    *
    * @since 14.0
    */
-  public static <K, V> BiMap<K, V> filterValues(
+  public static <K extends @Nullable Object, V extends @Nullable Object> BiMap<K, V> filterValues(
       BiMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
@@ -2391,7 +2586,7 @@
    * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with equals</i>, as documented
    * at {@link Predicate#apply}.
    */
-  public static <K, V> Map<K, V> filterEntries(
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> filterEntries(
       Map<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(entryPredicate);
     return (unfiltered instanceof AbstractFilteredMap)
@@ -2425,8 +2620,9 @@
    *
    * @since 11.0
    */
-  public static <K, V> SortedMap<K, V> filterEntries(
-      SortedMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedMap<K, V> filterEntries(
+          SortedMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(entryPredicate);
     return (unfiltered instanceof FilteredEntrySortedMap)
         ? filterFiltered((FilteredEntrySortedMap<K, V>) unfiltered, entryPredicate)
@@ -2460,8 +2656,9 @@
    * @since 14.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> filterEntries(
-      NavigableMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> filterEntries(
+          NavigableMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(entryPredicate);
     return (unfiltered instanceof FilteredEntryNavigableMap)
         ? filterFiltered((FilteredEntryNavigableMap<K, V>) unfiltered, entryPredicate)
@@ -2495,7 +2692,7 @@
    *
    * @since 14.0
    */
-  public static <K, V> BiMap<K, V> filterEntries(
+  public static <K extends @Nullable Object, V extends @Nullable Object> BiMap<K, V> filterEntries(
       BiMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(unfiltered);
     checkNotNull(entryPredicate);
@@ -2508,7 +2705,7 @@
    * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when filtering a filtered
    * map.
    */
-  private static <K, V> Map<K, V> filterFiltered(
+  private static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> filterFiltered(
       AbstractFilteredMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
     return new FilteredEntryMap<>(
         map.unfiltered, Predicates.<Entry<K, V>>and(map.predicate, entryPredicate));
@@ -2518,8 +2715,9 @@
    * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when filtering a filtered
    * sorted map.
    */
-  private static <K, V> SortedMap<K, V> filterFiltered(
-      FilteredEntrySortedMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedMap<K, V> filterFiltered(
+          FilteredEntrySortedMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
     Predicate<Entry<K, V>> predicate = Predicates.<Entry<K, V>>and(map.predicate, entryPredicate);
     return new FilteredEntrySortedMap<>(map.sortedMap(), predicate);
   }
@@ -2529,8 +2727,9 @@
    * navigable map.
    */
   @GwtIncompatible // NavigableMap
-  private static <K, V> NavigableMap<K, V> filterFiltered(
-      FilteredEntryNavigableMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> filterFiltered(
+          FilteredEntryNavigableMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
     Predicate<Entry<K, V>> predicate =
         Predicates.<Entry<K, V>>and(map.entryPredicate, entryPredicate);
     return new FilteredEntryNavigableMap<>(map.unfiltered, predicate);
@@ -2540,13 +2739,16 @@
    * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when filtering a filtered
    * map.
    */
-  private static <K, V> BiMap<K, V> filterFiltered(
-      FilteredEntryBiMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      BiMap<K, V> filterFiltered(
+          FilteredEntryBiMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
     Predicate<Entry<K, V>> predicate = Predicates.<Entry<K, V>>and(map.predicate, entryPredicate);
     return new FilteredEntryBiMap<>(map.unfiltered(), predicate);
   }
 
-  private abstract static class AbstractFilteredMap<K, V> extends ViewCachingAbstractMap<K, V> {
+  private abstract static class AbstractFilteredMap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends ViewCachingAbstractMap<K, V> {
     final Map<K, V> unfiltered;
     final Predicate<? super Entry<K, V>> predicate;
 
@@ -2555,16 +2757,17 @@
       this.predicate = predicate;
     }
 
-    boolean apply(@NullableDecl Object key, @NullableDecl V value) {
-      // This method is called only when the key is in the map, implying that
-      // key is a K.
-      @SuppressWarnings("unchecked")
+    boolean apply(@CheckForNull Object key, @ParametricNullness V value) {
+      // This method is called only when the key is in the map (or about to be added to the map),
+      // implying that key is a K.
+      @SuppressWarnings({"unchecked", "nullness"})
       K k = (K) key;
       return predicate.apply(Maps.immutableEntry(k, value));
     }
 
     @Override
-    public V put(K key, V value) {
+    @CheckForNull
+    public V put(@ParametricNullness K key, @ParametricNullness V value) {
       checkArgument(apply(key, value));
       return unfiltered.put(key, value);
     }
@@ -2578,12 +2781,13 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return unfiltered.containsKey(key) && apply(key, unfiltered.get(key));
     }
 
     @Override
-    public V get(Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       V value = unfiltered.get(key);
       return ((value != null) && apply(key, value)) ? value : null;
     }
@@ -2594,7 +2798,8 @@
     }
 
     @Override
-    public V remove(Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       return containsKey(key) ? unfiltered.remove(key) : null;
     }
 
@@ -2604,7 +2809,9 @@
     }
   }
 
-  private static final class FilteredMapValues<K, V> extends Maps.Values<K, V> {
+  private static final class FilteredMapValues<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends Maps.Values<K, V> {
     final Map<K, V> unfiltered;
     final Predicate<? super Entry<K, V>> predicate;
 
@@ -2616,7 +2823,7 @@
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       Iterator<Entry<K, V>> entryItr = unfiltered.entrySet().iterator();
       while (entryItr.hasNext()) {
         Entry<K, V> entry = entryItr.next();
@@ -2657,18 +2864,20 @@
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       // creating an ArrayList so filtering happens once
       return Lists.newArrayList(iterator()).toArray();
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return Lists.newArrayList(iterator()).toArray(array);
     }
   }
 
-  private static class FilteredKeyMap<K, V> extends AbstractFilteredMap<K, V> {
+  private static class FilteredKeyMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractFilteredMap<K, V> {
     final Predicate<? super K> keyPredicate;
 
     FilteredKeyMap(
@@ -2693,12 +2902,13 @@
     // that key is a K.
     @Override
     @SuppressWarnings("unchecked")
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return unfiltered.containsKey(key) && keyPredicate.apply((K) key);
     }
   }
 
-  static class FilteredEntryMap<K, V> extends AbstractFilteredMap<K, V> {
+  static class FilteredEntryMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractFilteredMap<K, V> {
     /**
      * Entries in this set satisfy the predicate, but they don't validate the input to {@code
      * Entry.setValue()}.
@@ -2734,7 +2944,8 @@
               }
 
               @Override
-              public V setValue(V newValue) {
+              @ParametricNullness
+              public V setValue(@ParametricNullness V newValue) {
                 checkArgument(apply(getKey(), newValue));
                 return super.setValue(newValue);
               }
@@ -2749,7 +2960,7 @@
       return new KeySet();
     }
 
-    static <K, V> boolean removeAllKeys(
+    static <K extends @Nullable Object, V extends @Nullable Object> boolean removeAllKeys(
         Map<K, V> map, Predicate<? super Entry<K, V>> entryPredicate, Collection<?> keyCollection) {
       Iterator<Entry<K, V>> entryItr = map.entrySet().iterator();
       boolean result = false;
@@ -2763,7 +2974,7 @@
       return result;
     }
 
-    static <K, V> boolean retainAllKeys(
+    static <K extends @Nullable Object, V extends @Nullable Object> boolean retainAllKeys(
         Map<K, V> map, Predicate<? super Entry<K, V>> entryPredicate, Collection<?> keyCollection) {
       Iterator<Entry<K, V>> entryItr = map.entrySet().iterator();
       boolean result = false;
@@ -2784,7 +2995,7 @@
       }
 
       @Override
-      public boolean remove(Object o) {
+      public boolean remove(@CheckForNull Object o) {
         if (containsKey(o)) {
           unfiltered.remove(o);
           return true;
@@ -2803,20 +3014,22 @@
       }
 
       @Override
-      public Object[] toArray() {
+      public @Nullable Object[] toArray() {
         // creating an ArrayList so filtering happens once
         return Lists.newArrayList(iterator()).toArray();
       }
 
       @Override
-      public <T> T[] toArray(T[] array) {
+      @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+      public <T extends @Nullable Object> T[] toArray(T[] array) {
         return Lists.newArrayList(iterator()).toArray(array);
       }
     }
   }
 
-  private static class FilteredEntrySortedMap<K, V> extends FilteredEntryMap<K, V>
-      implements SortedMap<K, V> {
+  private static class FilteredEntrySortedMap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends FilteredEntryMap<K, V> implements SortedMap<K, V> {
 
     FilteredEntrySortedMap(
         SortedMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
@@ -2840,54 +3053,62 @@
     @WeakOuter
     class SortedKeySet extends KeySet implements SortedSet<K> {
       @Override
+      @CheckForNull
       public Comparator<? super K> comparator() {
         return sortedMap().comparator();
       }
 
       @Override
-      public SortedSet<K> subSet(K fromElement, K toElement) {
+      public SortedSet<K> subSet(
+          @ParametricNullness K fromElement, @ParametricNullness K toElement) {
         return (SortedSet<K>) subMap(fromElement, toElement).keySet();
       }
 
       @Override
-      public SortedSet<K> headSet(K toElement) {
+      public SortedSet<K> headSet(@ParametricNullness K toElement) {
         return (SortedSet<K>) headMap(toElement).keySet();
       }
 
       @Override
-      public SortedSet<K> tailSet(K fromElement) {
+      public SortedSet<K> tailSet(@ParametricNullness K fromElement) {
         return (SortedSet<K>) tailMap(fromElement).keySet();
       }
 
       @Override
+      @ParametricNullness
       public K first() {
         return firstKey();
       }
 
       @Override
+      @ParametricNullness
       public K last() {
         return lastKey();
       }
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return sortedMap().comparator();
     }
 
     @Override
+    @ParametricNullness
     public K firstKey() {
       // correctly throws NoSuchElementException when filtered map is empty.
       return keySet().iterator().next();
     }
 
     @Override
+    @ParametricNullness
     public K lastKey() {
       SortedMap<K, V> headMap = sortedMap();
       while (true) {
         // correctly throws NoSuchElementException when filtered map is empty.
         K key = headMap.lastKey();
-        if (apply(key, unfiltered.get(key))) {
+        // The cast is safe because the key is taken from the map.
+        if (apply(key, uncheckedCastNullableTToT(unfiltered.get(key)))) {
           return key;
         }
         headMap = sortedMap().headMap(key);
@@ -2895,23 +3116,25 @@
     }
 
     @Override
-    public SortedMap<K, V> headMap(K toKey) {
+    public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
       return new FilteredEntrySortedMap<>(sortedMap().headMap(toKey), predicate);
     }
 
     @Override
-    public SortedMap<K, V> subMap(K fromKey, K toKey) {
+    public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return new FilteredEntrySortedMap<>(sortedMap().subMap(fromKey, toKey), predicate);
     }
 
     @Override
-    public SortedMap<K, V> tailMap(K fromKey) {
+    public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
       return new FilteredEntrySortedMap<>(sortedMap().tailMap(fromKey), predicate);
     }
   }
 
   @GwtIncompatible // NavigableMap
-  private static class FilteredEntryNavigableMap<K, V> extends AbstractNavigableMap<K, V> {
+  private static class FilteredEntryNavigableMap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractNavigableMap<K, V> {
     /*
      * It's less code to extend AbstractNavigableMap and forward the filtering logic to
      * FilteredEntryMap than to extend FilteredEntrySortedMap and reimplement all the NavigableMap
@@ -2930,6 +3153,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return unfiltered.comparator();
     }
@@ -2975,23 +3199,25 @@
     }
 
     @Override
-    @NullableDecl
-    public V get(@NullableDecl Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       return filteredDelegate.get(key);
     }
 
     @Override
-    public boolean containsKey(@NullableDecl Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return filteredDelegate.containsKey(key);
     }
 
     @Override
-    public V put(K key, V value) {
+    @CheckForNull
+    public V put(@ParametricNullness K key, @ParametricNullness V value) {
       return filteredDelegate.put(key, value);
     }
 
     @Override
-    public V remove(@NullableDecl Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       return filteredDelegate.remove(key);
     }
 
@@ -3011,11 +3237,13 @@
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> pollFirstEntry() {
       return Iterables.removeFirstMatching(unfiltered.entrySet(), entryPredicate);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> pollLastEntry() {
       return Iterables.removeFirstMatching(unfiltered.descendingMap().entrySet(), entryPredicate);
     }
@@ -3027,28 +3255,32 @@
 
     @Override
     public NavigableMap<K, V> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return filterEntries(
           unfiltered.subMap(fromKey, fromInclusive, toKey, toInclusive), entryPredicate);
     }
 
     @Override
-    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, V> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return filterEntries(unfiltered.headMap(toKey, inclusive), entryPredicate);
     }
 
     @Override
-    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, V> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
       return filterEntries(unfiltered.tailMap(fromKey, inclusive), entryPredicate);
     }
   }
 
-  static final class FilteredEntryBiMap<K, V> extends FilteredEntryMap<K, V>
-      implements BiMap<K, V> {
+  static final class FilteredEntryBiMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends FilteredEntryMap<K, V> implements BiMap<K, V> {
     @RetainedWith private final BiMap<V, K> inverse;
 
-    private static <K, V> Predicate<Entry<V, K>> inversePredicate(
-        final Predicate<? super Entry<K, V>> forwardPredicate) {
+    private static <K extends @Nullable Object, V extends @Nullable Object>
+        Predicate<Entry<V, K>> inversePredicate(
+            final Predicate<? super Entry<K, V>> forwardPredicate) {
       return new Predicate<Entry<V, K>>() {
         @Override
         public boolean apply(Entry<V, K> input) {
@@ -3074,7 +3306,8 @@
     }
 
     @Override
-    public V forcePut(@NullableDecl K key, @NullableDecl V value) {
+    @CheckForNull
+    public V forcePut(@ParametricNullness K key, @ParametricNullness V value) {
       checkArgument(apply(key, value));
       return unfiltered().forcePut(key, value);
     }
@@ -3109,8 +3342,8 @@
    * @since 12.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> unmodifiableNavigableMap(
-      NavigableMap<K, ? extends V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> unmodifiableNavigableMap(NavigableMap<K, ? extends V> map) {
     checkNotNull(map);
     if (map instanceof UnmodifiableNavigableMap) {
       @SuppressWarnings("unchecked") // covariant
@@ -3121,14 +3354,15 @@
     }
   }
 
-  @NullableDecl
-  private static <K, V> Entry<K, V> unmodifiableOrNull(@NullableDecl Entry<K, ? extends V> entry) {
+  @CheckForNull
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      Entry<K, V> unmodifiableOrNull(@CheckForNull Entry<K, ? extends V> entry) {
     return (entry == null) ? null : Maps.unmodifiableEntry(entry);
   }
 
   @GwtIncompatible // NavigableMap
-  static class UnmodifiableNavigableMap<K, V> extends ForwardingSortedMap<K, V>
-      implements NavigableMap<K, V>, Serializable {
+  static class UnmodifiableNavigableMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingSortedMap<K, V> implements NavigableMap<K, V>, Serializable {
     private final NavigableMap<K, ? extends V> delegate;
 
     UnmodifiableNavigableMap(NavigableMap<K, ? extends V> delegate) {
@@ -3147,66 +3381,78 @@
     }
 
     @Override
-    public Entry<K, V> lowerEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> lowerEntry(@ParametricNullness K key) {
       return unmodifiableOrNull(delegate.lowerEntry(key));
     }
 
     @Override
-    public K lowerKey(K key) {
+    @CheckForNull
+    public K lowerKey(@ParametricNullness K key) {
       return delegate.lowerKey(key);
     }
 
     @Override
-    public Entry<K, V> floorEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> floorEntry(@ParametricNullness K key) {
       return unmodifiableOrNull(delegate.floorEntry(key));
     }
 
     @Override
-    public K floorKey(K key) {
+    @CheckForNull
+    public K floorKey(@ParametricNullness K key) {
       return delegate.floorKey(key);
     }
 
     @Override
-    public Entry<K, V> ceilingEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> ceilingEntry(@ParametricNullness K key) {
       return unmodifiableOrNull(delegate.ceilingEntry(key));
     }
 
     @Override
-    public K ceilingKey(K key) {
+    @CheckForNull
+    public K ceilingKey(@ParametricNullness K key) {
       return delegate.ceilingKey(key);
     }
 
     @Override
-    public Entry<K, V> higherEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> higherEntry(@ParametricNullness K key) {
       return unmodifiableOrNull(delegate.higherEntry(key));
     }
 
     @Override
-    public K higherKey(K key) {
+    @CheckForNull
+    public K higherKey(@ParametricNullness K key) {
       return delegate.higherKey(key);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> firstEntry() {
       return unmodifiableOrNull(delegate.firstEntry());
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> lastEntry() {
       return unmodifiableOrNull(delegate.lastEntry());
     }
 
     @Override
+    @CheckForNull
     public final Entry<K, V> pollFirstEntry() {
       throw new UnsupportedOperationException();
     }
 
     @Override
+    @CheckForNull
     public final Entry<K, V> pollLastEntry() {
       throw new UnsupportedOperationException();
     }
 
-    @NullableDecl private transient UnmodifiableNavigableMap<K, V> descendingMap;
+    @CheckForNull private transient UnmodifiableNavigableMap<K, V> descendingMap;
 
     @Override
     public NavigableMap<K, V> descendingMap() {
@@ -3232,34 +3478,37 @@
     }
 
     @Override
-    public SortedMap<K, V> subMap(K fromKey, K toKey) {
+    public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return subMap(fromKey, true, toKey, false);
     }
 
     @Override
     public NavigableMap<K, V> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return Maps.unmodifiableNavigableMap(
           delegate.subMap(fromKey, fromInclusive, toKey, toInclusive));
     }
 
     @Override
-    public SortedMap<K, V> headMap(K toKey) {
+    public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
       return headMap(toKey, false);
     }
 
     @Override
-    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, V> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return Maps.unmodifiableNavigableMap(delegate.headMap(toKey, inclusive));
     }
 
     @Override
-    public SortedMap<K, V> tailMap(K fromKey) {
+    public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
       return tailMap(fromKey, true);
     }
 
     @Override
-    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, V> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
       return Maps.unmodifiableNavigableMap(delegate.tailMap(fromKey, inclusive));
     }
   }
@@ -3314,8 +3563,8 @@
    * @since 13.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> synchronizedNavigableMap(
-      NavigableMap<K, V> navigableMap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> synchronizedNavigableMap(NavigableMap<K, V> navigableMap) {
     return Synchronized.navigableMap(navigableMap);
   }
 
@@ -3324,14 +3573,16 @@
    * entrySet views.
    */
   @GwtCompatible
-  abstract static class ViewCachingAbstractMap<K, V> extends AbstractMap<K, V> {
+  abstract static class ViewCachingAbstractMap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMap<K, V> {
     /**
      * Creates the entry set to be returned by {@link #entrySet()}. This method is invoked at most
      * once on a given map, at the time when {@code entrySet} is first called.
      */
     abstract Set<Entry<K, V>> createEntrySet();
 
-    @NullableDecl private transient Set<Entry<K, V>> entrySet;
+    @CheckForNull private transient Set<Entry<K, V>> entrySet;
 
     @Override
     public Set<Entry<K, V>> entrySet() {
@@ -3339,7 +3590,7 @@
       return (result == null) ? entrySet = createEntrySet() : result;
     }
 
-    @NullableDecl private transient Set<K> keySet;
+    @CheckForNull private transient Set<K> keySet;
 
     @Override
     public Set<K> keySet() {
@@ -3351,7 +3602,7 @@
       return new KeySet<>(this);
     }
 
-    @NullableDecl private transient Collection<V> values;
+    @CheckForNull private transient Collection<V> values;
 
     @Override
     public Collection<V> values() {
@@ -3364,7 +3615,9 @@
     }
   }
 
-  abstract static class IteratorBasedAbstractMap<K, V> extends AbstractMap<K, V> {
+  abstract static class IteratorBasedAbstractMap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMap<K, V> {
     @Override
     public abstract int size();
 
@@ -3395,7 +3648,8 @@
    * Delegates to {@link Map#get}. Returns {@code null} on {@code ClassCastException} and {@code
    * NullPointerException}.
    */
-  static <V> V safeGet(Map<?, V> map, @NullableDecl Object key) {
+  @CheckForNull
+  static <V extends @Nullable Object> V safeGet(Map<?, V> map, @CheckForNull Object key) {
     checkNotNull(map);
     try {
       return map.get(key);
@@ -3408,7 +3662,7 @@
    * Delegates to {@link Map#containsKey}. Returns {@code false} on {@code ClassCastException} and
    * {@code NullPointerException}.
    */
-  static boolean safeContainsKey(Map<?, ?> map, Object key) {
+  static boolean safeContainsKey(Map<?, ?> map, @CheckForNull Object key) {
     checkNotNull(map);
     try {
       return map.containsKey(key);
@@ -3421,7 +3675,8 @@
    * Delegates to {@link Map#remove}. Returns {@code null} on {@code ClassCastException} and {@code
    * NullPointerException}.
    */
-  static <V> V safeRemove(Map<?, V> map, Object key) {
+  @CheckForNull
+  static <V extends @Nullable Object> V safeRemove(Map<?, V> map, @CheckForNull Object key) {
     checkNotNull(map);
     try {
       return map.remove(key);
@@ -3431,12 +3686,12 @@
   }
 
   /** An admittedly inefficient implementation of {@link Map#containsKey}. */
-  static boolean containsKeyImpl(Map<?, ?> map, @NullableDecl Object key) {
+  static boolean containsKeyImpl(Map<?, ?> map, @CheckForNull Object key) {
     return Iterators.contains(keyIterator(map.entrySet().iterator()), key);
   }
 
   /** An implementation of {@link Map#containsValue}. */
-  static boolean containsValueImpl(Map<?, ?> map, @NullableDecl Object value) {
+  static boolean containsValueImpl(Map<?, ?> map, @CheckForNull Object value) {
     return Iterators.contains(valueIterator(map.entrySet().iterator()), value);
   }
 
@@ -3452,7 +3707,8 @@
    * @param o the object that might be contained in {@code c}
    * @return {@code true} if {@code c} contains {@code o}
    */
-  static <K, V> boolean containsEntryImpl(Collection<Entry<K, V>> c, Object o) {
+  static <K extends @Nullable Object, V extends @Nullable Object> boolean containsEntryImpl(
+      Collection<Entry<K, V>> c, @CheckForNull Object o) {
     if (!(o instanceof Entry)) {
       return false;
     }
@@ -3470,7 +3726,8 @@
    * @param o the object to remove from {@code c}
    * @return {@code true} if {@code c} was changed
    */
-  static <K, V> boolean removeEntryImpl(Collection<Entry<K, V>> c, Object o) {
+  static <K extends @Nullable Object, V extends @Nullable Object> boolean removeEntryImpl(
+      Collection<Entry<K, V>> c, @CheckForNull Object o) {
     if (!(o instanceof Entry)) {
       return false;
     }
@@ -3478,7 +3735,7 @@
   }
 
   /** An implementation of {@link Map#equals}. */
-  static boolean equalsImpl(Map<?, ?> map, Object object) {
+  static boolean equalsImpl(Map<?, ?> map, @CheckForNull Object object) {
     if (map == object) {
       return true;
     } else if (object instanceof Map) {
@@ -3503,13 +3760,15 @@
   }
 
   /** An implementation of {@link Map#putAll}. */
-  static <K, V> void putAllImpl(Map<K, V> self, Map<? extends K, ? extends V> map) {
+  static <K extends @Nullable Object, V extends @Nullable Object> void putAllImpl(
+      Map<K, V> self, Map<? extends K, ? extends V> map) {
     for (Entry<? extends K, ? extends V> entry : map.entrySet()) {
       self.put(entry.getKey(), entry.getValue());
     }
   }
 
-  static class KeySet<K, V> extends Sets.ImprovedAbstractSet<K> {
+  static class KeySet<K extends @Nullable Object, V extends @Nullable Object>
+      extends Sets.ImprovedAbstractSet<K> {
     @Weak final Map<K, V> map;
 
     KeySet(Map<K, V> map) {
@@ -3536,12 +3795,12 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return map().containsKey(o);
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       if (contains(o)) {
         map().remove(o);
         return true;
@@ -3555,17 +3814,18 @@
     }
   }
 
-  @NullableDecl
-  static <K> K keyOrNull(@NullableDecl Entry<K, ?> entry) {
+  @CheckForNull
+  static <K extends @Nullable Object> K keyOrNull(@CheckForNull Entry<K, ?> entry) {
     return (entry == null) ? null : entry.getKey();
   }
 
-  @NullableDecl
-  static <V> V valueOrNull(@NullableDecl Entry<?, V> entry) {
+  @CheckForNull
+  static <V extends @Nullable Object> V valueOrNull(@CheckForNull Entry<?, V> entry) {
     return (entry == null) ? null : entry.getValue();
   }
 
-  static class SortedKeySet<K, V> extends KeySet<K, V> implements SortedSet<K> {
+  static class SortedKeySet<K extends @Nullable Object, V extends @Nullable Object>
+      extends KeySet<K, V> implements SortedSet<K> {
     SortedKeySet(SortedMap<K, V> map) {
       super(map);
     }
@@ -3576,38 +3836,42 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return map().comparator();
     }
 
     @Override
-    public SortedSet<K> subSet(K fromElement, K toElement) {
+    public SortedSet<K> subSet(@ParametricNullness K fromElement, @ParametricNullness K toElement) {
       return new SortedKeySet<>(map().subMap(fromElement, toElement));
     }
 
     @Override
-    public SortedSet<K> headSet(K toElement) {
+    public SortedSet<K> headSet(@ParametricNullness K toElement) {
       return new SortedKeySet<>(map().headMap(toElement));
     }
 
     @Override
-    public SortedSet<K> tailSet(K fromElement) {
+    public SortedSet<K> tailSet(@ParametricNullness K fromElement) {
       return new SortedKeySet<>(map().tailMap(fromElement));
     }
 
     @Override
+    @ParametricNullness
     public K first() {
       return map().firstKey();
     }
 
     @Override
+    @ParametricNullness
     public K last() {
       return map().lastKey();
     }
   }
 
   @GwtIncompatible // NavigableMap
-  static class NavigableKeySet<K, V> extends SortedKeySet<K, V> implements NavigableSet<K> {
+  static class NavigableKeySet<K extends @Nullable Object, V extends @Nullable Object>
+      extends SortedKeySet<K, V> implements NavigableSet<K> {
     NavigableKeySet(NavigableMap<K, V> map) {
       super(map);
     }
@@ -3618,31 +3882,37 @@
     }
 
     @Override
-    public K lower(K e) {
+    @CheckForNull
+    public K lower(@ParametricNullness K e) {
       return map().lowerKey(e);
     }
 
     @Override
-    public K floor(K e) {
+    @CheckForNull
+    public K floor(@ParametricNullness K e) {
       return map().floorKey(e);
     }
 
     @Override
-    public K ceiling(K e) {
+    @CheckForNull
+    public K ceiling(@ParametricNullness K e) {
       return map().ceilingKey(e);
     }
 
     @Override
-    public K higher(K e) {
+    @CheckForNull
+    public K higher(@ParametricNullness K e) {
       return map().higherKey(e);
     }
 
     @Override
+    @CheckForNull
     public K pollFirst() {
       return keyOrNull(map().pollFirstEntry());
     }
 
     @Override
+    @CheckForNull
     public K pollLast() {
       return keyOrNull(map().pollLastEntry());
     }
@@ -3659,37 +3929,41 @@
 
     @Override
     public NavigableSet<K> subSet(
-        K fromElement, boolean fromInclusive, K toElement, boolean toInclusive) {
+        @ParametricNullness K fromElement,
+        boolean fromInclusive,
+        @ParametricNullness K toElement,
+        boolean toInclusive) {
       return map().subMap(fromElement, fromInclusive, toElement, toInclusive).navigableKeySet();
     }
 
     @Override
-    public SortedSet<K> subSet(K fromElement, K toElement) {
+    public SortedSet<K> subSet(@ParametricNullness K fromElement, @ParametricNullness K toElement) {
       return subSet(fromElement, true, toElement, false);
     }
 
     @Override
-    public NavigableSet<K> headSet(K toElement, boolean inclusive) {
+    public NavigableSet<K> headSet(@ParametricNullness K toElement, boolean inclusive) {
       return map().headMap(toElement, inclusive).navigableKeySet();
     }
 
     @Override
-    public SortedSet<K> headSet(K toElement) {
+    public SortedSet<K> headSet(@ParametricNullness K toElement) {
       return headSet(toElement, false);
     }
 
     @Override
-    public NavigableSet<K> tailSet(K fromElement, boolean inclusive) {
+    public NavigableSet<K> tailSet(@ParametricNullness K fromElement, boolean inclusive) {
       return map().tailMap(fromElement, inclusive).navigableKeySet();
     }
 
     @Override
-    public SortedSet<K> tailSet(K fromElement) {
+    public SortedSet<K> tailSet(@ParametricNullness K fromElement) {
       return tailSet(fromElement, true);
     }
   }
 
-  static class Values<K, V> extends AbstractCollection<V> {
+  static class Values<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractCollection<V> {
     @Weak final Map<K, V> map;
 
     Values(Map<K, V> map) {
@@ -3706,7 +3980,7 @@
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       try {
         return super.remove(o);
       } catch (UnsupportedOperationException e) {
@@ -3761,7 +4035,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return map().containsValue(o);
     }
 
@@ -3771,7 +4045,8 @@
     }
   }
 
-  abstract static class EntrySet<K, V> extends Sets.ImprovedAbstractSet<Entry<K, V>> {
+  abstract static class EntrySet<K extends @Nullable Object, V extends @Nullable Object>
+      extends Sets.ImprovedAbstractSet<Entry<K, V>> {
     abstract Map<K, V> map();
 
     @Override
@@ -3785,7 +4060,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) o;
         Object key = entry.getKey();
@@ -3801,8 +4076,12 @@
     }
 
     @Override
-    public boolean remove(Object o) {
-      if (contains(o)) {
+    public boolean remove(@CheckForNull Object o) {
+      /*
+       * `o instanceof Entry` is guaranteed by `contains`, but we check it here to satisfy our
+       * nullness checker.
+       */
+      if (contains(o) && o instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) o;
         return map().keySet().remove(entry.getKey());
       }
@@ -3825,9 +4104,13 @@
         return super.retainAll(checkNotNull(c));
       } catch (UnsupportedOperationException e) {
         // if the iterators don't support remove
-        Set<Object> keys = Sets.newHashSetWithExpectedSize(c.size());
+        Set<@Nullable Object> keys = Sets.newHashSetWithExpectedSize(c.size());
         for (Object o : c) {
-          if (contains(o)) {
+          /*
+           * `o instanceof Entry` is guaranteed by `contains`, but we check it here to satisfy our
+           * nullness checker.
+           */
+          if (contains(o) && o instanceof Entry) {
             Entry<?, ?> entry = (Entry<?, ?>) o;
             keys.add(entry.getKey());
           }
@@ -3838,8 +4121,8 @@
   }
 
   @GwtIncompatible // NavigableMap
-  abstract static class DescendingMap<K, V> extends ForwardingMap<K, V>
-      implements NavigableMap<K, V> {
+  abstract static class DescendingMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingMap<K, V> implements NavigableMap<K, V> {
 
     abstract NavigableMap<K, V> forward();
 
@@ -3848,7 +4131,7 @@
       return forward();
     }
 
-    @NullableDecl private transient Comparator<? super K> comparator;
+    @CheckForNull private transient Comparator<? super K> comparator;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -3865,76 +4148,90 @@
     }
 
     // If we inline this, we get a javac error.
-    private static <T> Ordering<T> reverse(Comparator<T> forward) {
+    private static <T extends @Nullable Object> Ordering<T> reverse(Comparator<T> forward) {
       return Ordering.from(forward).reverse();
     }
 
     @Override
+    @ParametricNullness
     public K firstKey() {
       return forward().lastKey();
     }
 
     @Override
+    @ParametricNullness
     public K lastKey() {
       return forward().firstKey();
     }
 
     @Override
-    public Entry<K, V> lowerEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> lowerEntry(@ParametricNullness K key) {
       return forward().higherEntry(key);
     }
 
     @Override
-    public K lowerKey(K key) {
+    @CheckForNull
+    public K lowerKey(@ParametricNullness K key) {
       return forward().higherKey(key);
     }
 
     @Override
-    public Entry<K, V> floorEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> floorEntry(@ParametricNullness K key) {
       return forward().ceilingEntry(key);
     }
 
     @Override
-    public K floorKey(K key) {
+    @CheckForNull
+    public K floorKey(@ParametricNullness K key) {
       return forward().ceilingKey(key);
     }
 
     @Override
-    public Entry<K, V> ceilingEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> ceilingEntry(@ParametricNullness K key) {
       return forward().floorEntry(key);
     }
 
     @Override
-    public K ceilingKey(K key) {
+    @CheckForNull
+    public K ceilingKey(@ParametricNullness K key) {
       return forward().floorKey(key);
     }
 
     @Override
-    public Entry<K, V> higherEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> higherEntry(@ParametricNullness K key) {
       return forward().lowerEntry(key);
     }
 
     @Override
-    public K higherKey(K key) {
+    @CheckForNull
+    public K higherKey(@ParametricNullness K key) {
       return forward().lowerKey(key);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> firstEntry() {
       return forward().lastEntry();
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> lastEntry() {
       return forward().firstEntry();
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> pollFirstEntry() {
       return forward().pollLastEntry();
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> pollLastEntry() {
       return forward().pollFirstEntry();
     }
@@ -3944,7 +4241,7 @@
       return forward();
     }
 
-    @NullableDecl private transient Set<Entry<K, V>> entrySet;
+    @CheckForNull private transient Set<Entry<K, V>> entrySet;
 
     @Override
     public Set<Entry<K, V>> entrySet() {
@@ -3975,7 +4272,7 @@
       return navigableKeySet();
     }
 
-    @NullableDecl private transient NavigableSet<K> navigableKeySet;
+    @CheckForNull private transient NavigableSet<K> navigableKeySet;
 
     @Override
     public NavigableSet<K> navigableKeySet() {
@@ -3990,32 +4287,35 @@
 
     @Override
     public NavigableMap<K, V> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return forward().subMap(toKey, toInclusive, fromKey, fromInclusive).descendingMap();
     }
 
     @Override
-    public SortedMap<K, V> subMap(K fromKey, K toKey) {
+    public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return subMap(fromKey, true, toKey, false);
     }
 
     @Override
-    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, V> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return forward().tailMap(toKey, inclusive).descendingMap();
     }
 
     @Override
-    public SortedMap<K, V> headMap(K toKey) {
+    public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
       return headMap(toKey, false);
     }
 
     @Override
-    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, V> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
       return forward().headMap(fromKey, inclusive).descendingMap();
     }
 
     @Override
-    public SortedMap<K, V> tailMap(K fromKey) {
+    public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
       return tailMap(fromKey, true);
     }
 
@@ -4058,8 +4358,8 @@
    */
   @Beta
   @GwtIncompatible // NavigableMap
-  public static <K extends Comparable<? super K>, V> NavigableMap<K, V> subMap(
-      NavigableMap<K, V> map, Range<K> range) {
+  public static <K extends Comparable<? super K>, V extends @Nullable Object>
+      NavigableMap<K, V> subMap(NavigableMap<K, V> map, Range<K> range) {
     if (map.comparator() != null
         && map.comparator() != Ordering.natural()
         && range.hasLowerBound()
diff --git a/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java b/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
index 639775c..cd01279 100644
--- a/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
+++ b/android/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
@@ -21,6 +21,7 @@
 import static com.google.common.base.Preconditions.checkPositionIndex;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -41,7 +42,8 @@
 import java.util.NoSuchElementException;
 import java.util.PriorityQueue;
 import java.util.Queue;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A double-ended priority queue, which provides constant-time access to both its least element and
@@ -98,6 +100,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class MinMaxPriorityQueue<E> extends AbstractQueue<E> {
 
   /**
@@ -121,6 +124,12 @@
    * Creates and returns a new builder, configured to build {@code MinMaxPriorityQueue} instances
    * that use {@code comparator} to determine the least and greatest elements.
    */
+  /*
+   * TODO(cpovirk): Change to Comparator<? super B> to permit Comparator<@Nullable ...> and
+   * Comparator<SupertypeOfB>? What we have here matches the immutable collections, but those also
+   * expose a public Builder constructor that accepts "? super." So maybe we should do *that*
+   * instead.
+   */
   public static <B> Builder<B> orderedBy(Comparator<B> comparator) {
     return new Builder<B>(comparator);
   }
@@ -224,7 +233,7 @@
   private final Heap minHeap;
   private final Heap maxHeap;
   @VisibleForTesting final int maximumSize;
-  private Object[] queue;
+  private @Nullable Object[] queue;
   private int size;
   private int modCount;
 
@@ -292,16 +301,22 @@
 
   @CanIgnoreReturnValue
   @Override
+  @CheckForNull
   public E poll() {
     return isEmpty() ? null : removeAndGet(0);
   }
 
   @SuppressWarnings("unchecked") // we must carefully only allow Es to get in
   E elementData(int index) {
-    return (E) queue[index];
+    /*
+     * requireNonNull is safe as long as we're careful to call this method only with populated
+     * indexes.
+     */
+    return (E) requireNonNull(queue[index]);
   }
 
   @Override
+  @CheckForNull
   public E peek() {
     return isEmpty() ? null : elementData(0);
   }
@@ -325,6 +340,7 @@
    * empty.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   public E pollFirst() {
     return poll();
   }
@@ -343,6 +359,7 @@
    * Retrieves, but does not remove, the least element of this queue, or returns {@code null} if the
    * queue is empty.
    */
+  @CheckForNull
   public E peekFirst() {
     return peek();
   }
@@ -352,6 +369,7 @@
    * empty.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   public E pollLast() {
     return isEmpty() ? null : removeAndGet(getMaxElementIndex());
   }
@@ -373,6 +391,7 @@
    * Retrieves, but does not remove, the greatest element of this queue, or returns {@code null} if
    * the queue is empty.
    */
+  @CheckForNull
   public E peekLast() {
     return isEmpty() ? null : elementData(getMaxElementIndex());
   }
@@ -392,6 +411,7 @@
    */
   @VisibleForTesting
   @CanIgnoreReturnValue
+  @CheckForNull
   MoveDesc<E> removeAt(int index) {
     checkPositionIndex(index, size);
     modCount++;
@@ -427,6 +447,7 @@
     return changes;
   }
 
+  @CheckForNull
   private MoveDesc<E> fillHole(int index, E toTrickle) {
     Heap heap = heapForIndex(index);
     // We consider elementData(index) a "hole", and we want to fill it
@@ -504,7 +525,7 @@
   @WeakOuter
   private class Heap {
     final Ordering<E> ordering;
-    @Weak @NullableDecl Heap otherHeap;
+    @Weak Heap otherHeap; // always initialized immediately after construction
 
     Heap(Ordering<E> ordering) {
       this.ordering = ordering;
@@ -518,6 +539,7 @@
      * Tries to move {@code toTrickle} from a min to a max level and bubble up there. If it moved
      * before {@code removeIndex} this method returns a pair as described in {@link #removeAt}.
      */
+    @CheckForNull
     MoveDesc<E> tryCrossOverAndBubbleUp(int removeIndex, int vacated, E toTrickle) {
       int crossOver = crossOver(vacated, toTrickle);
       if (crossOver == vacated) {
@@ -751,9 +773,9 @@
     private int expectedModCount = modCount;
     // The same element is not allowed in both forgetMeNot and skipMe, but duplicates are allowed in
     // either of them, up to the same multiplicity as the queue.
-    @NullableDecl private Queue<E> forgetMeNot;
-    @NullableDecl private List<E> skipMe;
-    @NullableDecl private E lastFromForgetMeNot;
+    @CheckForNull private Queue<E> forgetMeNot;
+    @CheckForNull private List<E> skipMe;
+    @CheckForNull private E lastFromForgetMeNot;
     private boolean canRemove;
 
     @Override
@@ -791,7 +813,8 @@
       if (cursor < size()) {
         MoveDesc<E> moved = removeAt(cursor);
         if (moved != null) {
-          if (forgetMeNot == null) {
+          // Either both are null or neither is, but we check both to satisfy the nullness checker.
+          if (forgetMeNot == null || skipMe == null) {
             forgetMeNot = new ArrayDeque<E>();
             skipMe = new ArrayList<E>(3);
           }
@@ -805,7 +828,7 @@
         cursor--;
         nextCursor--;
       } else { // we must have set lastFromForgetMeNot in next()
-        checkState(removeExact(lastFromForgetMeNot));
+        checkState(removeExact(requireNonNull(lastFromForgetMeNot)));
         lastFromForgetMeNot = null;
       }
     }
diff --git a/android/guava/src/com/google/common/collect/Multimap.java b/android/guava/src/com/google/common/collect/Multimap.java
index cdfa0f6..09aa287 100644
--- a/android/guava/src/com/google/common/collect/Multimap.java
+++ b/android/guava/src/com/google/common/collect/Multimap.java
@@ -25,7 +25,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A collection that maps keys to values, similar to {@link Map}, but in which each key may be
@@ -158,7 +159,8 @@
  */
 @DoNotMock("Use ImmutableMultimap, HashMultimap, or another implementation")
 @GwtCompatible
-public interface Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface Multimap<K extends @Nullable Object, V extends @Nullable Object> {
   // Query Operations
 
   /**
@@ -180,21 +182,21 @@
    * Returns {@code true} if this multimap contains at least one key-value pair with the key {@code
    * key}.
    */
-  boolean containsKey(@CompatibleWith("K") @NullableDecl Object key);
+  boolean containsKey(@CompatibleWith("K") @CheckForNull Object key);
 
   /**
    * Returns {@code true} if this multimap contains at least one key-value pair with the value
    * {@code value}.
    */
-  boolean containsValue(@CompatibleWith("V") @NullableDecl Object value);
+  boolean containsValue(@CompatibleWith("V") @CheckForNull Object value);
 
   /**
    * Returns {@code true} if this multimap contains at least one key-value pair with the key {@code
    * key} and the value {@code value}.
    */
   boolean containsEntry(
-      @CompatibleWith("K") @NullableDecl Object key,
-      @CompatibleWith("V") @NullableDecl Object value);
+      @CompatibleWith("K") @CheckForNull Object key,
+      @CompatibleWith("V") @CheckForNull Object value);
 
   // Modification Operations
 
@@ -209,7 +211,7 @@
    *     multimap already contained the key-value pair and doesn't allow duplicates
    */
   @CanIgnoreReturnValue
-  boolean put(@NullableDecl K key, @NullableDecl V value);
+  boolean put(@ParametricNullness K key, @ParametricNullness V value);
 
   /**
    * Removes a single key-value pair with the key {@code key} and the value {@code value} from this
@@ -220,8 +222,8 @@
    */
   @CanIgnoreReturnValue
   boolean remove(
-      @CompatibleWith("K") @NullableDecl Object key,
-      @CompatibleWith("V") @NullableDecl Object value);
+      @CompatibleWith("K") @CheckForNull Object key,
+      @CompatibleWith("V") @CheckForNull Object value);
 
   // Bulk Operations
 
@@ -240,7 +242,7 @@
    * @return {@code true} if the multimap changed
    */
   @CanIgnoreReturnValue
-  boolean putAll(@NullableDecl K key, Iterable<? extends V> values);
+  boolean putAll(@ParametricNullness K key, Iterable<? extends V> values);
 
   /**
    * Stores all key-value pairs of {@code multimap} in this multimap, in the order returned by
@@ -261,7 +263,7 @@
    *     no effect on the multimap.
    */
   @CanIgnoreReturnValue
-  Collection<V> replaceValues(@NullableDecl K key, Iterable<? extends V> values);
+  Collection<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values);
 
   /**
    * Removes all values associated with the key {@code key}.
@@ -273,7 +275,7 @@
    *     modifiable, but updating it will have no effect on the multimap.
    */
   @CanIgnoreReturnValue
-  Collection<V> removeAll(@CompatibleWith("K") @NullableDecl Object key);
+  Collection<V> removeAll(@CompatibleWith("K") @CheckForNull Object key);
 
   /** Removes all key-value pairs from the multimap, leaving it {@linkplain #isEmpty empty}. */
   void clear();
@@ -287,7 +289,7 @@
    *
    * <p>Changes to the returned collection will update the underlying multimap, and vice versa.
    */
-  Collection<V> get(@NullableDecl K key);
+  Collection<V> get(@ParametricNullness K key);
 
   /**
    * Returns a view collection of all <i>distinct</i> keys contained in this multimap. Note that the
@@ -354,7 +356,7 @@
    * multimaps are equal, because they both have empty {@link #asMap} views.
    */
   @Override
-  boolean equals(@NullableDecl Object obj);
+  boolean equals(@CheckForNull Object obj);
 
   /**
    * Returns the hash code for this multimap.
diff --git a/android/guava/src/com/google/common/collect/MultimapBuilder.java b/android/guava/src/com/google/common/collect/MultimapBuilder.java
index 161c29d..dddae28 100644
--- a/android/guava/src/com/google/common/collect/MultimapBuilder.java
+++ b/android/guava/src/com/google/common/collect/MultimapBuilder.java
@@ -34,6 +34,7 @@
 import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A builder for a multimap implementation that allows customization of the backing map and value
@@ -61,7 +62,8 @@
  * @since 16.0
  */
 @GwtCompatible
-public abstract class MultimapBuilder<K0, V0> {
+@ElementTypesAreNonnullByDefault
+public abstract class MultimapBuilder<K0 extends @Nullable Object, V0 extends @Nullable Object> {
   /*
    * Leaving K and V as upper bounds rather than the actual key and value types allows type
    * parameters to be left implicit more often. CacheBuilder uses the same technique.
@@ -72,7 +74,7 @@
   private static final int DEFAULT_EXPECTED_KEYS = 8;
 
   /** Uses a hash table to map keys to value collections. */
-  public static MultimapBuilderWithKeys<Object> hashKeys() {
+  public static MultimapBuilderWithKeys<@Nullable Object> hashKeys() {
     return hashKeys(DEFAULT_EXPECTED_KEYS);
   }
 
@@ -82,11 +84,11 @@
    *
    * @throws IllegalArgumentException if {@code expectedKeys < 0}
    */
-  public static MultimapBuilderWithKeys<Object> hashKeys(final int expectedKeys) {
+  public static MultimapBuilderWithKeys<@Nullable Object> hashKeys(final int expectedKeys) {
     checkNonnegative(expectedKeys, "expectedKeys");
-    return new MultimapBuilderWithKeys<Object>() {
+    return new MultimapBuilderWithKeys<@Nullable Object>() {
       @Override
-      <K, V> Map<K, Collection<V>> createMap() {
+      <K extends @Nullable Object, V extends @Nullable Object> Map<K, Collection<V>> createMap() {
         return Platform.newHashMapWithExpectedSize(expectedKeys);
       }
     };
@@ -100,7 +102,7 @@
    * multimap, save that if all values associated with a key are removed and then the key is added
    * back into the multimap, that key will come last in the key iteration order.
    */
-  public static MultimapBuilderWithKeys<Object> linkedHashKeys() {
+  public static MultimapBuilderWithKeys<@Nullable Object> linkedHashKeys() {
     return linkedHashKeys(DEFAULT_EXPECTED_KEYS);
   }
 
@@ -113,11 +115,11 @@
    * multimap, save that if all values associated with a key are removed and then the key is added
    * back into the multimap, that key will come last in the key iteration order.
    */
-  public static MultimapBuilderWithKeys<Object> linkedHashKeys(final int expectedKeys) {
+  public static MultimapBuilderWithKeys<@Nullable Object> linkedHashKeys(final int expectedKeys) {
     checkNonnegative(expectedKeys, "expectedKeys");
-    return new MultimapBuilderWithKeys<Object>() {
+    return new MultimapBuilderWithKeys<@Nullable Object>() {
       @Override
-      <K, V> Map<K, Collection<V>> createMap() {
+      <K extends @Nullable Object, V extends @Nullable Object> Map<K, Collection<V>> createMap() {
         return Platform.newLinkedHashMapWithExpectedSize(expectedKeys);
       }
     };
@@ -151,11 +153,12 @@
    * <p>Multimaps generated by the resulting builder will not be serializable if {@code comparator}
    * is not serializable.
    */
-  public static <K0> MultimapBuilderWithKeys<K0> treeKeys(final Comparator<K0> comparator) {
+  public static <K0 extends @Nullable Object> MultimapBuilderWithKeys<K0> treeKeys(
+      final Comparator<K0> comparator) {
     checkNotNull(comparator);
     return new MultimapBuilderWithKeys<K0>() {
       @Override
-      <K extends K0, V> Map<K, Collection<V>> createMap() {
+      <K extends K0, V extends @Nullable Object> Map<K, Collection<V>> createMap() {
         return new TreeMap<>(comparator);
       }
     };
@@ -172,7 +175,7 @@
     return new MultimapBuilderWithKeys<K0>() {
       @SuppressWarnings("unchecked")
       @Override
-      <K extends K0, V> Map<K, Collection<V>> createMap() {
+      <K extends K0, V extends @Nullable Object> Map<K, Collection<V>> createMap() {
         // K must actually be K0, since enums are effectively final
         // (their subclasses are inaccessible)
         return (Map<K, Collection<V>>) new EnumMap<K0, Collection<V>>(keyClass);
@@ -180,7 +183,8 @@
     };
   }
 
-  private static final class ArrayListSupplier<V> implements Supplier<List<V>>, Serializable {
+  private static final class ArrayListSupplier<V extends @Nullable Object>
+      implements Supplier<List<V>>, Serializable {
     private final int expectedValuesPerKey;
 
     ArrayListSupplier(int expectedValuesPerKey) {
@@ -193,10 +197,10 @@
     }
   }
 
-  private enum LinkedListSupplier implements Supplier<List<Object>> {
+  private enum LinkedListSupplier implements Supplier<List<?>> {
     INSTANCE;
 
-    public static <V> Supplier<List<V>> instance() {
+    public static <V extends @Nullable Object> Supplier<List<V>> instance() {
       // Each call generates a fresh LinkedList, which can serve as a List<V> for any V.
       @SuppressWarnings({"rawtypes", "unchecked"})
       Supplier<List<V>> result = (Supplier) INSTANCE;
@@ -204,12 +208,13 @@
     }
 
     @Override
-    public List<Object> get() {
+    public List<?> get() {
       return new LinkedList<>();
     }
   }
 
-  private static final class HashSetSupplier<V> implements Supplier<Set<V>>, Serializable {
+  private static final class HashSetSupplier<V extends @Nullable Object>
+      implements Supplier<Set<V>>, Serializable {
     private final int expectedValuesPerKey;
 
     HashSetSupplier(int expectedValuesPerKey) {
@@ -222,7 +227,8 @@
     }
   }
 
-  private static final class LinkedHashSetSupplier<V> implements Supplier<Set<V>>, Serializable {
+  private static final class LinkedHashSetSupplier<V extends @Nullable Object>
+      implements Supplier<Set<V>>, Serializable {
     private final int expectedValuesPerKey;
 
     LinkedHashSetSupplier(int expectedValuesPerKey) {
@@ -235,7 +241,8 @@
     }
   }
 
-  private static final class TreeSetSupplier<V> implements Supplier<SortedSet<V>>, Serializable {
+  private static final class TreeSetSupplier<V extends @Nullable Object>
+      implements Supplier<SortedSet<V>>, Serializable {
     private final Comparator<? super V> comparator;
 
     TreeSetSupplier(Comparator<? super V> comparator) {
@@ -269,16 +276,16 @@
    * @param <K0> The upper bound on the key type of the generated multimap.
    * @since 16.0
    */
-  public abstract static class MultimapBuilderWithKeys<K0> {
+  public abstract static class MultimapBuilderWithKeys<K0 extends @Nullable Object> {
 
     private static final int DEFAULT_EXPECTED_VALUES_PER_KEY = 2;
 
     MultimapBuilderWithKeys() {}
 
-    abstract <K extends K0, V> Map<K, Collection<V>> createMap();
+    abstract <K extends K0, V extends @Nullable Object> Map<K, Collection<V>> createMap();
 
     /** Uses an {@link ArrayList} to store value collections. */
-    public ListMultimapBuilder<K0, Object> arrayListValues() {
+    public ListMultimapBuilder<K0, @Nullable Object> arrayListValues() {
       return arrayListValues(DEFAULT_EXPECTED_VALUES_PER_KEY);
     }
 
@@ -288,11 +295,12 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public ListMultimapBuilder<K0, Object> arrayListValues(final int expectedValuesPerKey) {
+    public ListMultimapBuilder<K0, @Nullable Object> arrayListValues(
+        final int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
-      return new ListMultimapBuilder<K0, Object>() {
+      return new ListMultimapBuilder<K0, @Nullable Object>() {
         @Override
-        public <K extends K0, V> ListMultimap<K, V> build() {
+        public <K extends K0, V extends @Nullable Object> ListMultimap<K, V> build() {
           return Multimaps.newListMultimap(
               MultimapBuilderWithKeys.this.<K, V>createMap(),
               new ArrayListSupplier<V>(expectedValuesPerKey));
@@ -301,10 +309,10 @@
     }
 
     /** Uses a {@link LinkedList} to store value collections. */
-    public ListMultimapBuilder<K0, Object> linkedListValues() {
-      return new ListMultimapBuilder<K0, Object>() {
+    public ListMultimapBuilder<K0, @Nullable Object> linkedListValues() {
+      return new ListMultimapBuilder<K0, @Nullable Object>() {
         @Override
-        public <K extends K0, V> ListMultimap<K, V> build() {
+        public <K extends K0, V extends @Nullable Object> ListMultimap<K, V> build() {
           return Multimaps.newListMultimap(
               MultimapBuilderWithKeys.this.<K, V>createMap(), LinkedListSupplier.<V>instance());
         }
@@ -312,7 +320,7 @@
     }
 
     /** Uses a hash-based {@code Set} to store value collections. */
-    public SetMultimapBuilder<K0, Object> hashSetValues() {
+    public SetMultimapBuilder<K0, @Nullable Object> hashSetValues() {
       return hashSetValues(DEFAULT_EXPECTED_VALUES_PER_KEY);
     }
 
@@ -322,11 +330,11 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public SetMultimapBuilder<K0, Object> hashSetValues(final int expectedValuesPerKey) {
+    public SetMultimapBuilder<K0, @Nullable Object> hashSetValues(final int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
-      return new SetMultimapBuilder<K0, Object>() {
+      return new SetMultimapBuilder<K0, @Nullable Object>() {
         @Override
-        public <K extends K0, V> SetMultimap<K, V> build() {
+        public <K extends K0, V extends @Nullable Object> SetMultimap<K, V> build() {
           return Multimaps.newSetMultimap(
               MultimapBuilderWithKeys.this.<K, V>createMap(),
               new HashSetSupplier<V>(expectedValuesPerKey));
@@ -335,7 +343,7 @@
     }
 
     /** Uses an insertion-ordered hash-based {@code Set} to store value collections. */
-    public SetMultimapBuilder<K0, Object> linkedHashSetValues() {
+    public SetMultimapBuilder<K0, @Nullable Object> linkedHashSetValues() {
       return linkedHashSetValues(DEFAULT_EXPECTED_VALUES_PER_KEY);
     }
 
@@ -345,11 +353,12 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public SetMultimapBuilder<K0, Object> linkedHashSetValues(final int expectedValuesPerKey) {
+    public SetMultimapBuilder<K0, @Nullable Object> linkedHashSetValues(
+        final int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
-      return new SetMultimapBuilder<K0, Object>() {
+      return new SetMultimapBuilder<K0, @Nullable Object>() {
         @Override
-        public <K extends K0, V> SetMultimap<K, V> build() {
+        public <K extends K0, V extends @Nullable Object> SetMultimap<K, V> build() {
           return Multimaps.newSetMultimap(
               MultimapBuilderWithKeys.this.<K, V>createMap(),
               new LinkedHashSetSupplier<V>(expectedValuesPerKey));
@@ -369,7 +378,8 @@
      * <p>Multimaps generated by the resulting builder will not be serializable if {@code
      * comparator} is not serializable.
      */
-    public <V0> SortedSetMultimapBuilder<K0, V0> treeSetValues(final Comparator<V0> comparator) {
+    public <V0 extends @Nullable Object> SortedSetMultimapBuilder<K0, V0> treeSetValues(
+        final Comparator<V0> comparator) {
       checkNotNull(comparator, "comparator");
       return new SortedSetMultimapBuilder<K0, V0>() {
         @Override
@@ -416,7 +426,9 @@
    *
    * @since 16.0
    */
-  public abstract static class ListMultimapBuilder<K0, V0> extends MultimapBuilder<K0, V0> {
+  public abstract static class ListMultimapBuilder<
+          K0 extends @Nullable Object, V0 extends @Nullable Object>
+      extends MultimapBuilder<K0, V0> {
     ListMultimapBuilder() {}
 
     @Override
@@ -434,7 +446,9 @@
    *
    * @since 16.0
    */
-  public abstract static class SetMultimapBuilder<K0, V0> extends MultimapBuilder<K0, V0> {
+  public abstract static class SetMultimapBuilder<
+          K0 extends @Nullable Object, V0 extends @Nullable Object>
+      extends MultimapBuilder<K0, V0> {
     SetMultimapBuilder() {}
 
     @Override
@@ -452,7 +466,9 @@
    *
    * @since 16.0
    */
-  public abstract static class SortedSetMultimapBuilder<K0, V0> extends SetMultimapBuilder<K0, V0> {
+  public abstract static class SortedSetMultimapBuilder<
+          K0 extends @Nullable Object, V0 extends @Nullable Object>
+      extends SetMultimapBuilder<K0, V0> {
     SortedSetMultimapBuilder() {}
 
     @Override
diff --git a/android/guava/src/com/google/common/collect/Multimaps.java b/android/guava/src/com/google/common/collect/Multimaps.java
index 1f65d56..b0577ea 100644
--- a/android/guava/src/com/google/common/collect/Multimaps.java
+++ b/android/guava/src/com/google/common/collect/Multimaps.java
@@ -19,6 +19,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
 import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -29,6 +31,7 @@
 import com.google.common.base.Supplier;
 import com.google.common.collect.Maps.EntryTransformer;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.Weak;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.IOException;
@@ -48,7 +51,8 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides static methods acting on or generating a {@code Multimap}.
@@ -64,6 +68,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Multimaps {
   private Multimaps() {}
 
@@ -103,12 +108,13 @@
    *     key
    * @throws IllegalArgumentException if {@code map} is not empty
    */
-  public static <K, V> Multimap<K, V> newMultimap(
+  public static <K extends @Nullable Object, V extends @Nullable Object> Multimap<K, V> newMultimap(
       Map<K, Collection<V>> map, final Supplier<? extends Collection<V>> factory) {
     return new CustomMultimap<>(map, factory);
   }
 
-  private static class CustomMultimap<K, V> extends AbstractMapBasedMultimap<K, V> {
+  private static class CustomMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMapBasedMultimap<K, V> {
     transient Supplier<? extends Collection<V>> factory;
 
     CustomMultimap(Map<K, Collection<V>> map, Supplier<? extends Collection<V>> factory) {
@@ -132,7 +138,8 @@
     }
 
     @Override
-    <E> Collection<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+    <E extends @Nullable Object> Collection<E> unmodifiableCollectionSubclass(
+        Collection<E> collection) {
       if (collection instanceof NavigableSet) {
         return Sets.unmodifiableNavigableSet((NavigableSet<E>) collection);
       } else if (collection instanceof SortedSet) {
@@ -147,7 +154,7 @@
     }
 
     @Override
-    Collection<V> wrapCollection(K key, Collection<V> collection) {
+    Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
       if (collection instanceof List) {
         return wrapList(key, (List<V>) collection, null);
       } else if (collection instanceof NavigableSet) {
@@ -215,12 +222,14 @@
    * @param factory supplier of new, empty lists that will each hold all values for a given key
    * @throws IllegalArgumentException if {@code map} is not empty
    */
-  public static <K, V> ListMultimap<K, V> newListMultimap(
-      Map<K, Collection<V>> map, final Supplier<? extends List<V>> factory) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ListMultimap<K, V> newListMultimap(
+          Map<K, Collection<V>> map, final Supplier<? extends List<V>> factory) {
     return new CustomListMultimap<>(map, factory);
   }
 
-  private static class CustomListMultimap<K, V> extends AbstractListMultimap<K, V> {
+  private static class CustomListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractListMultimap<K, V> {
     transient Supplier<? extends List<V>> factory;
 
     CustomListMultimap(Map<K, Collection<V>> map, Supplier<? extends List<V>> factory) {
@@ -293,12 +302,14 @@
    * @param factory supplier of new, empty sets that will each hold all values for a given key
    * @throws IllegalArgumentException if {@code map} is not empty
    */
-  public static <K, V> SetMultimap<K, V> newSetMultimap(
-      Map<K, Collection<V>> map, final Supplier<? extends Set<V>> factory) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> newSetMultimap(
+          Map<K, Collection<V>> map, final Supplier<? extends Set<V>> factory) {
     return new CustomSetMultimap<>(map, factory);
   }
 
-  private static class CustomSetMultimap<K, V> extends AbstractSetMultimap<K, V> {
+  private static class CustomSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractSetMultimap<K, V> {
     transient Supplier<? extends Set<V>> factory;
 
     CustomSetMultimap(Map<K, Collection<V>> map, Supplier<? extends Set<V>> factory) {
@@ -322,7 +333,8 @@
     }
 
     @Override
-    <E> Collection<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+    <E extends @Nullable Object> Collection<E> unmodifiableCollectionSubclass(
+        Collection<E> collection) {
       if (collection instanceof NavigableSet) {
         return Sets.unmodifiableNavigableSet((NavigableSet<E>) collection);
       } else if (collection instanceof SortedSet) {
@@ -333,7 +345,7 @@
     }
 
     @Override
-    Collection<V> wrapCollection(K key, Collection<V> collection) {
+    Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
       if (collection instanceof NavigableSet) {
         return new WrappedNavigableSet(key, (NavigableSet<V>) collection, null);
       } else if (collection instanceof SortedSet) {
@@ -393,14 +405,17 @@
    *     key
    * @throws IllegalArgumentException if {@code map} is not empty
    */
-  public static <K, V> SortedSetMultimap<K, V> newSortedSetMultimap(
-      Map<K, Collection<V>> map, final Supplier<? extends SortedSet<V>> factory) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedSetMultimap<K, V> newSortedSetMultimap(
+          Map<K, Collection<V>> map, final Supplier<? extends SortedSet<V>> factory) {
     return new CustomSortedSetMultimap<>(map, factory);
   }
 
-  private static class CustomSortedSetMultimap<K, V> extends AbstractSortedSetMultimap<K, V> {
+  private static class CustomSortedSetMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractSortedSetMultimap<K, V> {
     transient Supplier<? extends SortedSet<V>> factory;
-    transient Comparator<? super V> valueComparator;
+    @CheckForNull transient Comparator<? super V> valueComparator;
 
     CustomSortedSetMultimap(Map<K, Collection<V>> map, Supplier<? extends SortedSet<V>> factory) {
       super(map);
@@ -424,6 +439,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super V> valueComparator() {
       return valueComparator;
     }
@@ -462,8 +478,8 @@
    * @return {@code dest}
    */
   @CanIgnoreReturnValue
-  public static <K, V, M extends Multimap<K, V>> M invertFrom(
-      Multimap<? extends V, ? extends K> source, M dest) {
+  public static <K extends @Nullable Object, V extends @Nullable Object, M extends Multimap<K, V>>
+      M invertFrom(Multimap<? extends V, ? extends K> source, M dest) {
     checkNotNull(dest);
     for (Map.Entry<? extends V, ? extends K> entry : source.entries()) {
       dest.put(entry.getValue(), entry.getKey());
@@ -503,7 +519,8 @@
    * @param multimap the multimap to be wrapped in a synchronized view
    * @return a synchronized view of the specified multimap
    */
-  public static <K, V> Multimap<K, V> synchronizedMultimap(Multimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      Multimap<K, V> synchronizedMultimap(Multimap<K, V> multimap) {
     return Synchronized.multimap(multimap, null);
   }
 
@@ -518,7 +535,8 @@
    * @param delegate the multimap for which an unmodifiable view is to be returned
    * @return an unmodifiable view of the specified multimap
    */
-  public static <K, V> Multimap<K, V> unmodifiableMultimap(Multimap<K, V> delegate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      Multimap<K, V> unmodifiableMultimap(Multimap<K, V> delegate) {
     if (delegate instanceof UnmodifiableMultimap || delegate instanceof ImmutableMultimap) {
       return delegate;
     }
@@ -536,14 +554,14 @@
     return checkNotNull(delegate);
   }
 
-  private static class UnmodifiableMultimap<K, V> extends ForwardingMultimap<K, V>
-      implements Serializable {
+  private static class UnmodifiableMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingMultimap<K, V> implements Serializable {
     final Multimap<K, V> delegate;
-    @NullableDecl transient Collection<Entry<K, V>> entries;
-    @NullableDecl transient Multiset<K> keys;
-    @NullableDecl transient Set<K> keySet;
-    @NullableDecl transient Collection<V> values;
-    @NullableDecl transient Map<K, Collection<V>> map;
+    @LazyInit @CheckForNull transient Collection<Entry<K, V>> entries;
+    @LazyInit @CheckForNull transient Multiset<K> keys;
+    @LazyInit @CheckForNull transient Set<K> keySet;
+    @LazyInit @CheckForNull transient Collection<V> values;
+    @LazyInit @CheckForNull transient Map<K, Collection<V>> map;
 
     UnmodifiableMultimap(final Multimap<K, V> delegate) {
       this.delegate = checkNotNull(delegate);
@@ -588,7 +606,7 @@
     }
 
     @Override
-    public Collection<V> get(K key) {
+    public Collection<V> get(@ParametricNullness K key) {
       return unmodifiableValueCollection(delegate.get(key));
     }
 
@@ -611,12 +629,12 @@
     }
 
     @Override
-    public boolean put(K key, V value) {
+    public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public boolean putAll(K key, Iterable<? extends V> values) {
+    public boolean putAll(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
@@ -626,17 +644,17 @@
     }
 
     @Override
-    public boolean remove(Object key, Object value) {
+    public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Collection<V> removeAll(Object key) {
+    public Collection<V> removeAll(@CheckForNull Object key) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Collection<V> replaceValues(K key, Iterable<? extends V> values) {
+    public Collection<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
@@ -652,8 +670,9 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static class UnmodifiableListMultimap<K, V> extends UnmodifiableMultimap<K, V>
-      implements ListMultimap<K, V> {
+  private static class UnmodifiableListMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends UnmodifiableMultimap<K, V> implements ListMultimap<K, V> {
     UnmodifiableListMultimap(ListMultimap<K, V> delegate) {
       super(delegate);
     }
@@ -664,25 +683,26 @@
     }
 
     @Override
-    public List<V> get(K key) {
+    public List<V> get(@ParametricNullness K key) {
       return Collections.unmodifiableList(delegate().get(key));
     }
 
     @Override
-    public List<V> removeAll(Object key) {
+    public List<V> removeAll(@CheckForNull Object key) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public List<V> replaceValues(K key, Iterable<? extends V> values) {
+    public List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
     private static final long serialVersionUID = 0;
   }
 
-  private static class UnmodifiableSetMultimap<K, V> extends UnmodifiableMultimap<K, V>
-      implements SetMultimap<K, V> {
+  private static class UnmodifiableSetMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends UnmodifiableMultimap<K, V> implements SetMultimap<K, V> {
     UnmodifiableSetMultimap(SetMultimap<K, V> delegate) {
       super(delegate);
     }
@@ -693,7 +713,7 @@
     }
 
     @Override
-    public Set<V> get(K key) {
+    public Set<V> get(@ParametricNullness K key) {
       /*
        * Note that this doesn't return a SortedSet when delegate is a
        * SortedSetMultiset, unlike (SortedSet<V>) super.get().
@@ -707,20 +727,21 @@
     }
 
     @Override
-    public Set<V> removeAll(Object key) {
+    public Set<V> removeAll(@CheckForNull Object key) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Set<V> replaceValues(K key, Iterable<? extends V> values) {
+    public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
     private static final long serialVersionUID = 0;
   }
 
-  private static class UnmodifiableSortedSetMultimap<K, V> extends UnmodifiableSetMultimap<K, V>
-      implements SortedSetMultimap<K, V> {
+  private static class UnmodifiableSortedSetMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends UnmodifiableSetMultimap<K, V> implements SortedSetMultimap<K, V> {
     UnmodifiableSortedSetMultimap(SortedSetMultimap<K, V> delegate) {
       super(delegate);
     }
@@ -731,21 +752,22 @@
     }
 
     @Override
-    public SortedSet<V> get(K key) {
+    public SortedSet<V> get(@ParametricNullness K key) {
       return Collections.unmodifiableSortedSet(delegate().get(key));
     }
 
     @Override
-    public SortedSet<V> removeAll(Object key) {
+    public SortedSet<V> removeAll(@CheckForNull Object key) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public SortedSet<V> replaceValues(K key, Iterable<? extends V> values) {
+    public SortedSet<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super V> valueComparator() {
       return delegate().valueComparator();
     }
@@ -763,7 +785,8 @@
    * @param multimap the multimap to be wrapped
    * @return a synchronized view of the specified multimap
    */
-  public static <K, V> SetMultimap<K, V> synchronizedSetMultimap(SetMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> synchronizedSetMultimap(SetMultimap<K, V> multimap) {
     return Synchronized.setMultimap(multimap, null);
   }
 
@@ -778,7 +801,8 @@
    * @param delegate the multimap for which an unmodifiable view is to be returned
    * @return an unmodifiable view of the specified multimap
    */
-  public static <K, V> SetMultimap<K, V> unmodifiableSetMultimap(SetMultimap<K, V> delegate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> unmodifiableSetMultimap(SetMultimap<K, V> delegate) {
     if (delegate instanceof UnmodifiableSetMultimap || delegate instanceof ImmutableSetMultimap) {
       return delegate;
     }
@@ -808,8 +832,8 @@
    * @param multimap the multimap to be wrapped
    * @return a synchronized view of the specified multimap
    */
-  public static <K, V> SortedSetMultimap<K, V> synchronizedSortedSetMultimap(
-      SortedSetMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedSetMultimap<K, V> synchronizedSortedSetMultimap(SortedSetMultimap<K, V> multimap) {
     return Synchronized.sortedSetMultimap(multimap, null);
   }
 
@@ -824,8 +848,8 @@
    * @param delegate the multimap for which an unmodifiable view is to be returned
    * @return an unmodifiable view of the specified multimap
    */
-  public static <K, V> SortedSetMultimap<K, V> unmodifiableSortedSetMultimap(
-      SortedSetMultimap<K, V> delegate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedSetMultimap<K, V> unmodifiableSortedSetMultimap(SortedSetMultimap<K, V> delegate) {
     if (delegate instanceof UnmodifiableSortedSetMultimap) {
       return delegate;
     }
@@ -840,7 +864,8 @@
    * @param multimap the multimap to be wrapped
    * @return a synchronized view of the specified multimap
    */
-  public static <K, V> ListMultimap<K, V> synchronizedListMultimap(ListMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ListMultimap<K, V> synchronizedListMultimap(ListMultimap<K, V> multimap) {
     return Synchronized.listMultimap(multimap, null);
   }
 
@@ -855,7 +880,8 @@
    * @param delegate the multimap for which an unmodifiable view is to be returned
    * @return an unmodifiable view of the specified multimap
    */
-  public static <K, V> ListMultimap<K, V> unmodifiableListMultimap(ListMultimap<K, V> delegate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ListMultimap<K, V> unmodifiableListMultimap(ListMultimap<K, V> delegate) {
     if (delegate instanceof UnmodifiableListMultimap || delegate instanceof ImmutableListMultimap) {
       return delegate;
     }
@@ -882,7 +908,8 @@
    * @param collection the collection for which to return an unmodifiable view
    * @return an unmodifiable view of the collection
    */
-  private static <V> Collection<V> unmodifiableValueCollection(Collection<V> collection) {
+  private static <V extends @Nullable Object> Collection<V> unmodifiableValueCollection(
+      Collection<V> collection) {
     if (collection instanceof SortedSet) {
       return Collections.unmodifiableSortedSet((SortedSet<V>) collection);
     } else if (collection instanceof Set) {
@@ -901,8 +928,8 @@
    * @param entries the entries for which to return an unmodifiable view
    * @return an unmodifiable view of the entries
    */
-  private static <K, V> Collection<Entry<K, V>> unmodifiableEntries(
-      Collection<Entry<K, V>> entries) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      Collection<Entry<K, V>> unmodifiableEntries(Collection<Entry<K, V>> entries) {
     if (entries instanceof Set) {
       return Maps.unmodifiableEntrySet((Set<Entry<K, V>>) entries);
     }
@@ -918,7 +945,8 @@
   @Beta
   @SuppressWarnings("unchecked")
   // safe by specification of ListMultimap.asMap()
-  public static <K, V> Map<K, List<V>> asMap(ListMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, List<V>> asMap(
+      ListMultimap<K, V> multimap) {
     return (Map<K, List<V>>) (Map<K, ?>) multimap.asMap();
   }
 
@@ -931,7 +959,8 @@
   @Beta
   @SuppressWarnings("unchecked")
   // safe by specification of SetMultimap.asMap()
-  public static <K, V> Map<K, Set<V>> asMap(SetMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, Set<V>> asMap(
+      SetMultimap<K, V> multimap) {
     return (Map<K, Set<V>>) (Map<K, ?>) multimap.asMap();
   }
 
@@ -944,7 +973,8 @@
   @Beta
   @SuppressWarnings("unchecked")
   // safe by specification of SortedSetMultimap.asMap()
-  public static <K, V> Map<K, SortedSet<V>> asMap(SortedSetMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, SortedSet<V>> asMap(
+      SortedSetMultimap<K, V> multimap) {
     return (Map<K, SortedSet<V>>) (Map<K, ?>) multimap.asMap();
   }
 
@@ -955,7 +985,8 @@
    * @since 15.0
    */
   @Beta
-  public static <K, V> Map<K, Collection<V>> asMap(Multimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      Map<K, Collection<V>> asMap(Multimap<K, V> multimap) {
     return multimap.asMap();
   }
 
@@ -974,13 +1005,14 @@
    *
    * @param map the backing map for the returned multimap view
    */
-  public static <K, V> SetMultimap<K, V> forMap(Map<K, V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> SetMultimap<K, V> forMap(
+      Map<K, V> map) {
     return new MapMultimap<>(map);
   }
 
   /** @see Multimaps#forMap */
-  private static class MapMultimap<K, V> extends AbstractMultimap<K, V>
-      implements SetMultimap<K, V>, Serializable {
+  private static class MapMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMultimap<K, V> implements SetMultimap<K, V>, Serializable {
     final Map<K, V> map;
 
     MapMultimap(Map<K, V> map) {
@@ -993,22 +1025,22 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return map.containsKey(key);
     }
 
     @Override
-    public boolean containsValue(Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       return map.containsValue(value);
     }
 
     @Override
-    public boolean containsEntry(Object key, Object value) {
+    public boolean containsEntry(@CheckForNull Object key, @CheckForNull Object value) {
       return map.entrySet().contains(Maps.immutableEntry(key, value));
     }
 
     @Override
-    public Set<V> get(final K key) {
+    public Set<V> get(@ParametricNullness final K key) {
       return new Sets.ImprovedAbstractSet<V>() {
         @Override
         public Iterator<V> iterator() {
@@ -1021,12 +1053,17 @@
             }
 
             @Override
+            @ParametricNullness
             public V next() {
               if (!hasNext()) {
                 throw new NoSuchElementException();
               }
               i++;
-              return map.get(key);
+              /*
+               * The cast is safe because of the containsKey check in hasNext(). (That means it's
+               * unsafe under concurrent modification, but all bets are off then, anyway.)
+               */
+              return uncheckedCastNullableTToT(map.get(key));
             }
 
             @Override
@@ -1046,12 +1083,12 @@
     }
 
     @Override
-    public boolean put(K key, V value) {
+    public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public boolean putAll(K key, Iterable<? extends V> values) {
+    public boolean putAll(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
@@ -1061,17 +1098,17 @@
     }
 
     @Override
-    public Set<V> replaceValues(K key, Iterable<? extends V> values) {
+    public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public boolean remove(Object key, Object value) {
+    public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
       return map.entrySet().remove(Maps.immutableEntry(key, value));
     }
 
     @Override
-    public Set<V> removeAll(Object key) {
+    public Set<V> removeAll(@CheckForNull Object key) {
       Set<V> values = new HashSet<V>(2);
       if (!map.containsKey(key)) {
         return values;
@@ -1169,8 +1206,10 @@
    *
    * @since 7.0
    */
-  public static <K, V1, V2> Multimap<K, V2> transformValues(
-      Multimap<K, V1> fromMultimap, final Function<? super V1, V2> function) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Multimap<K, V2> transformValues(
+          Multimap<K, V1> fromMultimap, final Function<? super V1, V2> function) {
     checkNotNull(function);
     EntryTransformer<K, V1, V2> transformer = Maps.asEntryTransformer(function);
     return transformEntries(fromMultimap, transformer);
@@ -1216,8 +1255,10 @@
    *
    * @since 7.0
    */
-  public static <K, V1, V2> ListMultimap<K, V2> transformValues(
-      ListMultimap<K, V1> fromMultimap, final Function<? super V1, V2> function) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      ListMultimap<K, V2> transformValues(
+          ListMultimap<K, V1> fromMultimap, final Function<? super V1, V2> function) {
     checkNotNull(function);
     EntryTransformer<K, V1, V2> transformer = Maps.asEntryTransformer(function);
     return transformEntries(fromMultimap, transformer);
@@ -1274,8 +1315,10 @@
    *
    * @since 7.0
    */
-  public static <K, V1, V2> Multimap<K, V2> transformEntries(
-      Multimap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Multimap<K, V2> transformEntries(
+          Multimap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
     return new TransformedEntriesMultimap<>(fromMap, transformer);
   }
 
@@ -1327,12 +1370,16 @@
    *
    * @since 7.0
    */
-  public static <K, V1, V2> ListMultimap<K, V2> transformEntries(
-      ListMultimap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      ListMultimap<K, V2> transformEntries(
+          ListMultimap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
     return new TransformedEntriesListMultimap<>(fromMap, transformer);
   }
 
-  private static class TransformedEntriesMultimap<K, V1, V2> extends AbstractMultimap<K, V2> {
+  private static class TransformedEntriesMultimap<
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      extends AbstractMultimap<K, V2> {
     final Multimap<K, V1> fromMultimap;
     final EntryTransformer<? super K, ? super V1, V2> transformer;
 
@@ -1343,7 +1390,7 @@
       this.transformer = checkNotNull(transformer);
     }
 
-    Collection<V2> transform(K key, Collection<V1> values) {
+    Collection<V2> transform(@ParametricNullness K key, Collection<V1> values) {
       Function<? super V1, V2> function = Maps.asValueToValueFunction(transformer, key);
       if (values instanceof List) {
         return Lists.transform((List<V1>) values, function);
@@ -1358,7 +1405,7 @@
           fromMultimap.asMap(),
           new EntryTransformer<K, Collection<V1>, Collection<V2>>() {
             @Override
-            public Collection<V2> transformEntry(K key, Collection<V1> value) {
+            public Collection<V2> transformEntry(@ParametricNullness K key, Collection<V1> value) {
               return transform(key, value);
             }
           });
@@ -1370,7 +1417,7 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return fromMultimap.containsKey(key);
     }
 
@@ -1386,7 +1433,7 @@
     }
 
     @Override
-    public Collection<V2> get(final K key) {
+    public Collection<V2> get(@ParametricNullness final K key) {
       return transform(key, fromMultimap.get(key));
     }
 
@@ -1406,12 +1453,12 @@
     }
 
     @Override
-    public boolean put(K key, V2 value) {
+    public boolean put(@ParametricNullness K key, @ParametricNullness V2 value) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public boolean putAll(K key, Iterable<? extends V2> values) {
+    public boolean putAll(@ParametricNullness K key, Iterable<? extends V2> values) {
       throw new UnsupportedOperationException();
     }
 
@@ -1422,18 +1469,18 @@
 
     @SuppressWarnings("unchecked")
     @Override
-    public boolean remove(Object key, Object value) {
+    public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
       return get((K) key).remove(value);
     }
 
     @SuppressWarnings("unchecked")
     @Override
-    public Collection<V2> removeAll(Object key) {
+    public Collection<V2> removeAll(@CheckForNull Object key) {
       return transform((K) key, fromMultimap.removeAll(key));
     }
 
     @Override
-    public Collection<V2> replaceValues(K key, Iterable<? extends V2> values) {
+    public Collection<V2> replaceValues(@ParametricNullness K key, Iterable<? extends V2> values) {
       throw new UnsupportedOperationException();
     }
 
@@ -1449,7 +1496,8 @@
     }
   }
 
-  private static final class TransformedEntriesListMultimap<K, V1, V2>
+  private static final class TransformedEntriesListMultimap<
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
       extends TransformedEntriesMultimap<K, V1, V2> implements ListMultimap<K, V2> {
 
     TransformedEntriesListMultimap(
@@ -1458,23 +1506,23 @@
     }
 
     @Override
-    List<V2> transform(K key, Collection<V1> values) {
+    List<V2> transform(@ParametricNullness K key, Collection<V1> values) {
       return Lists.transform((List<V1>) values, Maps.asValueToValueFunction(transformer, key));
     }
 
     @Override
-    public List<V2> get(K key) {
+    public List<V2> get(@ParametricNullness K key) {
       return transform(key, fromMultimap.get(key));
     }
 
     @SuppressWarnings("unchecked")
     @Override
-    public List<V2> removeAll(Object key) {
+    public List<V2> removeAll(@CheckForNull Object key) {
       return transform((K) key, fromMultimap.removeAll(key));
     }
 
     @Override
-    public List<V2> replaceValues(K key, Iterable<? extends V2> values) {
+    public List<V2> replaceValues(@ParametricNullness K key, Iterable<? extends V2> values) {
       throw new UnsupportedOperationException();
     }
   }
@@ -1567,7 +1615,8 @@
     return builder.build();
   }
 
-  static class Keys<K, V> extends AbstractMultiset<K> {
+  static class Keys<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMultiset<K> {
     @Weak final Multimap<K, V> multimap;
 
     Keys(Multimap<K, V> multimap) {
@@ -1582,6 +1631,7 @@
         Multiset.Entry<K> transform(final Map.Entry<K, Collection<V>> backingEntry) {
           return new Multisets.AbstractEntry<K>() {
             @Override
+            @ParametricNullness
             public K getElement() {
               return backingEntry.getKey();
             }
@@ -1606,7 +1656,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object element) {
+    public boolean contains(@CheckForNull Object element) {
       return multimap.containsKey(element);
     }
 
@@ -1616,13 +1666,13 @@
     }
 
     @Override
-    public int count(@NullableDecl Object element) {
+    public int count(@CheckForNull Object element) {
       Collection<V> values = Maps.safeGet(multimap.asMap(), element);
       return (values == null) ? 0 : values.size();
     }
 
     @Override
-    public int remove(@NullableDecl Object element, int occurrences) {
+    public int remove(@CheckForNull Object element, int occurrences) {
       checkNonnegative(occurrences, "occurrences");
       if (occurrences == 0) {
         return count(element);
@@ -1664,7 +1714,8 @@
   }
 
   /** A skeleton implementation of {@link Multimap#entries()}. */
-  abstract static class Entries<K, V> extends AbstractCollection<Map.Entry<K, V>> {
+  abstract static class Entries<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractCollection<Map.Entry<K, V>> {
     abstract Multimap<K, V> multimap();
 
     @Override
@@ -1673,7 +1724,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Map.Entry) {
         Map.Entry<?, ?> entry = (Map.Entry<?, ?>) o;
         return multimap().containsEntry(entry.getKey(), entry.getValue());
@@ -1682,7 +1733,7 @@
     }
 
     @Override
-    public boolean remove(@NullableDecl Object o) {
+    public boolean remove(@CheckForNull Object o) {
       if (o instanceof Map.Entry) {
         Map.Entry<?, ?> entry = (Map.Entry<?, ?>) o;
         return multimap().remove(entry.getKey(), entry.getValue());
@@ -1697,7 +1748,8 @@
   }
 
   /** A skeleton implementation of {@link Multimap#asMap()}. */
-  static final class AsMap<K, V> extends Maps.ViewCachingAbstractMap<K, Collection<V>> {
+  static final class AsMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends Maps.ViewCachingAbstractMap<K, Collection<V>> {
     @Weak private final Multimap<K, V> multimap;
 
     AsMap(Multimap<K, V> multimap) {
@@ -1714,7 +1766,7 @@
       return new EntrySet();
     }
 
-    void removeValuesForKey(Object key) {
+    void removeValuesForKey(@CheckForNull Object key) {
       multimap.keySet().remove(key);
     }
 
@@ -1731,18 +1783,19 @@
             multimap.keySet(),
             new Function<K, Collection<V>>() {
               @Override
-              public Collection<V> apply(K key) {
+              public Collection<V> apply(@ParametricNullness K key) {
                 return multimap.get(key);
               }
             });
       }
 
       @Override
-      public boolean remove(Object o) {
+      public boolean remove(@CheckForNull Object o) {
         if (!contains(o)) {
           return false;
         }
-        Map.Entry<?, ?> entry = (Map.Entry<?, ?>) o;
+        // requireNonNull is safe because of the contains check.
+        Map.Entry<?, ?> entry = requireNonNull((Map.Entry<?, ?>) o);
         removeValuesForKey(entry.getKey());
         return true;
       }
@@ -1750,12 +1803,14 @@
 
     @SuppressWarnings("unchecked")
     @Override
-    public Collection<V> get(Object key) {
+    @CheckForNull
+    public Collection<V> get(@CheckForNull Object key) {
       return containsKey(key) ? multimap.get((K) key) : null;
     }
 
     @Override
-    public Collection<V> remove(Object key) {
+    @CheckForNull
+    public Collection<V> remove(@CheckForNull Object key) {
       return containsKey(key) ? multimap.removeAll(key) : null;
     }
 
@@ -1770,7 +1825,7 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return multimap.containsKey(key);
     }
 
@@ -1807,7 +1862,7 @@
    *
    * @since 11.0
    */
-  public static <K, V> Multimap<K, V> filterKeys(
+  public static <K extends @Nullable Object, V extends @Nullable Object> Multimap<K, V> filterKeys(
       Multimap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     if (unfiltered instanceof SetMultimap) {
       return filterKeys((SetMultimap<K, V>) unfiltered, keyPredicate);
@@ -1852,8 +1907,9 @@
    *
    * @since 14.0
    */
-  public static <K, V> SetMultimap<K, V> filterKeys(
-      SetMultimap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> filterKeys(
+          SetMultimap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     if (unfiltered instanceof FilteredKeySetMultimap) {
       FilteredKeySetMultimap<K, V> prev = (FilteredKeySetMultimap<K, V>) unfiltered;
       return new FilteredKeySetMultimap<>(
@@ -1893,8 +1949,9 @@
    *
    * @since 14.0
    */
-  public static <K, V> ListMultimap<K, V> filterKeys(
-      ListMultimap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ListMultimap<K, V> filterKeys(
+          ListMultimap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     if (unfiltered instanceof FilteredKeyListMultimap) {
       FilteredKeyListMultimap<K, V> prev = (FilteredKeyListMultimap<K, V>) unfiltered;
       return new FilteredKeyListMultimap<>(
@@ -1931,8 +1988,9 @@
    *
    * @since 11.0
    */
-  public static <K, V> Multimap<K, V> filterValues(
-      Multimap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      Multimap<K, V> filterValues(
+          Multimap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
 
@@ -1963,8 +2021,9 @@
    *
    * @since 14.0
    */
-  public static <K, V> SetMultimap<K, V> filterValues(
-      SetMultimap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> filterValues(
+          SetMultimap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
 
@@ -1993,8 +2052,9 @@
    *
    * @since 11.0
    */
-  public static <K, V> Multimap<K, V> filterEntries(
-      Multimap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      Multimap<K, V> filterEntries(
+          Multimap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(entryPredicate);
     if (unfiltered instanceof SetMultimap) {
       return filterEntries((SetMultimap<K, V>) unfiltered, entryPredicate);
@@ -2029,8 +2089,9 @@
    *
    * @since 14.0
    */
-  public static <K, V> SetMultimap<K, V> filterEntries(
-      SetMultimap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> filterEntries(
+          SetMultimap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(entryPredicate);
     return (unfiltered instanceof FilteredSetMultimap)
         ? filterFiltered((FilteredSetMultimap<K, V>) unfiltered, entryPredicate)
@@ -2043,8 +2104,9 @@
    * lead to a multimap whose removal operations would fail. This method combines the predicates to
    * avoid that problem.
    */
-  private static <K, V> Multimap<K, V> filterFiltered(
-      FilteredMultimap<K, V> multimap, Predicate<? super Entry<K, V>> entryPredicate) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      Multimap<K, V> filterFiltered(
+          FilteredMultimap<K, V> multimap, Predicate<? super Entry<K, V>> entryPredicate) {
     Predicate<Entry<K, V>> predicate =
         Predicates.<Entry<K, V>>and(multimap.entryPredicate(), entryPredicate);
     return new FilteredEntryMultimap<>(multimap.unfiltered(), predicate);
@@ -2056,14 +2118,15 @@
    * lead to a multimap whose removal operations would fail. This method combines the predicates to
    * avoid that problem.
    */
-  private static <K, V> SetMultimap<K, V> filterFiltered(
-      FilteredSetMultimap<K, V> multimap, Predicate<? super Entry<K, V>> entryPredicate) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> filterFiltered(
+          FilteredSetMultimap<K, V> multimap, Predicate<? super Entry<K, V>> entryPredicate) {
     Predicate<Entry<K, V>> predicate =
         Predicates.<Entry<K, V>>and(multimap.entryPredicate(), entryPredicate);
     return new FilteredEntrySetMultimap<>(multimap.unfiltered(), predicate);
   }
 
-  static boolean equalsImpl(Multimap<?, ?> multimap, @NullableDecl Object object) {
+  static boolean equalsImpl(Multimap<?, ?> multimap, @CheckForNull Object object) {
     if (object == multimap) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/collect/Multiset.java b/android/guava/src/com/google/common/collect/Multiset.java
index faedb56..8dfb1af 100644
--- a/android/guava/src/com/google/common/collect/Multiset.java
+++ b/android/guava/src/com/google/common/collect/Multiset.java
@@ -24,7 +24,8 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A collection that supports order-independent equality, like {@link Set}, but may have duplicate
@@ -61,6 +62,10 @@
  * <p>A multiset uses {@link Object#equals} to determine whether two instances should be considered
  * "the same," <i>unless specified otherwise</i> by the implementation.
  *
+ * <p><b>Warning:</b> as with normal {@link Set}s, it is almost always a bad idea to modify an
+ * element (in a way that affects its {@link Object#equals} behavior) while it is contained in a
+ * multiset. Undefined behavior and bugs will result.
+ *
  * <p>Common implementations include {@link ImmutableMultiset}, {@link HashMultiset}, and {@link
  * ConcurrentHashMultiset}.
  *
@@ -76,7 +81,8 @@
  * @since 2.0
  */
 @GwtCompatible
-public interface Multiset<E> extends Collection<E> {
+@ElementTypesAreNonnullByDefault
+public interface Multiset<E extends @Nullable Object> extends Collection<E> {
   // Query Operations
 
   /**
@@ -101,7 +107,7 @@
    * @return the number of occurrences of the element in this multiset; possibly zero but never
    *     negative
    */
-  int count(@NullableDecl @CompatibleWith("E") Object element);
+  int count(@CompatibleWith("E") @CheckForNull Object element);
 
   // Bulk Operations
 
@@ -124,7 +130,7 @@
    *     return normally.
    */
   @CanIgnoreReturnValue
-  int add(@NullableDecl E element, int occurrences);
+  int add(@ParametricNullness E element, int occurrences);
 
   /**
    * Adds a single occurrence of the specified element to this multiset.
@@ -147,7 +153,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  boolean add(E element);
+  boolean add(@ParametricNullness E element);
 
   /**
    * Removes a number of occurrences of the specified element from this multiset. If the multiset
@@ -162,7 +168,7 @@
    * @throws IllegalArgumentException if {@code occurrences} is negative
    */
   @CanIgnoreReturnValue
-  int remove(@NullableDecl @CompatibleWith("E") Object element, int occurrences);
+  int remove(@CompatibleWith("E") @CheckForNull Object element, int occurrences);
 
   /**
    * Removes a <i>single</i> occurrence of the specified element from this multiset, if present.
@@ -178,7 +184,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  boolean remove(@NullableDecl Object element);
+  boolean remove(@CheckForNull Object element);
 
   /**
    * Adds or removes the necessary occurrences of an element such that the element attains the
@@ -194,7 +200,7 @@
    *     zero instead.
    */
   @CanIgnoreReturnValue
-  int setCount(E element, int count);
+  int setCount(@ParametricNullness E element, int count);
 
   /**
    * Conditionally sets the count of an element to a new value, as described in {@link
@@ -213,7 +219,7 @@
    *     implementor may optionally return {@code true} instead.
    */
   @CanIgnoreReturnValue
-  boolean setCount(E element, int oldCount, int newCount);
+  boolean setCount(@ParametricNullness E element, int oldCount, int newCount);
 
   // Views
 
@@ -259,7 +265,7 @@
    *
    * @since 2.0
    */
-  interface Entry<E> {
+  interface Entry<E extends @Nullable Object> {
 
     /**
      * Returns the multiset element corresponding to this entry. Multiple calls to this method
@@ -267,6 +273,7 @@
      *
      * @return the element corresponding to this entry
      */
+    @ParametricNullness
     E getElement();
 
     /**
@@ -294,7 +301,7 @@
      */
     @Override
     // TODO(kevinb): check this wrt TreeMultiset?
-    boolean equals(Object o);
+    boolean equals(@CheckForNull Object o);
 
     /**
      * {@inheritDoc}
@@ -328,7 +335,7 @@
    */
   @Override
   // TODO(kevinb): caveats about equivalence-relation?
-  boolean equals(@NullableDecl Object object);
+  boolean equals(@CheckForNull Object object);
 
   /**
    * Returns the hash code for this multiset. This is defined as the sum of
@@ -374,7 +381,7 @@
    * @return {@code true} if this multiset contains at least one occurrence of the element
    */
   @Override
-  boolean contains(@NullableDecl Object element);
+  boolean contains(@CheckForNull Object element);
 
   /**
    * Returns {@code true} if this multiset contains at least one occurrence of each element in the
diff --git a/android/guava/src/com/google/common/collect/Multisets.java b/android/guava/src/com/google/common/collect/Multisets.java
index 0f31b74..02febca 100644
--- a/android/guava/src/com/google/common/collect/Multisets.java
+++ b/android/guava/src/com/google/common/collect/Multisets.java
@@ -20,6 +20,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
 import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -38,7 +39,8 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides static utility methods for creating and working with {@link Multiset} instances.
@@ -53,6 +55,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Multisets {
   private Multisets() {}
 
@@ -66,7 +69,8 @@
    * @param multiset the multiset for which an unmodifiable view is to be generated
    * @return an unmodifiable view of the multiset
    */
-  public static <E> Multiset<E> unmodifiableMultiset(Multiset<? extends E> multiset) {
+  public static <E extends @Nullable Object> Multiset<E> unmodifiableMultiset(
+      Multiset<? extends E> multiset) {
     if (multiset instanceof UnmodifiableMultiset || multiset instanceof ImmutableMultiset) {
       @SuppressWarnings("unchecked") // Since it's unmodifiable, the covariant cast is safe
       Multiset<E> result = (Multiset<E>) multiset;
@@ -86,7 +90,8 @@
     return checkNotNull(multiset);
   }
 
-  static class UnmodifiableMultiset<E> extends ForwardingMultiset<E> implements Serializable {
+  static class UnmodifiableMultiset<E extends @Nullable Object> extends ForwardingMultiset<E>
+      implements Serializable {
     final Multiset<? extends E> delegate;
 
     UnmodifiableMultiset(Multiset<? extends E> delegate) {
@@ -100,7 +105,7 @@
       return (Multiset<E>) delegate;
     }
 
-    @NullableDecl transient Set<E> elementSet;
+    @CheckForNull transient Set<E> elementSet;
 
     Set<E> createElementSet() {
       return Collections.<E>unmodifiableSet(delegate.elementSet());
@@ -112,7 +117,7 @@
       return (es == null) ? elementSet = createElementSet() : es;
     }
 
-    @NullableDecl transient Set<Multiset.Entry<E>> entrySet;
+    @CheckForNull transient Set<Multiset.Entry<E>> entrySet;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -131,12 +136,12 @@
     }
 
     @Override
-    public boolean add(E element) {
+    public boolean add(@ParametricNullness E element) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public int add(E element, int occurences) {
+    public int add(@ParametricNullness E element, int occurrences) {
       throw new UnsupportedOperationException();
     }
 
@@ -146,12 +151,12 @@
     }
 
     @Override
-    public boolean remove(Object element) {
+    public boolean remove(@CheckForNull Object element) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public int remove(Object element, int occurrences) {
+    public int remove(@CheckForNull Object element, int occurrences) {
       throw new UnsupportedOperationException();
     }
 
@@ -171,12 +176,12 @@
     }
 
     @Override
-    public int setCount(E element, int count) {
+    public int setCount(@ParametricNullness E element, int count) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public boolean setCount(E element, int oldCount, int newCount) {
+    public boolean setCount(@ParametricNullness E element, int oldCount, int newCount) {
       throw new UnsupportedOperationException();
     }
 
@@ -195,7 +200,8 @@
    * @since 11.0
    */
   @Beta
-  public static <E> SortedMultiset<E> unmodifiableSortedMultiset(SortedMultiset<E> sortedMultiset) {
+  public static <E extends @Nullable Object> SortedMultiset<E> unmodifiableSortedMultiset(
+      SortedMultiset<E> sortedMultiset) {
     // it's in its own file so it can be emulated for GWT
     return new UnmodifiableSortedMultiset<E>(checkNotNull(sortedMultiset));
   }
@@ -208,22 +214,24 @@
    * @param n the count to be associated with the returned entry
    * @throws IllegalArgumentException if {@code n} is negative
    */
-  public static <E> Multiset.Entry<E> immutableEntry(@NullableDecl E e, int n) {
+  public static <E extends @Nullable Object> Multiset.Entry<E> immutableEntry(
+      @ParametricNullness E e, int n) {
     return new ImmutableEntry<E>(e, n);
   }
 
-  static class ImmutableEntry<E> extends AbstractEntry<E> implements Serializable {
-    @NullableDecl private final E element;
+  static class ImmutableEntry<E extends @Nullable Object> extends AbstractEntry<E>
+      implements Serializable {
+    @ParametricNullness private final E element;
     private final int count;
 
-    ImmutableEntry(@NullableDecl E element, int count) {
+    ImmutableEntry(@ParametricNullness E element, int count) {
       this.element = element;
       this.count = count;
       checkNonnegative(count, "count");
     }
 
     @Override
-    @NullableDecl
+    @ParametricNullness
     public final E getElement() {
       return element;
     }
@@ -233,6 +241,7 @@
       return count;
     }
 
+    @CheckForNull
     public ImmutableEntry<E> nextInBucket() {
       return null;
     }
@@ -266,7 +275,8 @@
    * @since 14.0
    */
   @Beta
-  public static <E> Multiset<E> filter(Multiset<E> unfiltered, Predicate<? super E> predicate) {
+  public static <E extends @Nullable Object> Multiset<E> filter(
+      Multiset<E> unfiltered, Predicate<? super E> predicate) {
     if (unfiltered instanceof FilteredMultiset) {
       // Support clear(), removeAll(), and retainAll() when filtering a filtered
       // collection.
@@ -277,7 +287,7 @@
     return new FilteredMultiset<E>(unfiltered, predicate);
   }
 
-  private static final class FilteredMultiset<E> extends ViewMultiset<E> {
+  private static final class FilteredMultiset<E extends @Nullable Object> extends ViewMultiset<E> {
     final Multiset<E> unfiltered;
     final Predicate<? super E> predicate;
 
@@ -319,7 +329,7 @@
     }
 
     @Override
-    public int count(@NullableDecl Object element) {
+    public int count(@CheckForNull Object element) {
       int count = unfiltered.count(element);
       if (count > 0) {
         @SuppressWarnings("unchecked") // element is equal to an E
@@ -330,14 +340,14 @@
     }
 
     @Override
-    public int add(@NullableDecl E element, int occurrences) {
+    public int add(@ParametricNullness E element, int occurrences) {
       checkArgument(
           predicate.apply(element), "Element %s does not match predicate %s", element, predicate);
       return unfiltered.add(element, occurrences);
     }
 
     @Override
-    public int remove(@NullableDecl Object element, int occurrences) {
+    public int remove(@CheckForNull Object element, int occurrences) {
       checkNonnegative(occurrences, "occurrences");
       if (occurrences == 0) {
         return count(element);
@@ -372,14 +382,14 @@
    * @since 14.0
    */
   @Beta
-  public static <E> Multiset<E> union(
+  public static <E extends @Nullable Object> Multiset<E> union(
       final Multiset<? extends E> multiset1, final Multiset<? extends E> multiset2) {
     checkNotNull(multiset1);
     checkNotNull(multiset2);
 
     return new ViewMultiset<E>() {
       @Override
-      public boolean contains(@NullableDecl Object element) {
+      public boolean contains(@CheckForNull Object element) {
         return multiset1.contains(element) || multiset2.contains(element);
       }
 
@@ -389,7 +399,7 @@
       }
 
       @Override
-      public int count(Object element) {
+      public int count(@CheckForNull Object element) {
         return Math.max(multiset1.count(element), multiset2.count(element));
       }
 
@@ -410,6 +420,7 @@
         // TODO(lowasser): consider making the entries live views
         return new AbstractIterator<Entry<E>>() {
           @Override
+          @CheckForNull
           protected Entry<E> computeNext() {
             if (iterator1.hasNext()) {
               Entry<? extends E> entry1 = iterator1.next();
@@ -443,14 +454,14 @@
    *
    * @since 2.0
    */
-  public static <E> Multiset<E> intersection(
+  public static <E extends @Nullable Object> Multiset<E> intersection(
       final Multiset<E> multiset1, final Multiset<?> multiset2) {
     checkNotNull(multiset1);
     checkNotNull(multiset2);
 
     return new ViewMultiset<E>() {
       @Override
-      public int count(Object element) {
+      public int count(@CheckForNull Object element) {
         int count1 = multiset1.count(element);
         return (count1 == 0) ? 0 : Math.min(count1, multiset2.count(element));
       }
@@ -471,6 +482,7 @@
         // TODO(lowasser): consider making the entries live views
         return new AbstractIterator<Entry<E>>() {
           @Override
+          @CheckForNull
           protected Entry<E> computeNext() {
             while (iterator1.hasNext()) {
               Entry<E> entry1 = iterator1.next();
@@ -500,7 +512,7 @@
    * @since 14.0
    */
   @Beta
-  public static <E> Multiset<E> sum(
+  public static <E extends @Nullable Object> Multiset<E> sum(
       final Multiset<? extends E> multiset1, final Multiset<? extends E> multiset2) {
     checkNotNull(multiset1);
     checkNotNull(multiset2);
@@ -508,7 +520,7 @@
     // TODO(lowasser): consider making the entries live views
     return new ViewMultiset<E>() {
       @Override
-      public boolean contains(@NullableDecl Object element) {
+      public boolean contains(@CheckForNull Object element) {
         return multiset1.contains(element) || multiset2.contains(element);
       }
 
@@ -523,7 +535,7 @@
       }
 
       @Override
-      public int count(Object element) {
+      public int count(@CheckForNull Object element) {
         return multiset1.count(element) + multiset2.count(element);
       }
 
@@ -543,6 +555,7 @@
         final Iterator<? extends Entry<? extends E>> iterator2 = multiset2.entrySet().iterator();
         return new AbstractIterator<Entry<E>>() {
           @Override
+          @CheckForNull
           protected Entry<E> computeNext() {
             if (iterator1.hasNext()) {
               Entry<? extends E> entry1 = iterator1.next();
@@ -577,7 +590,7 @@
    * @since 14.0
    */
   @Beta
-  public static <E> Multiset<E> difference(
+  public static <E extends @Nullable Object> Multiset<E> difference(
       final Multiset<E> multiset1, final Multiset<?> multiset2) {
     checkNotNull(multiset1);
     checkNotNull(multiset2);
@@ -585,7 +598,7 @@
     // TODO(lowasser): consider making the entries live views
     return new ViewMultiset<E>() {
       @Override
-      public int count(@NullableDecl Object element) {
+      public int count(@CheckForNull Object element) {
         int count1 = multiset1.count(element);
         return (count1 == 0) ? 0 : Math.max(0, count1 - multiset2.count(element));
       }
@@ -600,6 +613,7 @@
         final Iterator<Entry<E>> iterator1 = multiset1.entrySet().iterator();
         return new AbstractIterator<E>() {
           @Override
+          @CheckForNull
           protected E computeNext() {
             while (iterator1.hasNext()) {
               Entry<E> entry1 = iterator1.next();
@@ -618,6 +632,7 @@
         final Iterator<Entry<E>> iterator1 = multiset1.entrySet().iterator();
         return new AbstractIterator<Entry<E>>() {
           @Override
+          @CheckForNull
           protected Entry<E> computeNext() {
             while (iterator1.hasNext()) {
               Entry<E> entry1 = iterator1.next();
@@ -681,7 +696,7 @@
   }
 
   /** Delegate implementation which cares about the element type. */
-  private static <E> boolean retainOccurrencesImpl(
+  private static <E extends @Nullable Object> boolean retainOccurrencesImpl(
       Multiset<E> multisetToModify, Multiset<?> occurrencesToRetain) {
     checkNotNull(multisetToModify);
     checkNotNull(occurrencesToRetain);
@@ -789,13 +804,13 @@
    * Implementation of the {@code equals}, {@code hashCode}, and {@code toString} methods of {@link
    * Multiset.Entry}.
    */
-  abstract static class AbstractEntry<E> implements Multiset.Entry<E> {
+  abstract static class AbstractEntry<E extends @Nullable Object> implements Multiset.Entry<E> {
     /**
      * Indicates whether an object equals this entry, following the behavior specified in {@link
      * Multiset.Entry#equals}.
      */
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof Multiset.Entry) {
         Multiset.Entry<?> that = (Multiset.Entry<?>) object;
         return this.getCount() == that.getCount()
@@ -829,7 +844,7 @@
   }
 
   /** An implementation of {@link Multiset#equals}. */
-  static boolean equalsImpl(Multiset<?> multiset, @NullableDecl Object object) {
+  static boolean equalsImpl(Multiset<?> multiset, @CheckForNull Object object) {
     if (object == multiset) {
       return true;
     }
@@ -855,7 +870,8 @@
   }
 
   /** An implementation of {@link Multiset#addAll}. */
-  static <E> boolean addAllImpl(Multiset<E> self, Collection<? extends E> elements) {
+  static <E extends @Nullable Object> boolean addAllImpl(
+      Multiset<E> self, Collection<? extends E> elements) {
     checkNotNull(self);
     checkNotNull(elements);
     if (elements instanceof Multiset) {
@@ -868,7 +884,8 @@
   }
 
   /** A specialization of {@code addAllImpl} for when {@code elements} is itself a Multiset. */
-  private static <E> boolean addAllImpl(Multiset<E> self, Multiset<? extends E> elements) {
+  private static <E extends @Nullable Object> boolean addAllImpl(
+      Multiset<E> self, Multiset<? extends E> elements) {
     // It'd be nice if we could specialize for ImmutableMultiset here without also retaining
     // its code when it's not in scope...
     if (elements instanceof AbstractMapBasedMultiset) {
@@ -887,7 +904,7 @@
    * A specialization of {@code addAllImpl} for when {@code elements} is an
    * AbstractMapBasedMultiset.
    */
-  private static <E> boolean addAllImpl(
+  private static <E extends @Nullable Object> boolean addAllImpl(
       Multiset<E> self, AbstractMapBasedMultiset<? extends E> elements) {
     if (elements.isEmpty()) {
       return false;
@@ -918,7 +935,8 @@
   }
 
   /** An implementation of {@link Multiset#setCount(Object, int)}. */
-  static <E> int setCountImpl(Multiset<E> self, E element, int count) {
+  static <E extends @Nullable Object> int setCountImpl(
+      Multiset<E> self, @ParametricNullness E element, int count) {
     checkNonnegative(count, "count");
 
     int oldCount = self.count(element);
@@ -934,7 +952,8 @@
   }
 
   /** An implementation of {@link Multiset#setCount(Object, int, int)}. */
-  static <E> boolean setCountImpl(Multiset<E> self, E element, int oldCount, int newCount) {
+  static <E extends @Nullable Object> boolean setCountImpl(
+      Multiset<E> self, @ParametricNullness E element, int oldCount, int newCount) {
     checkNonnegative(oldCount, "oldCount");
     checkNonnegative(newCount, "newCount");
 
@@ -946,16 +965,18 @@
     }
   }
 
-  static <E> Iterator<E> elementIterator(Iterator<Entry<E>> entryIterator) {
+  static <E extends @Nullable Object> Iterator<E> elementIterator(
+      Iterator<Entry<E>> entryIterator) {
     return new TransformedIterator<Entry<E>, E>(entryIterator) {
       @Override
+      @ParametricNullness
       E transform(Entry<E> entry) {
         return entry.getElement();
       }
     };
   }
 
-  abstract static class ElementSet<E> extends Sets.ImprovedAbstractSet<E> {
+  abstract static class ElementSet<E extends @Nullable Object> extends Sets.ImprovedAbstractSet<E> {
     abstract Multiset<E> multiset();
 
     @Override
@@ -964,7 +985,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return multiset().contains(o);
     }
 
@@ -982,7 +1003,7 @@
     public abstract Iterator<E> iterator();
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       return multiset().remove(o, Integer.MAX_VALUE) > 0;
     }
 
@@ -992,11 +1013,12 @@
     }
   }
 
-  abstract static class EntrySet<E> extends Sets.ImprovedAbstractSet<Entry<E>> {
+  abstract static class EntrySet<E extends @Nullable Object>
+      extends Sets.ImprovedAbstractSet<Entry<E>> {
     abstract Multiset<E> multiset();
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Entry) {
         /*
          * The GWT compiler wrongly issues a warning here.
@@ -1015,15 +1037,16 @@
     // GWT compiler warning; see contains().
     @SuppressWarnings("cast")
     @Override
-    public boolean remove(Object object) {
+    public boolean remove(@CheckForNull Object object) {
       if (object instanceof Multiset.Entry) {
         Entry<?> entry = (Entry<?>) object;
         Object element = entry.getElement();
         int entryCount = entry.getCount();
         if (entryCount != 0) {
           // Safe as long as we never add a new entry, which we won't.
-          @SuppressWarnings("unchecked")
-          Multiset<Object> multiset = (Multiset<Object>) multiset();
+          // (Presumably it can still throw CCE/NPE but only if the underlying Multiset does.)
+          @SuppressWarnings({"unchecked", "nullness"})
+          Multiset<@Nullable Object> multiset = (Multiset<@Nullable Object>) multiset();
           return multiset.setCount(element, entryCount, 0);
         }
       }
@@ -1037,14 +1060,14 @@
   }
 
   /** An implementation of {@link Multiset#iterator}. */
-  static <E> Iterator<E> iteratorImpl(Multiset<E> multiset) {
+  static <E extends @Nullable Object> Iterator<E> iteratorImpl(Multiset<E> multiset) {
     return new MultisetIteratorImpl<E>(multiset, multiset.entrySet().iterator());
   }
 
-  static final class MultisetIteratorImpl<E> implements Iterator<E> {
+  static final class MultisetIteratorImpl<E extends @Nullable Object> implements Iterator<E> {
     private final Multiset<E> multiset;
     private final Iterator<Entry<E>> entryIterator;
-    @NullableDecl private Entry<E> currentEntry;
+    @CheckForNull private Entry<E> currentEntry;
 
     /** Count of subsequent elements equal to current element */
     private int laterCount;
@@ -1065,6 +1088,7 @@
     }
 
     @Override
+    @ParametricNullness
     public E next() {
       if (!hasNext()) {
         throw new NoSuchElementException();
@@ -1075,7 +1099,11 @@
       }
       laterCount--;
       canRemove = true;
-      return currentEntry.getElement();
+      /*
+       * requireNonNull is safe because laterCount starts at 0, forcing us to initialize
+       * currentEntry above. After that, we never clear it.
+       */
+      return requireNonNull(currentEntry).getElement();
     }
 
     @Override
@@ -1084,7 +1112,11 @@
       if (totalCount == 1) {
         entryIterator.remove();
       } else {
-        multiset.remove(currentEntry.getElement());
+        /*
+         * requireNonNull is safe because canRemove is set to true only after we initialize
+         * currentEntry (which we never subsequently clear).
+         */
+        multiset.remove(requireNonNull(currentEntry).getElement());
       }
       totalCount--;
       canRemove = false;
@@ -1101,7 +1133,7 @@
   }
 
   /** Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557 */
-  static <T> Multiset<T> cast(Iterable<T> iterable) {
+  static <T extends @Nullable Object> Multiset<T> cast(Iterable<T> iterable) {
     return (Multiset<T>) iterable;
   }
 
@@ -1131,7 +1163,8 @@
    * An {@link AbstractMultiset} with additional default implementations, some of them linear-time
    * implementations in terms of {@code elementSet} and {@code entrySet}.
    */
-  private abstract static class ViewMultiset<E> extends AbstractMultiset<E> {
+  private abstract static class ViewMultiset<E extends @Nullable Object>
+      extends AbstractMultiset<E> {
     @Override
     public int size() {
       return linearTimeSizeImpl(this);
diff --git a/android/guava/src/com/google/common/collect/MutableClassToInstanceMap.java b/android/guava/src/com/google/common/collect/MutableClassToInstanceMap.java
index 1f228a8..2fcf0d6 100644
--- a/android/guava/src/com/google/common/collect/MutableClassToInstanceMap.java
+++ b/android/guava/src/com/google/common/collect/MutableClassToInstanceMap.java
@@ -27,20 +27,26 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A mutable class-to-instance map backed by an arbitrary user-provided map. See also {@link
  * ImmutableClassToInstanceMap}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#classtoinstancemap"> {@code
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#classtoinstancemap">{@code
  * ClassToInstanceMap}</a>.
  *
+ * <p>This implementation <i>does</i> support null values, despite how it is annotated; see
+ * discussion at {@link ClassToInstanceMap}.
+ *
  * @author Kevin Bourrillion
  * @since 2.0
  */
 @GwtIncompatible
 @SuppressWarnings("serial") // using writeReplace instead of standard serialization
+@ElementTypesAreNonnullByDefault
 public final class MutableClassToInstanceMap<B> extends ForwardingMap<Class<? extends B>, B>
     implements ClassToInstanceMap<B>, Serializable {
 
@@ -108,11 +114,20 @@
 
       @Override
       public Object[] toArray() {
-        return standardToArray();
+        /*
+         * standardToArray returns `@Nullable Object[]` rather than `Object[]` but only because it
+         * can be used with collections that may contain null. This collection is a collection of
+         * non-null Entry objects (Entry objects that might contain null values but are not
+         * themselves null), so we can treat it as a plain `Object[]`.
+         */
+        @SuppressWarnings("nullness")
+        Object[] result = standardToArray();
+        return result;
       }
 
       @Override
-      public <T> T[] toArray(T[] array) {
+      @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+      public <T extends @Nullable Object> T[] toArray(T[] array) {
         return standardToArray(array);
       }
     };
@@ -120,6 +135,7 @@
 
   @Override
   @CanIgnoreReturnValue
+  @CheckForNull
   public B put(Class<? extends B> key, B value) {
     return super.put(key, cast(key, value));
   }
@@ -135,17 +151,20 @@
 
   @CanIgnoreReturnValue
   @Override
+  @CheckForNull
   public <T extends B> T putInstance(Class<T> type, T value) {
     return cast(type, put(type, value));
   }
 
   @Override
+  @CheckForNull
   public <T extends B> T getInstance(Class<T> type) {
     return cast(type, get(type));
   }
 
   @CanIgnoreReturnValue
-  private static <B, T extends B> T cast(Class<T> type, B value) {
+  @CheckForNull
+  private static <B, T extends B> T cast(Class<T> type, @CheckForNull B value) {
     return Primitives.wrap(type).cast(value);
   }
 
diff --git a/android/guava/src/com/google/common/collect/NaturalOrdering.java b/android/guava/src/com/google/common/collect/NaturalOrdering.java
index d979276..8cb8aef 100644
--- a/android/guava/src/com/google/common/collect/NaturalOrdering.java
+++ b/android/guava/src/com/google/common/collect/NaturalOrdering.java
@@ -20,44 +20,46 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering that uses the natural order of the values. */
 @GwtCompatible(serializable = true)
 @SuppressWarnings({"unchecked", "rawtypes"}) // TODO(kevinb): the right way to explain this??
-final class NaturalOrdering extends Ordering<Comparable> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class NaturalOrdering extends Ordering<Comparable<?>> implements Serializable {
   static final NaturalOrdering INSTANCE = new NaturalOrdering();
 
-  @NullableDecl private transient Ordering<Comparable> nullsFirst;
-  @NullableDecl private transient Ordering<Comparable> nullsLast;
+  @CheckForNull private transient Ordering<@Nullable Comparable<?>> nullsFirst;
+  @CheckForNull private transient Ordering<@Nullable Comparable<?>> nullsLast;
 
   @Override
-  public int compare(Comparable left, Comparable right) {
+  public int compare(Comparable<?> left, Comparable<?> right) {
     checkNotNull(left); // for GWT
     checkNotNull(right);
-    return left.compareTo(right);
+    return ((Comparable<Object>) left).compareTo(right);
   }
 
   @Override
-  public <S extends Comparable> Ordering<S> nullsFirst() {
-    Ordering<Comparable> result = nullsFirst;
+  public <S extends Comparable<?>> Ordering<@Nullable S> nullsFirst() {
+    Ordering<@Nullable Comparable<?>> result = nullsFirst;
     if (result == null) {
-      result = nullsFirst = super.nullsFirst();
+      result = nullsFirst = super.<Comparable<?>>nullsFirst();
     }
-    return (Ordering<S>) result;
+    return (Ordering<@Nullable S>) result;
   }
 
   @Override
-  public <S extends Comparable> Ordering<S> nullsLast() {
-    Ordering<Comparable> result = nullsLast;
+  public <S extends Comparable<?>> Ordering<@Nullable S> nullsLast() {
+    Ordering<@Nullable Comparable<?>> result = nullsLast;
     if (result == null) {
-      result = nullsLast = super.nullsLast();
+      result = nullsLast = super.<Comparable<?>>nullsLast();
     }
-    return (Ordering<S>) result;
+    return (Ordering<@Nullable S>) result;
   }
 
   @Override
-  public <S extends Comparable> Ordering<S> reverse() {
+  public <S extends Comparable<?>> Ordering<S> reverse() {
     return (Ordering<S>) ReverseNaturalOrdering.INSTANCE;
   }
 
diff --git a/android/guava/src/com/google/common/collect/NullnessCasts.java b/android/guava/src/com/google/common/collect/NullnessCasts.java
new file mode 100644
index 0000000..6ceeda7
--- /dev/null
+++ b/android/guava/src/com/google/common/collect/NullnessCasts.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.collect;
+
+import com.google.common.annotations.GwtCompatible;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/** A utility method to perform unchecked casts to suppress errors produced by nullness analyses. */
+@GwtCompatible
+@ElementTypesAreNonnullByDefault
+final class NullnessCasts {
+  /**
+   * Accepts a {@code @Nullable T} and returns a plain {@code T}, without performing any check that
+   * that conversion is safe.
+   *
+   * <p>This method is intended to help with usages of type parameters that have {@linkplain
+   * ParametricNullness parametric nullness}. If a type parameter instead ranges over only non-null
+   * types (or if the type is a non-variable type, like {@code String}), then code should almost
+   * never use this method, preferring instead to call {@code requireNonNull} so as to benefit from
+   * its runtime check.
+   *
+   * <p>An example use case for this method is in implementing an {@code Iterator<T>} whose {@code
+   * next} field is lazily initialized. The type of that field would be {@code @Nullable T}, and the
+   * code would be responsible for populating a "real" {@code T} (which might still be the value
+   * {@code null}!) before returning it to callers. Depending on how the code is structured, a
+   * nullness analysis might not understand that the field has been populated. To avoid that problem
+   * without having to add {@code @SuppressWarnings}, the code can call this method.
+   *
+   * <p>Why <i>not</i> just add {@code SuppressWarnings}? The problem is that this method is
+   * typically useful for {@code return} statements. That leaves the code with two options: Either
+   * add the suppression to the whole method (which turns off checking for a large section of code),
+   * or extract a variable, and put the suppression on that. However, a local variable typically
+   * doesn't work: Because nullness analyses typically infer the nullness of local variables,
+   * there's no way to assign a {@code @Nullable T} to a field {@code T foo;} and instruct the
+   * analysis that that means "plain {@code T}" rather than the inferred type {@code @Nullable T}.
+   * (Even if supported added {@code @NonNull}, that would not help, since the problem case
+   * addressed by this method is the case in which {@code T} has parametric nullness -- and thus its
+   * value may be legitimately {@code null}.)
+   */
+  @ParametricNullness
+  @SuppressWarnings("nullness")
+  static <T extends @Nullable Object> T uncheckedCastNullableTToT(@CheckForNull T t) {
+    return t;
+  }
+
+  /** Returns {@code null} as any type, even one that does not include {@code null}. */
+  @SuppressWarnings({"nullness", "TypeParameterUnusedInFormals"})
+  // The warnings are legitimate. Each time we use this method, we document why.
+  @ParametricNullness
+  static <T extends @Nullable Object> T unsafeNull() {
+    return null;
+  }
+
+  private NullnessCasts() {}
+}
diff --git a/android/guava/src/com/google/common/collect/NullsFirstOrdering.java b/android/guava/src/com/google/common/collect/NullsFirstOrdering.java
index 2154036..ce8be2f 100644
--- a/android/guava/src/com/google/common/collect/NullsFirstOrdering.java
+++ b/android/guava/src/com/google/common/collect/NullsFirstOrdering.java
@@ -18,11 +18,14 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering that treats {@code null} as less than all other values. */
 @GwtCompatible(serializable = true)
-final class NullsFirstOrdering<T> extends Ordering<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class NullsFirstOrdering<T extends @Nullable Object> extends Ordering<@Nullable T>
+    implements Serializable {
   final Ordering<? super T> ordering;
 
   NullsFirstOrdering(Ordering<? super T> ordering) {
@@ -30,7 +33,7 @@
   }
 
   @Override
-  public int compare(@NullableDecl T left, @NullableDecl T right) {
+  public int compare(@CheckForNull T left, @CheckForNull T right) {
     if (left == right) {
       return 0;
     }
@@ -44,24 +47,25 @@
   }
 
   @Override
-  public <S extends T> Ordering<S> reverse() {
+  @SuppressWarnings("nullness") // should be safe, but not sure if we can avoid the warning
+  public <S extends @Nullable T> Ordering<S> reverse() {
     // ordering.reverse() might be optimized, so let it do its thing
     return ordering.reverse().nullsLast();
   }
 
   @SuppressWarnings("unchecked") // still need the right way to explain this
   @Override
-  public <S extends T> Ordering<S> nullsFirst() {
-    return (Ordering<S>) this;
+  public <S extends T> Ordering<@Nullable S> nullsFirst() {
+    return (Ordering<@Nullable S>) this;
   }
 
   @Override
-  public <S extends T> Ordering<S> nullsLast() {
-    return ordering.nullsLast();
+  public <S extends T> Ordering<@Nullable S> nullsLast() {
+    return ordering.<S>nullsLast();
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/collect/NullsLastOrdering.java b/android/guava/src/com/google/common/collect/NullsLastOrdering.java
index 5dd8950..6f8f74c 100644
--- a/android/guava/src/com/google/common/collect/NullsLastOrdering.java
+++ b/android/guava/src/com/google/common/collect/NullsLastOrdering.java
@@ -18,11 +18,14 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering that treats {@code null} as greater than all other values. */
 @GwtCompatible(serializable = true)
-final class NullsLastOrdering<T> extends Ordering<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class NullsLastOrdering<T extends @Nullable Object> extends Ordering<@Nullable T>
+    implements Serializable {
   final Ordering<? super T> ordering;
 
   NullsLastOrdering(Ordering<? super T> ordering) {
@@ -30,7 +33,7 @@
   }
 
   @Override
-  public int compare(@NullableDecl T left, @NullableDecl T right) {
+  public int compare(@CheckForNull T left, @CheckForNull T right) {
     if (left == right) {
       return 0;
     }
@@ -44,24 +47,25 @@
   }
 
   @Override
-  public <S extends T> Ordering<S> reverse() {
+  @SuppressWarnings("nullness") // should be safe, but not sure if we can avoid the warning
+  public <S extends @Nullable T> Ordering<S> reverse() {
     // ordering.reverse() might be optimized, so let it do its thing
     return ordering.reverse().nullsFirst();
   }
 
   @Override
-  public <S extends T> Ordering<S> nullsFirst() {
-    return ordering.nullsFirst();
+  public <S extends T> Ordering<@Nullable S> nullsFirst() {
+    return ordering.<S>nullsFirst();
   }
 
   @SuppressWarnings("unchecked") // still need the right way to explain this
   @Override
-  public <S extends T> Ordering<S> nullsLast() {
-    return (Ordering<S>) this;
+  public <S extends T> Ordering<@Nullable S> nullsLast() {
+    return (Ordering<@Nullable S>) this;
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/collect/ObjectArrays.java b/android/guava/src/com/google/common/collect/ObjectArrays.java
index e09fc69..0f928e1 100644
--- a/android/guava/src/com/google/common/collect/ObjectArrays.java
+++ b/android/guava/src/com/google/common/collect/ObjectArrays.java
@@ -24,7 +24,8 @@
 import java.lang.reflect.Array;
 import java.util.Arrays;
 import java.util.Collection;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to object arrays.
@@ -33,6 +34,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class ObjectArrays {
 
   private ObjectArrays() {}
@@ -55,7 +57,7 @@
    * @param reference any array of the desired type
    * @param length the length of the new array
    */
-  public static <T> T[] newArray(T[] reference, int length) {
+  public static <T extends @Nullable Object> T[] newArray(T[] reference, int length) {
     return Platform.newArray(reference, length);
   }
 
@@ -82,7 +84,7 @@
    * @return an array whose size is one larger than {@code array}, with {@code element} occupying
    *     the first position, and the elements of {@code array} occupying the remaining elements.
    */
-  public static <T> T[] concat(@NullableDecl T element, T[] array) {
+  public static <T extends @Nullable Object> T[] concat(@ParametricNullness T element, T[] array) {
     T[] result = newArray(array, array.length + 1);
     result[0] = element;
     System.arraycopy(array, 0, result, 1, array.length);
@@ -97,7 +99,7 @@
    * @return an array whose size is one larger than {@code array}, with the same contents as {@code
    *     array}, plus {@code element} occupying the last position.
    */
-  public static <T> T[] concat(T[] array, @NullableDecl T element) {
+  public static <T extends @Nullable Object> T[] concat(T[] array, @ParametricNullness T element) {
     T[] result = Arrays.copyOf(array, array.length + 1);
     result[array.length] = element;
     return result;
@@ -124,14 +126,15 @@
    * @throws ArrayStoreException if the runtime type of the specified array is not a supertype of
    *     the runtime type of every element in the specified collection
    */
-  static <T> T[] toArrayImpl(Collection<?> c, T[] array) {
+  static <T extends @Nullable Object> T[] toArrayImpl(Collection<?> c, T[] array) {
     int size = c.size();
     if (array.length < size) {
       array = newArray(array, size);
     }
     fillArray(c, array);
     if (array.length > size) {
-      array[size] = null;
+      @Nullable Object[] unsoundlyCovariantArray = array;
+      unsoundlyCovariantArray[size] = null;
     }
     return array;
   }
@@ -147,12 +150,14 @@
    * collection is set to {@code null}. This is useful in determining the length of the collection
    * <i>only</i> if the caller knows that the collection does not contain any null elements.
    */
-  static <T> T[] toArrayImpl(Object[] src, int offset, int len, T[] dst) {
+  static <T extends @Nullable Object> T[] toArrayImpl(
+      @Nullable Object[] src, int offset, int len, T[] dst) {
     checkPositionIndexes(offset, offset + len, src.length);
     if (dst.length < len) {
       dst = newArray(dst, len);
     } else if (dst.length > len) {
-      dst[len] = null;
+      @Nullable Object[] unsoundlyCovariantArray = dst;
+      unsoundlyCovariantArray[len] = null;
     }
     System.arraycopy(src, offset, dst, 0, len);
     return dst;
@@ -170,7 +175,7 @@
    *
    * @param c the collection for which to return an array of elements
    */
-  static Object[] toArrayImpl(Collection<?> c) {
+  static @Nullable Object[] toArrayImpl(Collection<?> c) {
     return fillArray(c, new Object[c.size()]);
   }
 
@@ -178,18 +183,18 @@
    * Returns a copy of the specified subrange of the specified array that is literally an Object[],
    * and not e.g. a {@code String[]}.
    */
-  static Object[] copyAsObjectArray(Object[] elements, int offset, int length) {
+  static @Nullable Object[] copyAsObjectArray(@Nullable Object[] elements, int offset, int length) {
     checkPositionIndexes(offset, offset + length, elements.length);
     if (length == 0) {
       return new Object[0];
     }
-    Object[] result = new Object[length];
+    @Nullable Object[] result = new Object[length];
     System.arraycopy(elements, offset, result, 0, length);
     return result;
   }
 
   @CanIgnoreReturnValue
-  private static Object[] fillArray(Iterable<?> elements, Object[] array) {
+  private static @Nullable Object[] fillArray(Iterable<?> elements, @Nullable Object[] array) {
     int i = 0;
     for (Object element : elements) {
       array[i++] = element;
@@ -206,11 +211,12 @@
 
   @CanIgnoreReturnValue
   static Object[] checkElementsNotNull(Object... array) {
-    return checkElementsNotNull(array, array.length);
+    checkElementsNotNull(array, array.length);
+    return array;
   }
 
   @CanIgnoreReturnValue
-  static Object[] checkElementsNotNull(Object[] array, int length) {
+  static @Nullable Object[] checkElementsNotNull(@Nullable Object[] array, int length) {
     for (int i = 0; i < length; i++) {
       checkElementNotNull(array[i], i);
     }
@@ -220,7 +226,7 @@
   // We do this instead of Preconditions.checkNotNull to save boxing and array
   // creation cost.
   @CanIgnoreReturnValue
-  static Object checkElementNotNull(Object element, int index) {
+  static Object checkElementNotNull(@CheckForNull Object element, int index) {
     if (element == null) {
       throw new NullPointerException("at index " + index);
     }
diff --git a/android/guava/src/com/google/common/collect/ObjectCountHashMap.java b/android/guava/src/com/google/common/collect/ObjectCountHashMap.java
index 8f6003f..29d5bcd 100644
--- a/android/guava/src/com/google/common/collect/ObjectCountHashMap.java
+++ b/android/guava/src/com/google/common/collect/ObjectCountHashMap.java
@@ -28,21 +28,22 @@
 import com.google.common.collect.Multisets.AbstractEntry;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
- * ObjectCountHashMap is an implementation of {@code AbstractObjectCountMap} that uses arrays to
- * store key objects and count values. Comparing to using a traditional {@code HashMap}
- * implementation which stores keys and count values as map entries, {@code ObjectCountHashMap}
- * minimizes object allocation and reduces memory footprint.
+ * {@code ObjectCountHashMap} uses arrays to store key objects and count values. Comparing to using
+ * a traditional {@code HashMap} implementation which stores keys and count values as map entries,
+ * {@code ObjectCountHashMap} minimizes object allocation and reduces memory footprint.
  *
  * <p>In the absence of element deletions, this will iterate over elements in insertion order.
  */
 @GwtCompatible(serializable = true, emulated = true)
-class ObjectCountHashMap<K> {
+@ElementTypesAreNonnullByDefault
+class ObjectCountHashMap<K extends @Nullable Object> {
 
   /** Creates an empty {@code ObjectCountHashMap} instance. */
-  public static <K> ObjectCountHashMap<K> create() {
+  static <K extends @Nullable Object> ObjectCountHashMap<K> create() {
     return new ObjectCountHashMap<K>();
   }
 
@@ -55,7 +56,8 @@
    *     expectedSize} elements without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <K> ObjectCountHashMap<K> createWithExpectedSize(int expectedSize) {
+  static <K extends @Nullable Object> ObjectCountHashMap<K> createWithExpectedSize(
+      int expectedSize) {
     return new ObjectCountHashMap<K>(expectedSize);
   }
 
@@ -74,8 +76,13 @@
   // used to indicate blank table entries
   static final int UNSET = -1;
 
+  /*
+   * The array fields below are not initialized directly in the constructor, but they're initialized
+   * by init(), which the constructor calls.
+   */
+
   /** The keys of the entries in the map. */
-  transient Object[] keys;
+  transient @Nullable Object[] keys;
 
   /** The values of the entries in the map. */
   transient int[] values;
@@ -140,7 +147,7 @@
     this.table = newTable(buckets);
     this.loadFactor = loadFactor;
 
-    this.keys = new Object[expectedSize];
+    this.keys = new @Nullable Object[expectedSize];
     this.values = new int[expectedSize];
 
     this.entries = newEntries(expectedSize);
@@ -180,6 +187,7 @@
   }
 
   @SuppressWarnings("unchecked")
+  @ParametricNullness
   K getKey(int index) {
     checkElementIndex(index, size);
     return (K) keys[index];
@@ -201,7 +209,7 @@
   }
 
   class MapEntry extends AbstractEntry<K> {
-    @NullableDecl final K key;
+    @ParametricNullness final K key;
 
     int lastKnownIndex;
 
@@ -212,6 +220,7 @@
     }
 
     @Override
+    @ParametricNullness
     public K getElement() {
       return key;
     }
@@ -271,10 +280,10 @@
   }
 
   @CanIgnoreReturnValue
-  public int put(@NullableDecl K key, int value) {
+  public int put(@ParametricNullness K key, int value) {
     checkPositive(value, "count");
     long[] entries = this.entries;
-    Object[] keys = this.keys;
+    @Nullable Object[] keys = this.keys;
     int[] values = this.values;
 
     int hash = smearedHash(key);
@@ -316,7 +325,7 @@
   /**
    * Creates a fresh entry with the specified object at the specified position in the entry array.
    */
-  void insertEntry(int entryIndex, @NullableDecl K key, int value, int hash) {
+  void insertEntry(int entryIndex, @ParametricNullness K key, int value, int hash) {
     this.entries[entryIndex] = ((long) hash << 32) | (NEXT_MASK & UNSET);
     this.keys[entryIndex] = key;
     this.values[entryIndex] = value;
@@ -377,7 +386,7 @@
     this.table = newTable;
   }
 
-  int indexOf(@NullableDecl Object key) {
+  int indexOf(@CheckForNull Object key) {
     int hash = smearedHash(key);
     int next = table[hash & hashTableMask()];
     while (next != UNSET) {
@@ -390,21 +399,21 @@
     return -1;
   }
 
-  public boolean containsKey(@NullableDecl Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return indexOf(key) != -1;
   }
 
-  public int get(@NullableDecl Object key) {
+  public int get(@CheckForNull Object key) {
     int index = indexOf(key);
     return (index == -1) ? 0 : values[index];
   }
 
   @CanIgnoreReturnValue
-  public int remove(@NullableDecl Object key) {
+  public int remove(@CheckForNull Object key) {
     return remove(key, smearedHash(key));
   }
 
-  private int remove(@NullableDecl Object key, int hash) {
+  private int remove(@CheckForNull Object key, int hash) {
     int tableIndex = hash & hashTableMask();
     int next = table[tableIndex];
     if (next == UNSET) { // empty bucket
diff --git a/android/guava/src/com/google/common/collect/ObjectCountLinkedHashMap.java b/android/guava/src/com/google/common/collect/ObjectCountLinkedHashMap.java
index 5a5a476..266606a 100644
--- a/android/guava/src/com/google/common/collect/ObjectCountLinkedHashMap.java
+++ b/android/guava/src/com/google/common/collect/ObjectCountLinkedHashMap.java
@@ -18,18 +18,20 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import java.util.Arrays;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
- * ObjectCountLinkedHashMap is an implementation of {@code AbstractObjectCountMap} with insertion
+ * {@code ObjectCountLinkedHashMap} is a subclass of {@code ObjectCountHashMap} with insertion
  * iteration order, and uses arrays to store key objects and count values. Comparing to using a
  * traditional {@code LinkedHashMap} implementation which stores keys and count values as map
  * entries, {@code ObjectCountLinkedHashMap} minimizes object allocation and reduces memory
  * footprint.
  */
 @GwtCompatible(serializable = true, emulated = true)
-class ObjectCountLinkedHashMap<K> extends ObjectCountHashMap<K> {
+@ElementTypesAreNonnullByDefault
+class ObjectCountLinkedHashMap<K extends @Nullable Object> extends ObjectCountHashMap<K> {
   /** Creates an empty {@code ObjectCountLinkedHashMap} instance. */
-  public static <K> ObjectCountLinkedHashMap<K> create() {
+  static <K extends @Nullable Object> ObjectCountLinkedHashMap<K> create() {
     return new ObjectCountLinkedHashMap<K>();
   }
 
@@ -42,12 +44,18 @@
    *     expectedSize} elements without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <K> ObjectCountLinkedHashMap<K> createWithExpectedSize(int expectedSize) {
+  static <K extends @Nullable Object> ObjectCountLinkedHashMap<K> createWithExpectedSize(
+      int expectedSize) {
     return new ObjectCountLinkedHashMap<K>(expectedSize);
   }
 
   private static final int ENDPOINT = -2;
 
+  /*
+   * The links field is not initialized directly in the constructor, but it's initialized by init(),
+   * which the superconstructor calls.
+   */
+
   /**
    * Contains the link pointers corresponding with the entries, in the range of [0, size()). The
    * high 32 bits of each long is the "prev" pointer, whereas the low 32 bits is the "succ" pointer
@@ -141,7 +149,7 @@
   }
 
   @Override
-  void insertEntry(int entryIndex, K key, int value, int hash) {
+  void insertEntry(int entryIndex, @ParametricNullness K key, int value, int hash) {
     super.insertEntry(entryIndex, key, value, hash);
     setSucceeds(lastEntry, entryIndex);
     setSucceeds(entryIndex, ENDPOINT);
diff --git a/android/guava/src/com/google/common/collect/Ordering.java b/android/guava/src/com/google/common/collect/Ordering.java
index 187aacf..025f95f 100644
--- a/android/guava/src/com/google/common/collect/Ordering.java
+++ b/android/guava/src/com/google/common/collect/Ordering.java
@@ -38,7 +38,8 @@
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A comparator, with additional methods to support common operations. This is an "enriched" version
@@ -144,7 +145,8 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class Ordering<T> implements Comparator<T> {
+@ElementTypesAreNonnullByDefault
+public abstract class Ordering<T extends @Nullable Object> implements Comparator<T> {
   // Natural order
 
   /**
@@ -178,7 +180,7 @@
    *     wraps that comparator
    */
   @GwtCompatible(serializable = true)
-  public static <T> Ordering<T> from(Comparator<T> comparator) {
+  public static <T extends @Nullable Object> Ordering<T> from(Comparator<T> comparator) {
     return (comparator instanceof Ordering)
         ? (Ordering<T>) comparator
         : new ComparatorOrdering<T>(comparator);
@@ -191,7 +193,7 @@
    */
   @GwtCompatible(serializable = true)
   @Deprecated
-  public static <T> Ordering<T> from(Ordering<T> ordering) {
+  public static <T extends @Nullable Object> Ordering<T> from(Ordering<T> ordering) {
     return checkNotNull(ordering);
   }
 
@@ -278,7 +280,7 @@
    */
   @GwtCompatible(serializable = true)
   @SuppressWarnings("unchecked")
-  public static Ordering<Object> allEqual() {
+  public static Ordering<@Nullable Object> allEqual() {
     return AllEqualOrdering.INSTANCE;
   }
 
@@ -311,16 +313,16 @@
    * @since 2.0
    */
   // TODO(kevinb): copy to Comparators, etc.
-  public static Ordering<Object> arbitrary() {
+  public static Ordering<@Nullable Object> arbitrary() {
     return ArbitraryOrderingHolder.ARBITRARY_ORDERING;
   }
 
   private static class ArbitraryOrderingHolder {
-    static final Ordering<Object> ARBITRARY_ORDERING = new ArbitraryOrdering();
+    static final Ordering<@Nullable Object> ARBITRARY_ORDERING = new ArbitraryOrdering();
   }
 
   @VisibleForTesting
-  static class ArbitraryOrdering extends Ordering<Object> {
+  static class ArbitraryOrdering extends Ordering<@Nullable Object> {
 
     private final AtomicInteger counter = new AtomicInteger(0);
     private final ConcurrentMap<Object, Integer> uids =
@@ -342,7 +344,7 @@
     }
 
     @Override
-    public int compare(Object left, Object right) {
+    public int compare(@CheckForNull Object left, @CheckForNull Object right) {
       if (left == right) {
         return 0;
       } else if (left == null) {
@@ -414,7 +416,7 @@
   // type parameter <S> lets us avoid the extra <String> in statements like:
   // Ordering<String> o = Ordering.<String>natural().nullsFirst();
   @GwtCompatible(serializable = true)
-  public <S extends T> Ordering<S> nullsFirst() {
+  public <S extends T> Ordering<@Nullable S> nullsFirst() {
     return new NullsFirstOrdering<S>(this);
   }
 
@@ -427,7 +429,7 @@
   // type parameter <S> lets us avoid the extra <String> in statements like:
   // Ordering<String> o = Ordering.<String>natural().nullsLast();
   @GwtCompatible(serializable = true)
-  public <S extends T> Ordering<S> nullsLast() {
+  public <S extends T> Ordering<@Nullable S> nullsLast() {
     return new NullsLastOrdering<S>(this);
   }
 
@@ -445,7 +447,7 @@
    * can omit the comparator if it is the natural order).
    */
   @GwtCompatible(serializable = true)
-  public <F> Ordering<F> onResultOf(Function<F, ? extends T> function) {
+  public <F extends @Nullable Object> Ordering<F> onResultOf(Function<F, ? extends T> function) {
     return new ByFunctionOrdering<>(function, this);
   }
 
@@ -491,7 +493,8 @@
    * @param comparators the comparators to try in order
    */
   @GwtCompatible(serializable = true)
-  public static <T> Ordering<T> compound(Iterable<? extends Comparator<? super T>> comparators) {
+  public static <T extends @Nullable Object> Ordering<T> compound(
+      Iterable<? extends Comparator<? super T>> comparators) {
     return new CompoundOrdering<T>(comparators);
   }
 
@@ -527,10 +530,9 @@
 
   // Regular instance methods
 
-  // Override to add @NullableDecl
   @CanIgnoreReturnValue // TODO(kak): Consider removing this
   @Override
-  public abstract int compare(@NullableDecl T left, @NullableDecl T right);
+  public abstract int compare(@ParametricNullness T left, @ParametricNullness T right);
 
   /**
    * Returns the least of the specified values according to this ordering. If there are multiple
@@ -546,6 +548,7 @@
    *     ordering.
    * @since 11.0
    */
+  @ParametricNullness
   public <E extends T> E min(Iterator<E> iterator) {
     // let this throw NoSuchElementException as necessary
     E minSoFar = iterator.next();
@@ -571,6 +574,7 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
+  @ParametricNullness
   public <E extends T> E min(Iterable<E> iterable) {
     return min(iterable.iterator());
   }
@@ -590,7 +594,8 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
-  public <E extends T> E min(@NullableDecl E a, @NullableDecl E b) {
+  @ParametricNullness
+  public <E extends T> E min(@ParametricNullness E a, @ParametricNullness E b) {
     return (compare(a, b) <= 0) ? a : b;
   }
 
@@ -608,7 +613,9 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
-  public <E extends T> E min(@NullableDecl E a, @NullableDecl E b, @NullableDecl E c, E... rest) {
+  @ParametricNullness
+  public <E extends T> E min(
+      @ParametricNullness E a, @ParametricNullness E b, @ParametricNullness E c, E... rest) {
     E minSoFar = min(min(a, b), c);
 
     for (E r : rest) {
@@ -632,6 +639,7 @@
    *     ordering.
    * @since 11.0
    */
+  @ParametricNullness
   public <E extends T> E max(Iterator<E> iterator) {
     // let this throw NoSuchElementException as necessary
     E maxSoFar = iterator.next();
@@ -657,6 +665,7 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
+  @ParametricNullness
   public <E extends T> E max(Iterable<E> iterable) {
     return max(iterable.iterator());
   }
@@ -676,7 +685,8 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
-  public <E extends T> E max(@NullableDecl E a, @NullableDecl E b) {
+  @ParametricNullness
+  public <E extends T> E max(@ParametricNullness E a, @ParametricNullness E b) {
     return (compare(a, b) >= 0) ? a : b;
   }
 
@@ -694,7 +704,9 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
-  public <E extends T> E max(@NullableDecl E a, @NullableDecl E b, @NullableDecl E c, E... rest) {
+  @ParametricNullness
+  public <E extends T> E max(
+      @ParametricNullness E a, @ParametricNullness E b, @ParametricNullness E c, E... rest) {
     E maxSoFar = max(max(a, b), c);
 
     for (E r : rest) {
@@ -859,6 +871,7 @@
    * @since 3.0
    */
   // TODO(kevinb): rerun benchmarks including new options
+  @SuppressWarnings("nullness") // unsafe, but there's not much we can do about it now
   public <E extends T> ImmutableList<E> immutableSortedCopy(Iterable<E> elements) {
     return ImmutableList.sortedCopyOf(this, elements);
   }
@@ -920,7 +933,8 @@
    * @deprecated Use {@link Collections#binarySearch(List, Object, Comparator)} directly.
    */
   @Deprecated
-  public int binarySearch(List<? extends T> sortedList, @NullableDecl T key) {
+  public int binarySearch(
+      List<? extends T> sortedList, @ParametricNullness T key) {
     return Collections.binarySearch(sortedList, key, this);
   }
 
diff --git a/android/guava/src/com/google/common/collect/ParametricNullness.java b/android/guava/src/com/google/common/collect/ParametricNullness.java
new file mode 100644
index 0000000..b1cda48
--- /dev/null
+++ b/android/guava/src/com/google/common/collect/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.collect;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/collect/PeekingIterator.java b/android/guava/src/com/google/common/collect/PeekingIterator.java
index 5a6c60b..a274fe4 100644
--- a/android/guava/src/com/google/common/collect/PeekingIterator.java
+++ b/android/guava/src/com/google/common/collect/PeekingIterator.java
@@ -21,6 +21,7 @@
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An iterator that supports a one-element lookahead while iterating.
@@ -34,7 +35,8 @@
  */
 @DoNotMock("Use Iterators.peekingIterator")
 @GwtCompatible
-public interface PeekingIterator<E> extends Iterator<E> {
+@ElementTypesAreNonnullByDefault
+public interface PeekingIterator<E extends @Nullable Object> extends Iterator<E> {
   /**
    * Returns the next element in the iteration, without advancing the iteration.
    *
@@ -44,6 +46,7 @@
    * @throws NoSuchElementException if the iteration has no more elements according to {@link
    *     #hasNext()}
    */
+  @ParametricNullness
   E peek();
 
   /**
@@ -54,6 +57,7 @@
    */
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   E next();
 
   /**
diff --git a/android/guava/src/com/google/common/collect/Platform.java b/android/guava/src/com/google/common/collect/Platform.java
index e4d1c4c..0b18e1f 100644
--- a/android/guava/src/com/google/common/collect/Platform.java
+++ b/android/guava/src/com/google/common/collect/Platform.java
@@ -21,6 +21,7 @@
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Set;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Methods factored out so that they can be emulated differently in GWT.
@@ -28,9 +29,11 @@
  * @author Hayward Chan
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class Platform {
   /** Returns the platform preferred implementation of a map based on a hash table. */
-  static <K, V> Map<K, V> newHashMapWithExpectedSize(int expectedSize) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      Map<K, V> newHashMapWithExpectedSize(int expectedSize) {
     return CompactHashMap.createWithExpectedSize(expectedSize);
   }
 
@@ -38,12 +41,13 @@
    * Returns the platform preferred implementation of an insertion ordered map based on a hash
    * table.
    */
-  static <K, V> Map<K, V> newLinkedHashMapWithExpectedSize(int expectedSize) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      Map<K, V> newLinkedHashMapWithExpectedSize(int expectedSize) {
     return CompactLinkedHashMap.createWithExpectedSize(expectedSize);
   }
 
   /** Returns the platform preferred implementation of a set based on a hash table. */
-  static <E> Set<E> newHashSetWithExpectedSize(int expectedSize) {
+  static <E extends @Nullable Object> Set<E> newHashSetWithExpectedSize(int expectedSize) {
     return CompactHashSet.createWithExpectedSize(expectedSize);
   }
 
@@ -51,7 +55,7 @@
    * Returns the platform preferred implementation of an insertion ordered set based on a hash
    * table.
    */
-  static <E> Set<E> newLinkedHashSetWithExpectedSize(int expectedSize) {
+  static <E extends @Nullable Object> Set<E> newLinkedHashSetWithExpectedSize(int expectedSize) {
     return CompactLinkedHashSet.createWithExpectedSize(expectedSize);
   }
 
@@ -59,7 +63,8 @@
    * Returns the platform preferred map implementation that preserves insertion order when used only
    * for insertions.
    */
-  static <K, V> Map<K, V> preservesInsertionOrderOnPutsMap() {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      Map<K, V> preservesInsertionOrderOnPutsMap() {
     return CompactHashMap.create();
   }
 
@@ -67,7 +72,7 @@
    * Returns the platform preferred set implementation that preserves insertion order when used only
    * for insertions.
    */
-  static <E> Set<E> preservesInsertionOrderOnAddsSet() {
+  static <E extends @Nullable Object> Set<E> preservesInsertionOrderOnAddsSet() {
     return CompactHashSet.create();
   }
 
@@ -77,7 +82,13 @@
    * @param reference any array of the desired type
    * @param length the length of the new array
    */
-  static <T> T[] newArray(T[] reference, int length) {
+  /*
+   * The new array contains nulls, even if the old array did not. If we wanted to be accurate, we
+   * would declare a return type of `@Nullable T[]`. However, we've decided not to think too hard
+   * about arrays for now, as they're a mess. (We previously discussed this in the review of
+   * ObjectArrays, which is the main caller of this method.)
+   */
+  static <T extends @Nullable Object> T[] newArray(T[] reference, int length) {
     Class<?> type = reference.getClass().getComponentType();
 
     // the cast is safe because
@@ -88,7 +99,16 @@
   }
 
   /** Equivalent to Arrays.copyOfRange(source, from, to, arrayOfType.getClass()). */
-  static <T> T[] copy(Object[] source, int from, int to, T[] arrayOfType) {
+  /*
+   * Arrays are a mess from a nullness perspective, and Class instances for object-array types are
+   * even worse. For now, we just suppress and move on with our lives.
+   *
+   * - https://github.com/jspecify/jspecify/issues/65
+   *
+   * - https://github.com/jspecify/jdk/commit/71d826792b8c7ef95d492c50a274deab938f2552
+   */
+  @SuppressWarnings("nullness")
+  static <T extends @Nullable Object> T[] copy(Object[] source, int from, int to, T[] arrayOfType) {
     return Arrays.copyOfRange(source, from, to, (Class<? extends T[]>) arrayOfType.getClass());
   }
 
diff --git a/android/guava/src/com/google/common/collect/Queues.java b/android/guava/src/com/google/common/collect/Queues.java
index fdeb369..6a4dbd2 100644
--- a/android/guava/src/com/google/common/collect/Queues.java
+++ b/android/guava/src/com/google/common/collect/Queues.java
@@ -32,6 +32,7 @@
 import java.util.concurrent.PriorityBlockingQueue;
 import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.TimeUnit;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to {@link Queue} and {@link Deque} instances. Also see this
@@ -41,6 +42,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Queues {
   private Queues() {}
 
@@ -188,7 +190,8 @@
    * Creates an empty {@code PriorityBlockingQueue} with the ordering given by its elements' natural
    * ordering.
    *
-   * @since 11.0 (requires that {@code E} be {@code Comparable} since 15.0).
+   * @since 11.0 (but the bound of {@code E} was changed from {@code Object} to {@code Comparable}
+   *     in 15.0)
    */
   @GwtIncompatible // PriorityBlockingQueue
   public static <E extends Comparable> PriorityBlockingQueue<E> newPriorityBlockingQueue() {
@@ -201,7 +204,8 @@
    * <p><b>Note:</b> If the specified iterable is a {@code SortedSet} or a {@code PriorityQueue},
    * this priority queue will be ordered according to the same ordering.
    *
-   * @since 11.0 (requires that {@code E} be {@code Comparable} since 15.0).
+   * @since 11.0 (but the bound of {@code E} was changed from {@code Object} to {@code Comparable}
+   *     in 15.0)
    */
   @GwtIncompatible // PriorityBlockingQueue
   public static <E extends Comparable> PriorityBlockingQueue<E> newPriorityBlockingQueue(
@@ -220,7 +224,8 @@
    * Creates an empty {@code PriorityQueue} with the ordering given by its elements' natural
    * ordering.
    *
-   * @since 11.0 (requires that {@code E} be {@code Comparable} since 15.0).
+   * @since 11.0 (but the bound of {@code E} was changed from {@code Object} to {@code Comparable}
+   *     in 15.0)
    */
   public static <E extends Comparable> PriorityQueue<E> newPriorityQueue() {
     return new PriorityQueue<E>();
@@ -232,7 +237,8 @@
    * <p><b>Note:</b> If the specified iterable is a {@code SortedSet} or a {@code PriorityQueue},
    * this priority queue will be ordered according to the same ordering.
    *
-   * @since 11.0 (requires that {@code E} be {@code Comparable} since 15.0).
+   * @since 11.0 (but the bound of {@code E} was changed from {@code Object} to {@code Comparable}
+   *     in 15.0)
    */
   public static <E extends Comparable> PriorityQueue<E> newPriorityQueue(
       Iterable<? extends E> elements) {
@@ -385,7 +391,7 @@
    * @return a synchronized view of the specified queue
    * @since 14.0
    */
-  public static <E> Queue<E> synchronizedQueue(Queue<E> queue) {
+  public static <E extends @Nullable Object> Queue<E> synchronizedQueue(Queue<E> queue) {
     return Synchronized.queue(queue, null);
   }
 
@@ -418,7 +424,7 @@
    * @return a synchronized view of the specified deque
    * @since 15.0
    */
-  public static <E> Deque<E> synchronizedDeque(Deque<E> deque) {
+  public static <E extends @Nullable Object> Deque<E> synchronizedDeque(Deque<E> deque) {
     return Synchronized.deque(deque, null);
   }
 }
diff --git a/android/guava/src/com/google/common/collect/Range.java b/android/guava/src/com/google/common/collect/Range.java
index 5300b77..ab5c077 100644
--- a/android/guava/src/com/google/common/collect/Range.java
+++ b/android/guava/src/com/google/common/collect/Range.java
@@ -27,7 +27,7 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A range (or "interval") defines the <i>boundaries</i> around a contiguous span of values of some
@@ -117,6 +117,7 @@
  */
 @GwtCompatible
 @SuppressWarnings("rawtypes")
+@ElementTypesAreNonnullByDefault
 public final class Range<C extends Comparable> extends RangeGwtSerializationDependencies
     implements Predicate<C>, Serializable {
 
@@ -329,7 +330,7 @@
   public static <C extends Comparable<?>> Range<C> encloseAll(Iterable<C> values) {
     checkNotNull(values);
     if (values instanceof SortedSet) {
-      SortedSet<? extends C> set = cast(values);
+      SortedSet<C> set = (SortedSet<C>) values;
       Comparator<?> comparator = set.comparator();
       if (Ordering.natural().equals(comparator) || comparator == null) {
         return closed(set.first(), set.last());
@@ -456,7 +457,7 @@
 
     // this optimizes testing equality of two range-backed sets
     if (values instanceof SortedSet) {
-      SortedSet<? extends C> set = cast(values);
+      SortedSet<? extends C> set = (SortedSet<? extends C>) values;
       Comparator<?> comparator = set.comparator();
       if (Ordering.natural().equals(comparator) || comparator == null) {
         return contains(set.first()) && contains(set.last());
@@ -663,7 +664,7 @@
    * {@code [3..3)}, {@code (3..3]}, {@code (4..4]} are all unequal.
    */
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Range) {
       Range<?> other = (Range<?>) object;
       return lowerBound.equals(other.lowerBound) && upperBound.equals(other.upperBound);
@@ -694,11 +695,6 @@
     return sb.toString();
   }
 
-  /** Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557 */
-  private static <T> SortedSet<T> cast(Iterable<T> iterable) {
-    return (SortedSet<T>) iterable;
-  }
-
   Object readResolve() {
     if (this.equals(ALL)) {
       return all();
diff --git a/android/guava/src/com/google/common/collect/RangeMap.java b/android/guava/src/com/google/common/collect/RangeMap.java
index e6c902e..14adb00 100644
--- a/android/guava/src/com/google/common/collect/RangeMap.java
+++ b/android/guava/src/com/google/common/collect/RangeMap.java
@@ -23,7 +23,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A mapping from disjoint nonempty ranges to non-null values. Queries look up the value associated
@@ -38,21 +38,27 @@
 @Beta
 @DoNotMock("Use ImmutableRangeMap or TreeRangeMap")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface RangeMap<K extends Comparable, V> {
+  /*
+   * TODO(cpovirk): These docs sometimes say "map" and sometimes say "range map." Pick one, or at
+   * least decide on a policy for when to use which.
+   */
+
   /**
    * Returns the value associated with the specified key, or {@code null} if there is no such value.
    *
    * <p>Specifically, if any range in this range map contains the specified key, the value
    * associated with that range is returned.
    */
-  @NullableDecl
+  @CheckForNull
   V get(K key);
 
   /**
    * Returns the range containing this key and its associated value, if such a range is present in
    * the range map, or {@code null} otherwise.
    */
-  @NullableDecl
+  @CheckForNull
   Entry<Range<K>, V> getEntry(K key);
 
   /**
@@ -146,6 +152,7 @@
    * <p>The returned range map will throw an {@link IllegalArgumentException} on an attempt to
    * insert a range not {@linkplain Range#encloses(Range) enclosed} by {@code range}.
    */
+  // TODO(cpovirk): Consider documenting that IAE on the various methods that can throw it.
   RangeMap<K, V> subRangeMap(Range<K> range);
 
   /**
@@ -153,7 +160,7 @@
    * #asMapOfRanges()}.
    */
   @Override
-  boolean equals(@NullableDecl Object o);
+  boolean equals(@CheckForNull Object o);
 
   /** Returns {@code asMapOfRanges().hashCode()}. */
   @Override
diff --git a/android/guava/src/com/google/common/collect/RangeSet.java b/android/guava/src/com/google/common/collect/RangeSet.java
index 06c149c..edb0f79 100644
--- a/android/guava/src/com/google/common/collect/RangeSet.java
+++ b/android/guava/src/com/google/common/collect/RangeSet.java
@@ -19,7 +19,7 @@
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A set comprising zero or more {@linkplain Range#isEmpty nonempty}, {@linkplain
@@ -52,6 +52,7 @@
 @Beta
 @DoNotMock("Use ImmutableRangeSet or TreeRangeSet")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface RangeSet<C extends Comparable> {
 
   // Query methods
@@ -63,6 +64,7 @@
    * Returns the unique range from this range set that {@linkplain Range#contains contains} {@code
    * value}, or {@code null} if this range set does not contain {@code value}.
    */
+  @CheckForNull
   Range<C> rangeContaining(C value);
 
   /**
@@ -246,7 +248,7 @@
    * according to {@link Range#equals(Object)}.
    */
   @Override
-  boolean equals(@NullableDecl Object obj);
+  boolean equals(@CheckForNull Object obj);
 
   /** Returns {@code asRanges().hashCode()}. */
   @Override
diff --git a/android/guava/src/com/google/common/collect/RegularContiguousSet.java b/android/guava/src/com/google/common/collect/RegularContiguousSet.java
index d9a6330..913e2d7 100644
--- a/android/guava/src/com/google/common/collect/RegularContiguousSet.java
+++ b/android/guava/src/com/google/common/collect/RegularContiguousSet.java
@@ -18,12 +18,13 @@
 import static com.google.common.base.Preconditions.checkElementIndex;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.BoundType.CLOSED;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import java.io.Serializable;
 import java.util.Collection;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link ContiguousSet} that contains one or more elements.
@@ -32,6 +33,7 @@
  */
 @GwtCompatible(emulated = true)
 @SuppressWarnings("unchecked") // allow ungenerified Comparable types
+@ElementTypesAreNonnullByDefault
 final class RegularContiguousSet<C extends Comparable> extends ContiguousSet<C> {
   private final Range<C> range;
 
@@ -71,8 +73,9 @@
 
   @GwtIncompatible // not used by GWT emulation
   @Override
-  int indexOf(Object target) {
-    return contains(target) ? (int) domain.distance(first(), (C) target) : -1;
+  int indexOf(@CheckForNull Object target) {
+    // requireNonNull is safe because of the contains check.
+    return contains(target) ? (int) domain.distance(first(), (C) requireNonNull(target)) : -1;
   }
 
   @Override
@@ -81,6 +84,7 @@
       final C last = last();
 
       @Override
+      @CheckForNull
       protected C computeNext(C previous) {
         return equalsOrThrow(previous, last) ? null : domain.next(previous);
       }
@@ -94,13 +98,14 @@
       final C first = first();
 
       @Override
+      @CheckForNull
       protected C computeNext(C previous) {
         return equalsOrThrow(previous, first) ? null : domain.previous(previous);
       }
     };
   }
 
-  private static boolean equalsOrThrow(Comparable<?> left, @NullableDecl Comparable<?> right) {
+  private static boolean equalsOrThrow(Comparable<?> left, @CheckForNull Comparable<?> right) {
     return right != null && Range.compareOrThrow(left, right) == 0;
   }
 
@@ -111,12 +116,14 @@
 
   @Override
   public C first() {
-    return range.lowerBound.leastValueAbove(domain);
+    // requireNonNull is safe because we checked the range is not empty in ContiguousSet.create.
+    return requireNonNull(range.lowerBound.leastValueAbove(domain));
   }
 
   @Override
   public C last() {
-    return range.upperBound.greatestValueBelow(domain);
+    // requireNonNull is safe because we checked the range is not empty in ContiguousSet.create.
+    return requireNonNull(range.upperBound.greatestValueBelow(domain));
   }
 
   @Override
@@ -146,7 +153,7 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object object) {
+  public boolean contains(@CheckForNull Object object) {
     if (object == null) {
       return false;
     }
@@ -195,7 +202,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     } else if (object instanceof RegularContiguousSet) {
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableAsList.java b/android/guava/src/com/google/common/collect/RegularImmutableAsList.java
index 01e5ddd..e344db1 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableAsList.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableAsList.java
@@ -18,6 +18,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An {@link ImmutableAsList} implementation specialized for when the delegate collection is already
@@ -27,6 +29,7 @@
  */
 @GwtCompatible(emulated = true)
 @SuppressWarnings("serial") // uses writeReplace, not default serialization
+@ElementTypesAreNonnullByDefault
 class RegularImmutableAsList<E> extends ImmutableAsList<E> {
   private final ImmutableCollection<E> delegate;
   private final ImmutableList<? extends E> delegateList;
@@ -61,11 +64,13 @@
 
   @GwtIncompatible // not present in emulated superclass
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     return delegateList.copyIntoArray(dst, offset);
   }
 
   @Override
+  @CheckForNull
+  @Nullable
   Object[] internalArray() {
     return delegateList.internalArray();
   }
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java b/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java
index 2bdaf8b..4607477 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableBiMap.java
@@ -18,7 +18,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Bimap with zero or more mappings.
@@ -27,11 +28,12 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+@ElementTypesAreNonnullByDefault
 final class RegularImmutableBiMap<K, V> extends ImmutableBiMap<K, V> {
   static final RegularImmutableBiMap<Object, Object> EMPTY = new RegularImmutableBiMap<>();
 
-  private final transient Object keyHashTable;
-  @VisibleForTesting final transient Object[] alternatingKeysAndValues;
+  @CheckForNull private final transient Object keyHashTable;
+  @VisibleForTesting final transient @Nullable Object[] alternatingKeysAndValues;
   private final transient int keyOffset; // 0 for K-to-V, 1 for V-to-K
   private final transient int size;
   private final transient RegularImmutableBiMap<V, K> inverse;
@@ -47,7 +49,7 @@
   }
 
   /** K-to-V constructor. */
-  RegularImmutableBiMap(Object[] alternatingKeysAndValues, int size) {
+  RegularImmutableBiMap(@Nullable Object[] alternatingKeysAndValues, int size) {
     this.alternatingKeysAndValues = alternatingKeysAndValues;
     this.size = size;
     this.keyOffset = 0;
@@ -62,8 +64,8 @@
 
   /** V-to-K constructor. */
   private RegularImmutableBiMap(
-      Object valueHashTable,
-      Object[] alternatingKeysAndValues,
+      @CheckForNull Object valueHashTable,
+      @Nullable Object[] alternatingKeysAndValues,
       int size,
       RegularImmutableBiMap<V, K> inverse) {
     this.keyHashTable = valueHashTable;
@@ -85,9 +87,19 @@
 
   @SuppressWarnings("unchecked")
   @Override
-  public V get(@NullableDecl Object key) {
-    return (V)
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
+    Object result =
         RegularImmutableMap.get(keyHashTable, alternatingKeysAndValues, size, keyOffset, key);
+    /*
+     * We can't simply cast the result of `RegularImmutableMap.get` to V because of a bug in our
+     * nullness checker (resulting from https://github.com/jspecify/checker-framework/issues/8).
+     */
+    if (result == null) {
+      return null;
+    } else {
+      return (V) result;
+    }
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableList.java b/android/guava/src/com/google/common/collect/RegularImmutableList.java
index 44cbab7..baf1d66 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableList.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableList.java
@@ -17,9 +17,11 @@
 package com.google.common.collect;
 
 import static com.google.common.base.Preconditions.checkElementIndex;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link ImmutableList} backed by a simple array.
@@ -28,13 +30,15 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+@ElementTypesAreNonnullByDefault
 class RegularImmutableList<E> extends ImmutableList<E> {
   static final ImmutableList<Object> EMPTY = new RegularImmutableList<>(new Object[0], 0);
 
-  @VisibleForTesting final transient Object[] array;
+  // The first `size` elements are non-null.
+  @VisibleForTesting final transient @Nullable Object[] array;
   private final transient int size;
 
-  RegularImmutableList(Object[] array, int size) {
+  RegularImmutableList(@Nullable Object[] array, int size) {
     this.array = array;
     this.size = size;
   }
@@ -50,6 +54,7 @@
   }
 
   @Override
+  @Nullable
   Object[] internalArray() {
     return array;
   }
@@ -65,7 +70,7 @@
   }
 
   @Override
-  int copyIntoArray(Object[] dst, int dstOff) {
+  int copyIntoArray(@Nullable Object[] dst, int dstOff) {
     System.arraycopy(array, 0, dst, dstOff, size);
     return dstOff + size;
   }
@@ -75,7 +80,8 @@
   @SuppressWarnings("unchecked")
   public E get(int index) {
     checkElementIndex(index, size);
-    return (E) array[index];
+    // requireNonNull is safe because we guarantee that the first `size` elements are non-null.
+    return (E) requireNonNull(array[index]);
   }
 
   // TODO(lowasser): benchmark optimizations for equals() and see if they're worthwhile
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableMap.java b/android/guava/src/com/google/common/collect/RegularImmutableMap.java
index 4e1681e..d8f9f3b 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableMap.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableMap.java
@@ -19,13 +19,15 @@
 import static com.google.common.base.Preconditions.checkElementIndex;
 import static com.google.common.base.Preconditions.checkPositionIndex;
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import java.util.AbstractMap;
 import java.util.Arrays;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A hash-based implementation of {@link ImmutableMap}.
@@ -33,6 +35,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(serializable = true, emulated = true)
+@ElementTypesAreNonnullByDefault
 final class RegularImmutableMap<K, V> extends ImmutableMap<K, V> {
   private static final byte ABSENT = -1;
 
@@ -64,16 +67,19 @@
    * & (table.length - 1) instead of % table.length, though.
    */
 
-  private final transient Object hashTable;
-  @VisibleForTesting final transient Object[] alternatingKeysAndValues;
+  @CheckForNull private final transient Object hashTable;
+  @VisibleForTesting final transient @Nullable Object[] alternatingKeysAndValues;
   private final transient int size;
 
   @SuppressWarnings("unchecked")
-  static <K, V> RegularImmutableMap<K, V> create(int n, Object[] alternatingKeysAndValues) {
+  static <K, V> RegularImmutableMap<K, V> create(
+      int n, @Nullable Object[] alternatingKeysAndValues) {
     if (n == 0) {
       return (RegularImmutableMap<K, V>) EMPTY;
     } else if (n == 1) {
-      checkEntryNotNull(alternatingKeysAndValues[0], alternatingKeysAndValues[1]);
+      // requireNonNull is safe because the first `2*n` elements have been filled in.
+      checkEntryNotNull(
+          requireNonNull(alternatingKeysAndValues[0]), requireNonNull(alternatingKeysAndValues[1]));
       return new RegularImmutableMap<K, V>(null, alternatingKeysAndValues, 1);
     }
     checkPositionIndex(n, alternatingKeysAndValues.length >> 1);
@@ -86,12 +92,15 @@
    * Returns a hash table for the specified keys and values, and ensures that neither keys nor
    * values are null.
    */
+  @CheckForNull
   static Object createHashTable(
-      Object[] alternatingKeysAndValues, int n, int tableSize, int keyOffset) {
+      @Nullable Object[] alternatingKeysAndValues, int n, int tableSize, int keyOffset) {
     if (n == 1) {
       // for n=1 we don't create a hash table, but we need to do the checkEntryNotNull check!
+      // requireNonNull is safe because the first `2*n` elements have been filled in.
       checkEntryNotNull(
-          alternatingKeysAndValues[keyOffset], alternatingKeysAndValues[keyOffset ^ 1]);
+          requireNonNull(alternatingKeysAndValues[keyOffset]),
+          requireNonNull(alternatingKeysAndValues[keyOffset ^ 1]));
       return null;
     }
     int mask = tableSize - 1;
@@ -107,8 +116,9 @@
 
       for (int i = 0; i < n; i++) {
         int keyIndex = 2 * i + keyOffset;
-        Object key = alternatingKeysAndValues[keyIndex];
-        Object value = alternatingKeysAndValues[keyIndex ^ 1];
+        // requireNonNull is safe because the first `2*n` elements have been filled in.
+        Object key = requireNonNull(alternatingKeysAndValues[keyIndex]);
+        Object value = requireNonNull(alternatingKeysAndValues[keyIndex ^ 1]);
         checkEntryNotNull(key, value);
         for (int h = Hashing.smear(key.hashCode()); ; h++) {
           h &= mask;
@@ -116,7 +126,7 @@
           if (previousKeyIndex == BYTE_MASK) { // -1 signed becomes 255 unsigned
             hashTable[h] = (byte) keyIndex;
             break;
-          } else if (alternatingKeysAndValues[previousKeyIndex].equals(key)) {
+          } else if (key.equals(alternatingKeysAndValues[previousKeyIndex])) {
             throw duplicateKeyException(key, value, alternatingKeysAndValues, previousKeyIndex);
           }
         }
@@ -134,8 +144,9 @@
 
       for (int i = 0; i < n; i++) {
         int keyIndex = 2 * i + keyOffset;
-        Object key = alternatingKeysAndValues[keyIndex];
-        Object value = alternatingKeysAndValues[keyIndex ^ 1];
+        // requireNonNull is safe because the first `2*n` elements have been filled in.
+        Object key = requireNonNull(alternatingKeysAndValues[keyIndex]);
+        Object value = requireNonNull(alternatingKeysAndValues[keyIndex ^ 1]);
         checkEntryNotNull(key, value);
         for (int h = Hashing.smear(key.hashCode()); ; h++) {
           h &= mask;
@@ -143,7 +154,7 @@
           if (previousKeyIndex == SHORT_MASK) { // -1 signed becomes 65_535 unsigned
             hashTable[h] = (short) keyIndex;
             break;
-          } else if (alternatingKeysAndValues[previousKeyIndex].equals(key)) {
+          } else if (key.equals(alternatingKeysAndValues[previousKeyIndex])) {
             throw duplicateKeyException(key, value, alternatingKeysAndValues, previousKeyIndex);
           }
         }
@@ -158,8 +169,9 @@
 
       for (int i = 0; i < n; i++) {
         int keyIndex = 2 * i + keyOffset;
-        Object key = alternatingKeysAndValues[keyIndex];
-        Object value = alternatingKeysAndValues[keyIndex ^ 1];
+        // requireNonNull is safe because the first `2*n` elements have been filled in.
+        Object key = requireNonNull(alternatingKeysAndValues[keyIndex]);
+        Object value = requireNonNull(alternatingKeysAndValues[keyIndex ^ 1]);
         checkEntryNotNull(key, value);
         for (int h = Hashing.smear(key.hashCode()); ; h++) {
           h &= mask;
@@ -167,7 +179,7 @@
           if (previousKeyIndex == ABSENT) {
             hashTable[h] = keyIndex;
             break;
-          } else if (alternatingKeysAndValues[previousKeyIndex].equals(key)) {
+          } else if (key.equals(alternatingKeysAndValues[previousKeyIndex])) {
             throw duplicateKeyException(key, value, alternatingKeysAndValues, previousKeyIndex);
           }
         }
@@ -177,7 +189,7 @@
   }
 
   private static IllegalArgumentException duplicateKeyException(
-      Object key, Object value, Object[] alternatingKeysAndValues, int previousKeyIndex) {
+      Object key, Object value, @Nullable Object[] alternatingKeysAndValues, int previousKeyIndex) {
     return new IllegalArgumentException(
         "Multiple entries with same key: "
             + key
@@ -189,7 +201,8 @@
             + alternatingKeysAndValues[previousKeyIndex ^ 1]);
   }
 
-  private RegularImmutableMap(Object hashTable, Object[] alternatingKeysAndValues, int size) {
+  private RegularImmutableMap(
+      @CheckForNull Object hashTable, @Nullable Object[] alternatingKeysAndValues, int size) {
     this.hashTable = hashTable;
     this.alternatingKeysAndValues = alternatingKeysAndValues;
     this.size = size;
@@ -202,22 +215,33 @@
 
   @SuppressWarnings("unchecked")
   @Override
-  @NullableDecl
-  public V get(@NullableDecl Object key) {
-    return (V) get(hashTable, alternatingKeysAndValues, size, 0, key);
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
+    Object result = get(hashTable, alternatingKeysAndValues, size, 0, key);
+    /*
+     * We can't simply cast the result of `RegularImmutableMap.get` to V because of a bug in our
+     * nullness checker (resulting from https://github.com/jspecify/checker-framework/issues/8).
+     */
+    if (result == null) {
+      return null;
+    } else {
+      return (V) result;
+    }
   }
 
+  @CheckForNull
   static Object get(
-      @NullableDecl Object hashTableObject,
-      @NullableDecl Object[] alternatingKeysAndValues,
+      @CheckForNull Object hashTableObject,
+      @Nullable Object[] alternatingKeysAndValues,
       int size,
       int keyOffset,
-      @NullableDecl Object key) {
+      @CheckForNull Object key) {
     if (key == null) {
       return null;
     } else if (size == 1) {
-      return alternatingKeysAndValues[keyOffset].equals(key)
-          ? alternatingKeysAndValues[keyOffset ^ 1]
+      // requireNonNull is safe because the first 2 elements have been filled in.
+      return requireNonNull(alternatingKeysAndValues[keyOffset]).equals(key)
+          ? requireNonNull(alternatingKeysAndValues[keyOffset ^ 1])
           : null;
     } else if (hashTableObject == null) {
       return null;
@@ -230,7 +254,7 @@
         int keyIndex = hashTable[h] & BYTE_MASK; // unsigned read
         if (keyIndex == BYTE_MASK) { // -1 signed becomes 255 unsigned
           return null;
-        } else if (alternatingKeysAndValues[keyIndex].equals(key)) {
+        } else if (key.equals(alternatingKeysAndValues[keyIndex])) {
           return alternatingKeysAndValues[keyIndex ^ 1];
         }
       }
@@ -242,7 +266,7 @@
         int keyIndex = hashTable[h] & SHORT_MASK; // unsigned read
         if (keyIndex == SHORT_MASK) { // -1 signed becomes 65_535 unsigned
           return null;
-        } else if (alternatingKeysAndValues[keyIndex].equals(key)) {
+        } else if (key.equals(alternatingKeysAndValues[keyIndex])) {
           return alternatingKeysAndValues[keyIndex ^ 1];
         }
       }
@@ -254,7 +278,7 @@
         int keyIndex = hashTable[h];
         if (keyIndex == ABSENT) {
           return null;
-        } else if (alternatingKeysAndValues[keyIndex].equals(key)) {
+        } else if (key.equals(alternatingKeysAndValues[keyIndex])) {
           return alternatingKeysAndValues[keyIndex ^ 1];
         }
       }
@@ -268,11 +292,15 @@
 
   static class EntrySet<K, V> extends ImmutableSet<Entry<K, V>> {
     private final transient ImmutableMap<K, V> map;
-    private final transient Object[] alternatingKeysAndValues;
+    private final transient @Nullable Object[] alternatingKeysAndValues;
     private final transient int keyOffset;
     private final transient int size;
 
-    EntrySet(ImmutableMap<K, V> map, Object[] alternatingKeysAndValues, int keyOffset, int size) {
+    EntrySet(
+        ImmutableMap<K, V> map,
+        @Nullable Object[] alternatingKeysAndValues,
+        int keyOffset,
+        int size) {
       this.map = map;
       this.alternatingKeysAndValues = alternatingKeysAndValues;
       this.keyOffset = keyOffset;
@@ -295,10 +323,14 @@
         @Override
         public Entry<K, V> get(int index) {
           checkElementIndex(index, size);
+          /*
+           * requireNonNull is safe because the first `2*(size+keyOffset)` elements have been filled
+           * in.
+           */
           @SuppressWarnings("unchecked")
-          K key = (K) alternatingKeysAndValues[2 * index + keyOffset];
+          K key = (K) requireNonNull(alternatingKeysAndValues[2 * index + keyOffset]);
           @SuppressWarnings("unchecked")
-          V value = (V) alternatingKeysAndValues[2 * index + (keyOffset ^ 1)];
+          V value = (V) requireNonNull(alternatingKeysAndValues[2 * index + (keyOffset ^ 1)]);
           return new AbstractMap.SimpleImmutableEntry<K, V>(key, value);
         }
 
@@ -315,7 +347,7 @@
     }
 
     @Override
-    public boolean contains(Object object) {
+    public boolean contains(@CheckForNull Object object) {
       if (object instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) object;
         Object k = entry.getKey();
@@ -345,11 +377,11 @@
   }
 
   static final class KeysOrValuesAsList extends ImmutableList<Object> {
-    private final transient Object[] alternatingKeysAndValues;
+    private final transient @Nullable Object[] alternatingKeysAndValues;
     private final transient int offset;
     private final transient int size;
 
-    KeysOrValuesAsList(Object[] alternatingKeysAndValues, int offset, int size) {
+    KeysOrValuesAsList(@Nullable Object[] alternatingKeysAndValues, int offset, int size) {
       this.alternatingKeysAndValues = alternatingKeysAndValues;
       this.offset = offset;
       this.size = size;
@@ -358,7 +390,8 @@
     @Override
     public Object get(int index) {
       checkElementIndex(index, size);
-      return alternatingKeysAndValues[2 * index + offset];
+      // requireNonNull is safe because the first `2*(size+offset)` elements have been filled in.
+      return requireNonNull(alternatingKeysAndValues[2 * index + offset]);
     }
 
     @Override
@@ -397,7 +430,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object object) {
+    public boolean contains(@CheckForNull Object object) {
       return map.get(object) != null;
     }
 
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableMultiset.java b/android/guava/src/com/google/common/collect/RegularImmutableMultiset.java
index 3beec6f..6fbc099 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableMultiset.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableMultiset.java
@@ -21,7 +21,7 @@
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@link ImmutableMultiset} with zero or more elements.
@@ -31,6 +31,7 @@
  */
 @GwtCompatible(emulated = true, serializable = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+@ElementTypesAreNonnullByDefault
 class RegularImmutableMultiset<E> extends ImmutableMultiset<E> {
   static final RegularImmutableMultiset<Object> EMPTY =
       new RegularImmutableMultiset<>(ObjectCountHashMap.create());
@@ -38,7 +39,7 @@
   final transient ObjectCountHashMap<E> contents;
   private final transient int size;
 
-  @LazyInit private transient ImmutableSet<E> elementSet;
+  @LazyInit @CheckForNull private transient ImmutableSet<E> elementSet;
 
   RegularImmutableMultiset(ObjectCountHashMap<E> contents) {
     this.contents = contents;
@@ -55,7 +56,7 @@
   }
 
   @Override
-  public int count(@NullableDecl Object element) {
+  public int count(@CheckForNull Object element) {
     return contents.get(element);
   }
 
@@ -79,7 +80,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object object) {
+    public boolean contains(@CheckForNull Object object) {
       return RegularImmutableMultiset.this.contains(object);
     }
 
@@ -104,12 +105,13 @@
     final Object[] elements;
     final int[] counts;
 
-    SerializedForm(Multiset<?> multiset) {
+    // "extends Object" works around https://github.com/typetools/checker-framework/issues/3013
+    SerializedForm(Multiset<? extends Object> multiset) {
       int distinct = multiset.entrySet().size();
       elements = new Object[distinct];
       counts = new int[distinct];
       int i = 0;
-      for (Entry<?> entry : multiset.entrySet()) {
+      for (Entry<? extends Object> entry : multiset.entrySet()) {
         elements[i] = entry.getElement();
         counts[i] = entry.getCount();
         i++;
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableSet.java b/android/guava/src/com/google/common/collect/RegularImmutableSet.java
index b7202f8..2382ef6 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableSet.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableSet.java
@@ -18,7 +18,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link ImmutableSet} with two or more elements.
@@ -27,30 +28,34 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+@ElementTypesAreNonnullByDefault
 final class RegularImmutableSet<E> extends ImmutableSet<E> {
+  private static final Object[] EMPTY_ARRAY = new Object[0];
   static final RegularImmutableSet<Object> EMPTY =
-      new RegularImmutableSet<>(new Object[0], 0, null, 0, 0);
+      new RegularImmutableSet<>(EMPTY_ARRAY, 0, EMPTY_ARRAY, 0, 0);
 
-  @VisibleForTesting final transient Object[] elements;
-  // the same elements in hashed positions (plus nulls)
-  @VisibleForTesting final transient Object[] table;
+  // The first `size` elements are non-null.
+  @VisibleForTesting final transient @Nullable Object[] elements;
+  private final transient int hashCode;
+  // the same values as `elements` in hashed positions (plus nulls)
+  @VisibleForTesting final transient @Nullable Object[] table;
   // 'and' with an int to get a valid table index.
   private final transient int mask;
-  private final transient int hashCode;
   private final transient int size;
 
-  RegularImmutableSet(Object[] elements, int hashCode, Object[] table, int mask, int size) {
+  RegularImmutableSet(
+      @Nullable Object[] elements, int hashCode, @Nullable Object[] table, int mask, int size) {
     this.elements = elements;
+    this.hashCode = hashCode;
     this.table = table;
     this.mask = mask;
-    this.hashCode = hashCode;
     this.size = size;
   }
 
   @Override
-  public boolean contains(@NullableDecl Object target) {
-    Object[] table = this.table;
-    if (target == null || table == null) {
+  public boolean contains(@CheckForNull Object target) {
+    @Nullable Object[] table = this.table;
+    if (target == null || table.length == 0) {
       return false;
     }
     for (int i = Hashing.smearedHash(target); ; i++) {
@@ -75,6 +80,7 @@
   }
 
   @Override
+  @Nullable
   Object[] internalArray() {
     return elements;
   }
@@ -90,7 +96,7 @@
   }
 
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     System.arraycopy(elements, 0, dst, offset, size);
     return offset + size;
   }
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableSortedMultiset.java b/android/guava/src/com/google/common/collect/RegularImmutableSortedMultiset.java
index c1d739f..3b6d79c 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableSortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableSortedMultiset.java
@@ -22,7 +22,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.primitives.Ints;
 import java.util.Comparator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable sorted multiset with one or more distinct elements.
@@ -31,6 +31,7 @@
  */
 @SuppressWarnings("serial") // uses writeReplace, not default serialization
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class RegularImmutableSortedMultiset<E> extends ImmutableSortedMultiset<E> {
   private static final long[] ZERO_CUMULATIVE_COUNTS = {0};
 
@@ -67,17 +68,19 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     return isEmpty() ? null : getEntry(0);
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     return isEmpty() ? null : getEntry(length - 1);
   }
 
   @Override
-  public int count(@NullableDecl Object element) {
+  public int count(@CheckForNull Object element) {
     int index = elementSet.indexOf(element);
     return (index >= 0) ? getCount(index) : 0;
   }
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableSortedSet.java b/android/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
index d70d8fb..dd98798 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
@@ -27,7 +27,8 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An immutable sorted set with one or more elements. TODO(jlevy): Consider separate class for a
@@ -38,6 +39,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings({"serial", "rawtypes"})
+@ElementTypesAreNonnullByDefault
 final class RegularImmutableSortedSet<E> extends ImmutableSortedSet<E> {
   static final RegularImmutableSortedSet<Comparable> NATURAL_EMPTY_SET =
       new RegularImmutableSortedSet<>(ImmutableList.<Comparable>of(), Ordering.natural());
@@ -50,6 +52,8 @@
   }
 
   @Override
+  @CheckForNull
+  @Nullable
   Object[] internalArray() {
     return elements.internalArray();
   }
@@ -81,7 +85,7 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object o) {
+  public boolean contains(@CheckForNull Object o) {
     try {
       return o != null && unsafeBinarySearch(o) >= 0;
     } catch (ClassCastException e) {
@@ -156,7 +160,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
@@ -209,24 +213,28 @@
   }
 
   @Override
+  @CheckForNull
   public E lower(E element) {
     int index = headIndex(element, false) - 1;
     return (index == -1) ? null : elements.get(index);
   }
 
   @Override
+  @CheckForNull
   public E floor(E element) {
     int index = headIndex(element, true) - 1;
     return (index == -1) ? null : elements.get(index);
   }
 
   @Override
+  @CheckForNull
   public E ceiling(E element) {
     int index = tailIndex(element, true);
     return (index == size()) ? null : elements.get(index);
   }
 
   @Override
+  @CheckForNull
   public E higher(E element) {
     int index = tailIndex(element, false);
     return (index == size()) ? null : elements.get(index);
@@ -286,7 +294,7 @@
   }
 
   @Override
-  int indexOf(@NullableDecl Object target) {
+  int indexOf(@CheckForNull Object target) {
     if (target == null) {
       return -1;
     }
diff --git a/android/guava/src/com/google/common/collect/RegularImmutableTable.java b/android/guava/src/com/google/common/collect/RegularImmutableTable.java
index 6c35ee4..24434c5 100644
--- a/android/guava/src/com/google/common/collect/RegularImmutableTable.java
+++ b/android/guava/src/com/google/common/collect/RegularImmutableTable.java
@@ -24,7 +24,7 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link ImmutableTable} holding an arbitrary number of cells.
@@ -32,6 +32,7 @@
  * @author Gregory Kick
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 abstract class RegularImmutableTable<R, C, V> extends ImmutableTable<R, C, V> {
   RegularImmutableTable() {}
 
@@ -55,7 +56,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object object) {
+    public boolean contains(@CheckForNull Object object) {
       if (object instanceof Cell) {
         Cell<?, ?, ?> cell = (Cell<?, ?, ?>) object;
         Object value = RegularImmutableTable.this.get(cell.getRowKey(), cell.getColumnKey());
@@ -97,8 +98,8 @@
 
   static <R, C, V> RegularImmutableTable<R, C, V> forCells(
       List<Cell<R, C, V>> cells,
-      @NullableDecl final Comparator<? super R> rowComparator,
-      @NullableDecl final Comparator<? super C> columnComparator) {
+      @CheckForNull final Comparator<? super R> rowComparator,
+      @CheckForNull final Comparator<? super C> columnComparator) {
     checkNotNull(cells);
     if (rowComparator != null || columnComparator != null) {
       /*
@@ -135,8 +136,8 @@
 
   private static <R, C, V> RegularImmutableTable<R, C, V> forCellsInternal(
       Iterable<Cell<R, C, V>> cells,
-      @NullableDecl Comparator<? super R> rowComparator,
-      @NullableDecl Comparator<? super C> columnComparator) {
+      @CheckForNull Comparator<? super R> rowComparator,
+      @CheckForNull Comparator<? super C> columnComparator) {
     Set<R> rowSpaceBuilder = new LinkedHashSet<>();
     Set<C> columnSpaceBuilder = new LinkedHashSet<>();
     ImmutableList<Cell<R, C, V>> cellList = ImmutableList.copyOf(cells);
@@ -174,7 +175,7 @@
    * We could have declared this method 'static' but the additional compile-time checks achieved by
    * referencing the type variables seem worthwhile.
    */
-  final void checkNoDuplicate(R rowKey, C columnKey, V existingValue, V newValue) {
+  final void checkNoDuplicate(R rowKey, C columnKey, @CheckForNull V existingValue, V newValue) {
     checkArgument(
         existingValue == null,
         "Duplicate key: (row=%s, column=%s), values: [%s, %s].",
diff --git a/android/guava/src/com/google/common/collect/ReverseNaturalOrdering.java b/android/guava/src/com/google/common/collect/ReverseNaturalOrdering.java
index 612d846..f0c40cb 100644
--- a/android/guava/src/com/google/common/collect/ReverseNaturalOrdering.java
+++ b/android/guava/src/com/google/common/collect/ReverseNaturalOrdering.java
@@ -25,63 +25,64 @@
 /** An ordering that uses the reverse of the natural order of the values. */
 @GwtCompatible(serializable = true)
 @SuppressWarnings({"unchecked", "rawtypes"}) // TODO(kevinb): the right way to explain this??
-final class ReverseNaturalOrdering extends Ordering<Comparable> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class ReverseNaturalOrdering extends Ordering<Comparable<?>> implements Serializable {
   static final ReverseNaturalOrdering INSTANCE = new ReverseNaturalOrdering();
 
   @Override
-  public int compare(Comparable left, Comparable right) {
+  public int compare(Comparable<?> left, Comparable<?> right) {
     checkNotNull(left); // right null is caught later
     if (left == right) {
       return 0;
     }
 
-    return right.compareTo(left);
+    return ((Comparable<Object>) right).compareTo(left);
   }
 
   @Override
-  public <S extends Comparable> Ordering<S> reverse() {
+  public <S extends Comparable<?>> Ordering<S> reverse() {
     return Ordering.natural();
   }
 
   // Override the min/max methods to "hoist" delegation outside loops
 
   @Override
-  public <E extends Comparable> E min(E a, E b) {
+  public <E extends Comparable<?>> E min(E a, E b) {
     return NaturalOrdering.INSTANCE.max(a, b);
   }
 
   @Override
-  public <E extends Comparable> E min(E a, E b, E c, E... rest) {
+  public <E extends Comparable<?>> E min(E a, E b, E c, E... rest) {
     return NaturalOrdering.INSTANCE.max(a, b, c, rest);
   }
 
   @Override
-  public <E extends Comparable> E min(Iterator<E> iterator) {
+  public <E extends Comparable<?>> E min(Iterator<E> iterator) {
     return NaturalOrdering.INSTANCE.max(iterator);
   }
 
   @Override
-  public <E extends Comparable> E min(Iterable<E> iterable) {
+  public <E extends Comparable<?>> E min(Iterable<E> iterable) {
     return NaturalOrdering.INSTANCE.max(iterable);
   }
 
   @Override
-  public <E extends Comparable> E max(E a, E b) {
+  public <E extends Comparable<?>> E max(E a, E b) {
     return NaturalOrdering.INSTANCE.min(a, b);
   }
 
   @Override
-  public <E extends Comparable> E max(E a, E b, E c, E... rest) {
+  public <E extends Comparable<?>> E max(E a, E b, E c, E... rest) {
     return NaturalOrdering.INSTANCE.min(a, b, c, rest);
   }
 
   @Override
-  public <E extends Comparable> E max(Iterator<E> iterator) {
+  public <E extends Comparable<?>> E max(Iterator<E> iterator) {
     return NaturalOrdering.INSTANCE.min(iterator);
   }
 
   @Override
-  public <E extends Comparable> E max(Iterable<E> iterable) {
+  public <E extends Comparable<?>> E max(Iterable<E> iterable) {
     return NaturalOrdering.INSTANCE.min(iterable);
   }
 
diff --git a/android/guava/src/com/google/common/collect/ReverseOrdering.java b/android/guava/src/com/google/common/collect/ReverseOrdering.java
index 9f65e59..6c1e74d 100644
--- a/android/guava/src/com/google/common/collect/ReverseOrdering.java
+++ b/android/guava/src/com/google/common/collect/ReverseOrdering.java
@@ -21,11 +21,14 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering that uses the reverse of a given order. */
 @GwtCompatible(serializable = true)
-final class ReverseOrdering<T> extends Ordering<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class ReverseOrdering<T extends @Nullable Object> extends Ordering<T>
+    implements Serializable {
   final Ordering<? super T> forwardOrder;
 
   ReverseOrdering(Ordering<? super T> forwardOrder) {
@@ -33,7 +36,7 @@
   }
 
   @Override
-  public int compare(T a, T b) {
+  public int compare(@ParametricNullness T a, @ParametricNullness T b) {
     return forwardOrder.compare(b, a);
   }
 
@@ -46,12 +49,13 @@
   // Override the min/max methods to "hoist" delegation outside loops
 
   @Override
-  public <E extends T> E min(E a, E b) {
+  public <E extends T> E min(@ParametricNullness E a, @ParametricNullness E b) {
     return forwardOrder.max(a, b);
   }
 
   @Override
-  public <E extends T> E min(E a, E b, E c, E... rest) {
+  public <E extends T> E min(
+      @ParametricNullness E a, @ParametricNullness E b, @ParametricNullness E c, E... rest) {
     return forwardOrder.max(a, b, c, rest);
   }
 
@@ -66,12 +70,13 @@
   }
 
   @Override
-  public <E extends T> E max(E a, E b) {
+  public <E extends T> E max(@ParametricNullness E a, @ParametricNullness E b) {
     return forwardOrder.min(a, b);
   }
 
   @Override
-  public <E extends T> E max(E a, E b, E c, E... rest) {
+  public <E extends T> E max(
+      @ParametricNullness E a, @ParametricNullness E b, @ParametricNullness E c, E... rest) {
     return forwardOrder.min(a, b, c, rest);
   }
 
@@ -91,7 +96,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/collect/RowSortedTable.java b/android/guava/src/com/google/common/collect/RowSortedTable.java
index 9cdae79..2c2d773 100644
--- a/android/guava/src/com/google/common/collect/RowSortedTable.java
+++ b/android/guava/src/com/google/common/collect/RowSortedTable.java
@@ -21,6 +21,7 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Interface that extends {@code Table} and whose rows are sorted.
@@ -33,7 +34,10 @@
  * @since 8.0
  */
 @GwtCompatible
-public interface RowSortedTable<R, C, V> extends Table<R, C, V> {
+@ElementTypesAreNonnullByDefault
+public interface RowSortedTable<
+        R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+    extends Table<R, C, V> {
   /**
    * {@inheritDoc}
    *
diff --git a/android/guava/src/com/google/common/collect/Serialization.java b/android/guava/src/com/google/common/collect/Serialization.java
index 929a48f..5e88067 100644
--- a/android/guava/src/com/google/common/collect/Serialization.java
+++ b/android/guava/src/com/google/common/collect/Serialization.java
@@ -23,6 +23,7 @@
 import java.lang.reflect.Field;
 import java.util.Collection;
 import java.util.Map;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides static methods for serializing collection classes.
@@ -33,6 +34,7 @@
  * @author Jared Levy
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class Serialization {
   private Serialization() {}
 
@@ -54,7 +56,8 @@
    * <p>The serialized output consists of the number of entries, first key, first value, second key,
    * second value, and so on.
    */
-  static <K, V> void writeMap(Map<K, V> map, ObjectOutputStream stream) throws IOException {
+  static <K extends @Nullable Object, V extends @Nullable Object> void writeMap(
+      Map<K, V> map, ObjectOutputStream stream) throws IOException {
     stream.writeInt(map.size());
     for (Map.Entry<K, V> entry : map.entrySet()) {
       stream.writeObject(entry.getKey());
@@ -66,8 +69,8 @@
    * Populates a map by reading an input stream, as part of deserialization. See {@link #writeMap}
    * for the data format.
    */
-  static <K, V> void populateMap(Map<K, V> map, ObjectInputStream stream)
-      throws IOException, ClassNotFoundException {
+  static <K extends @Nullable Object, V extends @Nullable Object> void populateMap(
+      Map<K, V> map, ObjectInputStream stream) throws IOException, ClassNotFoundException {
     int size = stream.readInt();
     populateMap(map, stream, size);
   }
@@ -76,7 +79,8 @@
    * Populates a map by reading an input stream, as part of deserialization. See {@link #writeMap}
    * for the data format. The size is determined by a prior call to {@link #readCount}.
    */
-  static <K, V> void populateMap(Map<K, V> map, ObjectInputStream stream, int size)
+  static <K extends @Nullable Object, V extends @Nullable Object> void populateMap(
+      Map<K, V> map, ObjectInputStream stream, int size)
       throws IOException, ClassNotFoundException {
     for (int i = 0; i < size; i++) {
       @SuppressWarnings("unchecked") // reading data stored by writeMap
@@ -94,8 +98,8 @@
    * <p>The serialized output consists of the number of distinct elements, the first element, its
    * count, the second element, its count, and so on.
    */
-  static <E> void writeMultiset(Multiset<E> multiset, ObjectOutputStream stream)
-      throws IOException {
+  static <E extends @Nullable Object> void writeMultiset(
+      Multiset<E> multiset, ObjectOutputStream stream) throws IOException {
     int entryCount = multiset.entrySet().size();
     stream.writeInt(entryCount);
     for (Multiset.Entry<E> entry : multiset.entrySet()) {
@@ -108,8 +112,8 @@
    * Populates a multiset by reading an input stream, as part of deserialization. See {@link
    * #writeMultiset} for the data format.
    */
-  static <E> void populateMultiset(Multiset<E> multiset, ObjectInputStream stream)
-      throws IOException, ClassNotFoundException {
+  static <E extends @Nullable Object> void populateMultiset(
+      Multiset<E> multiset, ObjectInputStream stream) throws IOException, ClassNotFoundException {
     int distinctElements = stream.readInt();
     populateMultiset(multiset, stream, distinctElements);
   }
@@ -119,7 +123,7 @@
    * #writeMultiset} for the data format. The number of distinct elements is determined by a prior
    * call to {@link #readCount}.
    */
-  static <E> void populateMultiset(
+  static <E extends @Nullable Object> void populateMultiset(
       Multiset<E> multiset, ObjectInputStream stream, int distinctElements)
       throws IOException, ClassNotFoundException {
     for (int i = 0; i < distinctElements; i++) {
@@ -138,8 +142,8 @@
    * <p>The serialized output consists of the number of distinct keys, and then for each distinct
    * key: the key, the number of values for that key, and the key's values.
    */
-  static <K, V> void writeMultimap(Multimap<K, V> multimap, ObjectOutputStream stream)
-      throws IOException {
+  static <K extends @Nullable Object, V extends @Nullable Object> void writeMultimap(
+      Multimap<K, V> multimap, ObjectOutputStream stream) throws IOException {
     stream.writeInt(multimap.asMap().size());
     for (Map.Entry<K, Collection<V>> entry : multimap.asMap().entrySet()) {
       stream.writeObject(entry.getKey());
@@ -154,7 +158,8 @@
    * Populates a multimap by reading an input stream, as part of deserialization. See {@link
    * #writeMultimap} for the data format.
    */
-  static <K, V> void populateMultimap(Multimap<K, V> multimap, ObjectInputStream stream)
+  static <K extends @Nullable Object, V extends @Nullable Object> void populateMultimap(
+      Multimap<K, V> multimap, ObjectInputStream stream)
       throws IOException, ClassNotFoundException {
     int distinctKeys = stream.readInt();
     populateMultimap(multimap, stream, distinctKeys);
@@ -165,7 +170,7 @@
    * #writeMultimap} for the data format. The number of distinct keys is determined by a prior call
    * to {@link #readCount}.
    */
-  static <K, V> void populateMultimap(
+  static <K extends @Nullable Object, V extends @Nullable Object> void populateMultimap(
       Multimap<K, V> multimap, ObjectInputStream stream, int distinctKeys)
       throws IOException, ClassNotFoundException {
     for (int i = 0; i < distinctKeys; i++) {
diff --git a/android/guava/src/com/google/common/collect/SetMultimap.java b/android/guava/src/com/google/common/collect/SetMultimap.java
index f2c6b57..216533e 100644
--- a/android/guava/src/com/google/common/collect/SetMultimap.java
+++ b/android/guava/src/com/google/common/collect/SetMultimap.java
@@ -22,7 +22,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@code Multimap} that cannot hold duplicate key-value pairs. Adding a key-value pair that's
@@ -41,6 +42,9 @@
  * {@code equals} comparisons. Use caution if mutable objects are used as keys or values in a {@code
  * SetMultimap}.
  *
+ * <p><b>Warning:</b> Do not modify either a key <i>or a value</i> of a {@code SetMultimap} in a way
+ * that affects its {@link Object#equals} behavior. Undefined behavior and bugs will result.
+ *
  * <p>See the Guava User Guide article on <a href=
  * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
  * Multimap}</a>.
@@ -49,7 +53,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public interface SetMultimap<K, V> extends Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface SetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends Multimap<K, V> {
   /**
    * {@inheritDoc}
    *
@@ -58,7 +64,7 @@
    * interface.
    */
   @Override
-  Set<V> get(@NullableDecl K key);
+  Set<V> get(@ParametricNullness K key);
 
   /**
    * {@inheritDoc}
@@ -69,7 +75,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  Set<V> removeAll(@NullableDecl Object key);
+  Set<V> removeAll(@CheckForNull Object key);
 
   /**
    * {@inheritDoc}
@@ -82,7 +88,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  Set<V> replaceValues(K key, Iterable<? extends V> values);
+  Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values);
 
   /**
    * {@inheritDoc}
@@ -114,5 +120,5 @@
    * empty {@code ListMultimap}.
    */
   @Override
-  boolean equals(@NullableDecl Object obj);
+  boolean equals(@CheckForNull Object obj);
 }
diff --git a/android/guava/src/com/google/common/collect/Sets.java b/android/guava/src/com/google/common/collect/Sets.java
index 3fe27ba..dde21cb 100644
--- a/android/guava/src/com/google/common/collect/Sets.java
+++ b/android/guava/src/com/google/common/collect/Sets.java
@@ -28,6 +28,7 @@
 import com.google.common.collect.Collections2.FilteredCollection;
 import com.google.common.math.IntMath;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import java.io.Serializable;
 import java.util.AbstractSet;
 import java.util.Arrays;
@@ -48,7 +49,8 @@
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArraySet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to {@link Set} instances. Also see this class's counterparts
@@ -63,6 +65,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Sets {
   private Sets() {}
 
@@ -70,7 +73,7 @@
    * {@link AbstractSet} substitute without the potentially-quadratic {@code removeAll}
    * implementation.
    */
-  abstract static class ImprovedAbstractSet<E> extends AbstractSet<E> {
+  abstract static class ImprovedAbstractSet<E extends @Nullable Object> extends AbstractSet<E> {
     @Override
     public boolean removeAll(Collection<?> c) {
       return removeAllImpl(this, c);
@@ -160,7 +163,7 @@
    * deprecated. Instead, use the {@code HashSet} constructor directly, taking advantage of the new
    * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
-  public static <E> HashSet<E> newHashSet() {
+  public static <E extends @Nullable Object> HashSet<E> newHashSet() {
     return new HashSet<E>();
   }
 
@@ -177,7 +180,7 @@
    * asList}{@code (...))}, or for creating an empty set then calling {@link Collections#addAll}.
    * This method is not actually very useful and will likely be deprecated in the future.
    */
-  public static <E> HashSet<E> newHashSet(E... elements) {
+  public static <E extends @Nullable Object> HashSet<E> newHashSet(E... elements) {
     HashSet<E> set = newHashSetWithExpectedSize(elements.length);
     Collections.addAll(set, elements);
     return set;
@@ -201,7 +204,7 @@
    *
    * <p>Overall, this method is not very useful and will likely be deprecated in the future.
    */
-  public static <E> HashSet<E> newHashSet(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> HashSet<E> newHashSet(Iterable<? extends E> elements) {
     return (elements instanceof Collection)
         ? new HashSet<E>((Collection<? extends E>) elements)
         : newHashSet(elements.iterator());
@@ -219,7 +222,7 @@
    *
    * <p>Overall, this method is not very useful and will likely be deprecated in the future.
    */
-  public static <E> HashSet<E> newHashSet(Iterator<? extends E> elements) {
+  public static <E extends @Nullable Object> HashSet<E> newHashSet(Iterator<? extends E> elements) {
     HashSet<E> set = newHashSet();
     Iterators.addAll(set, elements);
     return set;
@@ -237,7 +240,8 @@
    *     without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <E> HashSet<E> newHashSetWithExpectedSize(int expectedSize) {
+  public static <E extends @Nullable Object> HashSet<E> newHashSetWithExpectedSize(
+      int expectedSize) {
     return new HashSet<E>(Maps.capacity(expectedSize));
   }
 
@@ -287,7 +291,7 @@
    *
    * @return a new, empty {@code LinkedHashSet}
    */
-  public static <E> LinkedHashSet<E> newLinkedHashSet() {
+  public static <E extends @Nullable Object> LinkedHashSet<E> newLinkedHashSet() {
     return new LinkedHashSet<E>();
   }
 
@@ -306,7 +310,8 @@
    * @param elements the elements that the set should contain, in order
    * @return a new {@code LinkedHashSet} containing those elements (minus duplicates)
    */
-  public static <E> LinkedHashSet<E> newLinkedHashSet(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> LinkedHashSet<E> newLinkedHashSet(
+      Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
       return new LinkedHashSet<E>((Collection<? extends E>) elements);
     }
@@ -327,7 +332,8 @@
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    * @since 11.0
    */
-  public static <E> LinkedHashSet<E> newLinkedHashSetWithExpectedSize(int expectedSize) {
+  public static <E extends @Nullable Object> LinkedHashSet<E> newLinkedHashSetWithExpectedSize(
+      int expectedSize) {
     return new LinkedHashSet<E>(Maps.capacity(expectedSize));
   }
 
@@ -392,7 +398,8 @@
    * @return a new, empty {@code TreeSet}
    * @throws NullPointerException if {@code comparator} is null
    */
-  public static <E> TreeSet<E> newTreeSet(Comparator<? super E> comparator) {
+  public static <E extends @Nullable Object> TreeSet<E> newTreeSet(
+      Comparator<? super E> comparator) {
     return new TreeSet<E>(checkNotNull(comparator));
   }
 
@@ -405,7 +412,7 @@
    *
    * @since 8.0
    */
-  public static <E> Set<E> newIdentityHashSet() {
+  public static <E extends @Nullable Object> Set<E> newIdentityHashSet() {
     return Collections.newSetFromMap(Maps.<E, Boolean>newIdentityHashMap());
   }
 
@@ -419,7 +426,7 @@
    * @since 12.0
    */
   @GwtIncompatible // CopyOnWriteArraySet
-  public static <E> CopyOnWriteArraySet<E> newCopyOnWriteArraySet() {
+  public static <E extends @Nullable Object> CopyOnWriteArraySet<E> newCopyOnWriteArraySet() {
     return new CopyOnWriteArraySet<E>();
   }
 
@@ -431,7 +438,8 @@
    * @since 12.0
    */
   @GwtIncompatible // CopyOnWriteArraySet
-  public static <E> CopyOnWriteArraySet<E> newCopyOnWriteArraySet(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> CopyOnWriteArraySet<E> newCopyOnWriteArraySet(
+      Iterable<? extends E> elements) {
     // We copy elements to an ArrayList first, rather than incurring the
     // quadratic cost of adding them to the COWAS directly.
     Collection<? extends E> elementsCollection =
@@ -519,7 +527,8 @@
    * @deprecated Use {@link Collections#newSetFromMap} instead.
    */
   @Deprecated
-  public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
+  public static <E extends @Nullable Object> Set<E> newSetFromMap(
+      Map<E, Boolean> map) {
     return Collections.newSetFromMap(map);
   }
 
@@ -532,7 +541,7 @@
    *
    * @since 2.0
    */
-  public abstract static class SetView<E> extends AbstractSet<E> {
+  public abstract static class SetView<E extends @Nullable Object> extends AbstractSet<E> {
     private SetView() {} // no subclasses but our own
 
     /**
@@ -543,6 +552,7 @@
      * nonstandard notion of equivalence, for example if it is a {@link TreeSet} using a comparator
      * that is inconsistent with {@link Object#equals(Object)}.
      */
+    @SuppressWarnings("nullness") // Unsafe, but we can't fix it now.
     public ImmutableSet<E> immutableCopy() {
       return ImmutableSet.copyOf(this);
     }
@@ -571,7 +581,8 @@
     @CanIgnoreReturnValue
     @Deprecated
     @Override
-    public final boolean add(E e) {
+    @DoNotCall("Always throws UnsupportedOperationException")
+    public final boolean add(@ParametricNullness E e) {
       throw new UnsupportedOperationException();
     }
 
@@ -584,7 +595,8 @@
     @CanIgnoreReturnValue
     @Deprecated
     @Override
-    public final boolean remove(Object object) {
+    @DoNotCall("Always throws UnsupportedOperationException")
+    public final boolean remove(@CheckForNull Object object) {
       throw new UnsupportedOperationException();
     }
 
@@ -597,6 +609,7 @@
     @CanIgnoreReturnValue
     @Deprecated
     @Override
+    @DoNotCall("Always throws UnsupportedOperationException")
     public final boolean addAll(Collection<? extends E> newElements) {
       throw new UnsupportedOperationException();
     }
@@ -610,6 +623,7 @@
     @CanIgnoreReturnValue
     @Deprecated
     @Override
+    @DoNotCall("Always throws UnsupportedOperationException")
     public final boolean removeAll(Collection<?> oldElements) {
       throw new UnsupportedOperationException();
     }
@@ -623,6 +637,7 @@
     @CanIgnoreReturnValue
     @Deprecated
     @Override
+    @DoNotCall("Always throws UnsupportedOperationException")
     public final boolean retainAll(Collection<?> elementsToKeep) {
       throw new UnsupportedOperationException();
     }
@@ -635,6 +650,7 @@
      */
     @Deprecated
     @Override
+    @DoNotCall("Always throws UnsupportedOperationException")
     public final void clear() {
       throw new UnsupportedOperationException();
     }
@@ -655,10 +671,11 @@
    * that is not contained in {@code set1}.
    *
    * <p>Results are undefined if {@code set1} and {@code set2} are sets based on different
-   * equivalence relations (as {@link HashSet}, {@link TreeSet}, and the {@link Map#keySet} of an
-   * {@code IdentityHashMap} all are).
+   * equivalence relations, for example if {@code set1} is a {@link HashSet} and {@code set2} is a
+   * {@link TreeSet} or the {@link Map#keySet} of an {@code IdentityHashMap}.
    */
-  public static <E> SetView<E> union(final Set<? extends E> set1, final Set<? extends E> set2) {
+  public static <E extends @Nullable Object> SetView<E> union(
+      final Set<? extends E> set1, final Set<? extends E> set2) {
     checkNotNull(set1, "set1");
     checkNotNull(set2, "set2");
 
@@ -686,6 +703,7 @@
           final Iterator<? extends E> itr2 = set2.iterator();
 
           @Override
+          @CheckForNull
           protected E computeNext() {
             if (itr1.hasNext()) {
               return itr1.next();
@@ -702,7 +720,7 @@
       }
 
       @Override
-      public boolean contains(Object object) {
+      public boolean contains(@CheckForNull Object object) {
         return set1.contains(object) || set2.contains(object);
       }
 
@@ -714,6 +732,7 @@
       }
 
       @Override
+      @SuppressWarnings("nullness") // see supertype
       public ImmutableSet<E> immutableCopy() {
         return new ImmutableSet.Builder<E>().addAll(set1).addAll(set2).build();
       }
@@ -726,8 +745,8 @@
    * matches that of {@code set1}.
    *
    * <p>Results are undefined if {@code set1} and {@code set2} are sets based on different
-   * equivalence relations (as {@code HashSet}, {@code TreeSet}, and the keySet of an {@code
-   * IdentityHashMap} all are).
+   * equivalence relations, for example if {@code set1} is a {@link HashSet} and {@code set2} is a
+   * {@link TreeSet} or the {@link Map#keySet} of an {@code IdentityHashMap}.
    *
    * <p><b>Note:</b> The returned view performs slightly better when {@code set1} is the smaller of
    * the two sets. If you have reason to believe one of your sets will generally be smaller than the
@@ -747,7 +766,8 @@
    *
    * <p>This is unfortunate, but should come up only very rarely.
    */
-  public static <E> SetView<E> intersection(final Set<E> set1, final Set<?> set2) {
+  public static <E extends @Nullable Object> SetView<E> intersection(
+      final Set<E> set1, final Set<?> set2) {
     checkNotNull(set1, "set1");
     checkNotNull(set2, "set2");
 
@@ -758,6 +778,7 @@
           final Iterator<E> itr = set1.iterator();
 
           @Override
+          @CheckForNull
           protected E computeNext() {
             while (itr.hasNext()) {
               E e = itr.next();
@@ -787,7 +808,7 @@
       }
 
       @Override
-      public boolean contains(Object object) {
+      public boolean contains(@CheckForNull Object object) {
         return set1.contains(object) && set2.contains(object);
       }
 
@@ -805,10 +826,11 @@
    * order of the returned set matches that of {@code set1}.
    *
    * <p>Results are undefined if {@code set1} and {@code set2} are sets based on different
-   * equivalence relations (as {@code HashSet}, {@code TreeSet}, and the keySet of an {@code
-   * IdentityHashMap} all are).
+   * equivalence relations, for example if {@code set1} is a {@link HashSet} and {@code set2} is a
+   * {@link TreeSet} or the {@link Map#keySet} of an {@code IdentityHashMap}.
    */
-  public static <E> SetView<E> difference(final Set<E> set1, final Set<?> set2) {
+  public static <E extends @Nullable Object> SetView<E> difference(
+      final Set<E> set1, final Set<?> set2) {
     checkNotNull(set1, "set1");
     checkNotNull(set2, "set2");
 
@@ -819,6 +841,7 @@
           final Iterator<E> itr = set1.iterator();
 
           @Override
+          @CheckForNull
           protected E computeNext() {
             while (itr.hasNext()) {
               E e = itr.next();
@@ -848,7 +871,7 @@
       }
 
       @Override
-      public boolean contains(Object element) {
+      public boolean contains(@CheckForNull Object element) {
         return set1.contains(element) && !set2.contains(element);
       }
     };
@@ -860,12 +883,12 @@
    * both. The iteration order of the returned set is undefined.
    *
    * <p>Results are undefined if {@code set1} and {@code set2} are sets based on different
-   * equivalence relations (as {@code HashSet}, {@code TreeSet}, and the keySet of an {@code
-   * IdentityHashMap} all are).
+   * equivalence relations, for example if {@code set1} is a {@link HashSet} and {@code set2} is a
+   * {@link TreeSet} or the {@link Map#keySet} of an {@code IdentityHashMap}.
    *
    * @since 3.0
    */
-  public static <E> SetView<E> symmetricDifference(
+  public static <E extends @Nullable Object> SetView<E> symmetricDifference(
       final Set<? extends E> set1, final Set<? extends E> set2) {
     checkNotNull(set1, "set1");
     checkNotNull(set2, "set2");
@@ -877,6 +900,7 @@
         final Iterator<? extends E> itr2 = set2.iterator();
         return new AbstractIterator<E>() {
           @Override
+          @CheckForNull
           public E computeNext() {
             while (itr1.hasNext()) {
               E elem1 = itr1.next();
@@ -917,7 +941,7 @@
       }
 
       @Override
-      public boolean contains(Object element) {
+      public boolean contains(@CheckForNull Object element) {
         return set1.contains(element) ^ set2.contains(element);
       }
     };
@@ -950,7 +974,8 @@
    * you to migrate to streams.
    */
   // TODO(kevinb): how to omit that last sentence when building GWT javadoc?
-  public static <E> Set<E> filter(Set<E> unfiltered, Predicate<? super E> predicate) {
+  public static <E extends @Nullable Object> Set<E> filter(
+      Set<E> unfiltered, Predicate<? super E> predicate) {
     if (unfiltered instanceof SortedSet) {
       return filter((SortedSet<E>) unfiltered, predicate);
     }
@@ -989,7 +1014,8 @@
    *
    * @since 11.0
    */
-  public static <E> SortedSet<E> filter(SortedSet<E> unfiltered, Predicate<? super E> predicate) {
+  public static <E extends @Nullable Object> SortedSet<E> filter(
+      SortedSet<E> unfiltered, Predicate<? super E> predicate) {
     if (unfiltered instanceof FilteredSet) {
       // Support clear(), removeAll(), and retainAll() when filtering a filtered
       // collection.
@@ -1027,7 +1053,7 @@
    */
   @GwtIncompatible // NavigableSet
   @SuppressWarnings("unchecked")
-  public static <E> NavigableSet<E> filter(
+  public static <E extends @Nullable Object> NavigableSet<E> filter(
       NavigableSet<E> unfiltered, Predicate<? super E> predicate) {
     if (unfiltered instanceof FilteredSet) {
       // Support clear(), removeAll(), and retainAll() when filtering a filtered
@@ -1040,13 +1066,14 @@
     return new FilteredNavigableSet<E>(checkNotNull(unfiltered), checkNotNull(predicate));
   }
 
-  private static class FilteredSet<E> extends FilteredCollection<E> implements Set<E> {
+  private static class FilteredSet<E extends @Nullable Object> extends FilteredCollection<E>
+      implements Set<E> {
     FilteredSet(Set<E> unfiltered, Predicate<? super E> predicate) {
       super(unfiltered, predicate);
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       return equalsImpl(this, object);
     }
 
@@ -1056,39 +1083,43 @@
     }
   }
 
-  private static class FilteredSortedSet<E> extends FilteredSet<E> implements SortedSet<E> {
+  private static class FilteredSortedSet<E extends @Nullable Object> extends FilteredSet<E>
+      implements SortedSet<E> {
 
     FilteredSortedSet(SortedSet<E> unfiltered, Predicate<? super E> predicate) {
       super(unfiltered, predicate);
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super E> comparator() {
       return ((SortedSet<E>) unfiltered).comparator();
     }
 
     @Override
-    public SortedSet<E> subSet(E fromElement, E toElement) {
+    public SortedSet<E> subSet(@ParametricNullness E fromElement, @ParametricNullness E toElement) {
       return new FilteredSortedSet<E>(
           ((SortedSet<E>) unfiltered).subSet(fromElement, toElement), predicate);
     }
 
     @Override
-    public SortedSet<E> headSet(E toElement) {
+    public SortedSet<E> headSet(@ParametricNullness E toElement) {
       return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).headSet(toElement), predicate);
     }
 
     @Override
-    public SortedSet<E> tailSet(E fromElement) {
+    public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
       return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).tailSet(fromElement), predicate);
     }
 
     @Override
+    @ParametricNullness
     public E first() {
       return Iterators.find(unfiltered.iterator(), predicate);
     }
 
     @Override
+    @ParametricNullness
     public E last() {
       SortedSet<E> sortedUnfiltered = (SortedSet<E>) unfiltered;
       while (true) {
@@ -1102,7 +1133,7 @@
   }
 
   @GwtIncompatible // NavigableSet
-  private static class FilteredNavigableSet<E> extends FilteredSortedSet<E>
+  private static class FilteredNavigableSet<E extends @Nullable Object> extends FilteredSortedSet<E>
       implements NavigableSet<E> {
     FilteredNavigableSet(NavigableSet<E> unfiltered, Predicate<? super E> predicate) {
       super(unfiltered, predicate);
@@ -1113,33 +1144,37 @@
     }
 
     @Override
-    @NullableDecl
-    public E lower(E e) {
+    @CheckForNull
+    public E lower(@ParametricNullness E e) {
       return Iterators.find(unfiltered().headSet(e, false).descendingIterator(), predicate, null);
     }
 
     @Override
-    @NullableDecl
-    public E floor(E e) {
+    @CheckForNull
+    public E floor(@ParametricNullness E e) {
       return Iterators.find(unfiltered().headSet(e, true).descendingIterator(), predicate, null);
     }
 
     @Override
-    public E ceiling(E e) {
+    @CheckForNull
+    public E ceiling(@ParametricNullness E e) {
       return Iterables.find(unfiltered().tailSet(e, true), predicate, null);
     }
 
     @Override
-    public E higher(E e) {
+    @CheckForNull
+    public E higher(@ParametricNullness E e) {
       return Iterables.find(unfiltered().tailSet(e, false), predicate, null);
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       return Iterables.removeFirstMatching(unfiltered(), predicate);
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       return Iterables.removeFirstMatching(unfiltered().descendingSet(), predicate);
     }
@@ -1155,24 +1190,28 @@
     }
 
     @Override
+    @ParametricNullness
     public E last() {
       return Iterators.find(unfiltered().descendingIterator(), predicate);
     }
 
     @Override
     public NavigableSet<E> subSet(
-        E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+        @ParametricNullness E fromElement,
+        boolean fromInclusive,
+        @ParametricNullness E toElement,
+        boolean toInclusive) {
       return filter(
           unfiltered().subSet(fromElement, fromInclusive, toElement, toInclusive), predicate);
     }
 
     @Override
-    public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+    public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
       return filter(unfiltered().headSet(toElement, inclusive), predicate);
     }
 
     @Override
-    public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+    public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
       return filter(unfiltered().tailSet(fromElement, inclusive), predicate);
     }
   }
@@ -1338,7 +1377,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object object) {
+    public boolean contains(@CheckForNull Object object) {
       if (!(object instanceof List)) {
         return false;
       }
@@ -1357,7 +1396,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       // Warning: this is broken if size() == 0, so it is critical that we
       // substitute an empty ImmutableSet to the user in place of this
       if (object instanceof CartesianSet) {
@@ -1457,7 +1496,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object o) {
+    public boolean contains(@CheckForNull Object o) {
       Integer index = inputSet.get(o);
       return index != null && (mask & (1 << index)) != 0;
     }
@@ -1493,7 +1532,7 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object obj) {
+    public boolean contains(@CheckForNull Object obj) {
       if (obj instanceof Set) {
         Set<?> set = (Set<?>) obj;
         return inputSet.keySet().containsAll(set);
@@ -1502,7 +1541,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof PowerSet) {
         PowerSet<?> that = (PowerSet<?>) obj;
         return inputSet.keySet().equals(that.inputSet.keySet());
@@ -1562,7 +1601,7 @@
     }
     return new AbstractSet<Set<E>>() {
       @Override
-      public boolean contains(@NullableDecl Object o) {
+      public boolean contains(@CheckForNull Object o) {
         if (o instanceof Set) {
           Set<?> s = (Set<?>) o;
           return s.size() == size && index.keySet().containsAll(s);
@@ -1576,6 +1615,7 @@
           final BitSet bits = new BitSet(index.size());
 
           @Override
+          @CheckForNull
           protected Set<E> computeNext() {
             if (bits.isEmpty()) {
               bits.set(0, size);
@@ -1606,7 +1646,7 @@
             final BitSet copy = (BitSet) bits.clone();
             return new AbstractSet<E>() {
               @Override
-              public boolean contains(@NullableDecl Object o) {
+              public boolean contains(@CheckForNull Object o) {
                 Integer i = index.get(o);
                 return i != null && copy.get(i);
               }
@@ -1617,6 +1657,7 @@
                   int i = -1;
 
                   @Override
+                  @CheckForNull
                   protected E computeNext() {
                     i = copy.nextSetBit(i + 1);
                     if (i == -1) {
@@ -1661,7 +1702,7 @@
   }
 
   /** An implementation for {@link Set#equals(Object)}. */
-  static boolean equalsImpl(Set<?> s, @NullableDecl Object object) {
+  static boolean equalsImpl(Set<?> s, @CheckForNull Object object) {
     if (s == object) {
       return true;
     }
@@ -1690,15 +1731,16 @@
    * @return an unmodifiable view of the specified navigable set
    * @since 12.0
    */
-  public static <E> NavigableSet<E> unmodifiableNavigableSet(NavigableSet<E> set) {
+  public static <E extends @Nullable Object> NavigableSet<E> unmodifiableNavigableSet(
+      NavigableSet<E> set) {
     if (set instanceof ImmutableCollection || set instanceof UnmodifiableNavigableSet) {
       return set;
     }
     return new UnmodifiableNavigableSet<E>(set);
   }
 
-  static final class UnmodifiableNavigableSet<E> extends ForwardingSortedSet<E>
-      implements NavigableSet<E>, Serializable {
+  static final class UnmodifiableNavigableSet<E extends @Nullable Object>
+      extends ForwardingSortedSet<E> implements NavigableSet<E>, Serializable {
     private final NavigableSet<E> delegate;
     private final SortedSet<E> unmodifiableDelegate;
 
@@ -1713,36 +1755,42 @@
     }
 
     @Override
-    public E lower(E e) {
+    @CheckForNull
+    public E lower(@ParametricNullness E e) {
       return delegate.lower(e);
     }
 
     @Override
-    public E floor(E e) {
+    @CheckForNull
+    public E floor(@ParametricNullness E e) {
       return delegate.floor(e);
     }
 
     @Override
-    public E ceiling(E e) {
+    @CheckForNull
+    public E ceiling(@ParametricNullness E e) {
       return delegate.ceiling(e);
     }
 
     @Override
-    public E higher(E e) {
+    @CheckForNull
+    public E higher(@ParametricNullness E e) {
       return delegate.higher(e);
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       throw new UnsupportedOperationException();
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       throw new UnsupportedOperationException();
     }
 
-    @NullableDecl private transient UnmodifiableNavigableSet<E> descendingSet;
+    @CheckForNull private transient UnmodifiableNavigableSet<E> descendingSet;
 
     @Override
     public NavigableSet<E> descendingSet() {
@@ -1761,18 +1809,21 @@
 
     @Override
     public NavigableSet<E> subSet(
-        E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+        @ParametricNullness E fromElement,
+        boolean fromInclusive,
+        @ParametricNullness E toElement,
+        boolean toInclusive) {
       return unmodifiableNavigableSet(
           delegate.subSet(fromElement, fromInclusive, toElement, toInclusive));
     }
 
     @Override
-    public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+    public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
       return unmodifiableNavigableSet(delegate.headSet(toElement, inclusive));
     }
 
     @Override
-    public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+    public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
       return unmodifiableNavigableSet(delegate.tailSet(fromElement, inclusive));
     }
 
@@ -1825,7 +1876,8 @@
    * @since 13.0
    */
   @GwtIncompatible // NavigableSet
-  public static <E> NavigableSet<E> synchronizedNavigableSet(NavigableSet<E> navigableSet) {
+  public static <E extends @Nullable Object> NavigableSet<E> synchronizedNavigableSet(
+      NavigableSet<E> navigableSet) {
     return Synchronized.navigableSet(navigableSet);
   }
 
@@ -1858,7 +1910,7 @@
   }
 
   @GwtIncompatible // NavigableSet
-  static class DescendingSet<E> extends ForwardingNavigableSet<E> {
+  static class DescendingSet<E extends @Nullable Object> extends ForwardingNavigableSet<E> {
     private final NavigableSet<E> forward;
 
     DescendingSet(NavigableSet<E> forward) {
@@ -1871,31 +1923,37 @@
     }
 
     @Override
-    public E lower(E e) {
+    @CheckForNull
+    public E lower(@ParametricNullness E e) {
       return forward.higher(e);
     }
 
     @Override
-    public E floor(E e) {
+    @CheckForNull
+    public E floor(@ParametricNullness E e) {
       return forward.ceiling(e);
     }
 
     @Override
-    public E ceiling(E e) {
+    @CheckForNull
+    public E ceiling(@ParametricNullness E e) {
       return forward.floor(e);
     }
 
     @Override
-    public E higher(E e) {
+    @CheckForNull
+    public E higher(@ParametricNullness E e) {
       return forward.lower(e);
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       return forward.pollLast();
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       return forward.pollFirst();
     }
@@ -1912,32 +1970,35 @@
 
     @Override
     public NavigableSet<E> subSet(
-        E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+        @ParametricNullness E fromElement,
+        boolean fromInclusive,
+        @ParametricNullness E toElement,
+        boolean toInclusive) {
       return forward.subSet(toElement, toInclusive, fromElement, fromInclusive).descendingSet();
     }
 
     @Override
-    public SortedSet<E> subSet(E fromElement, E toElement) {
+    public SortedSet<E> subSet(@ParametricNullness E fromElement, @ParametricNullness E toElement) {
       return standardSubSet(fromElement, toElement);
     }
 
     @Override
-    public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+    public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
       return forward.tailSet(toElement, inclusive).descendingSet();
     }
 
     @Override
-    public SortedSet<E> headSet(E toElement) {
+    public SortedSet<E> headSet(@ParametricNullness E toElement) {
       return standardHeadSet(toElement);
     }
 
     @Override
-    public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+    public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
       return forward.headSet(fromElement, inclusive).descendingSet();
     }
 
     @Override
-    public SortedSet<E> tailSet(E fromElement) {
+    public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
       return standardTailSet(fromElement);
     }
 
@@ -1953,16 +2014,18 @@
     }
 
     // If we inline this, we get a javac error.
-    private static <T> Ordering<T> reverse(Comparator<T> forward) {
+    private static <T extends @Nullable Object> Ordering<T> reverse(Comparator<T> forward) {
       return Ordering.from(forward).reverse();
     }
 
     @Override
+    @ParametricNullness
     public E first() {
       return forward.last();
     }
 
     @Override
+    @ParametricNullness
     public E last() {
       return forward.first();
     }
@@ -1973,12 +2036,13 @@
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       return standardToArray();
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return standardToArray(array);
     }
 
diff --git a/android/guava/src/com/google/common/collect/SingletonImmutableSet.java b/android/guava/src/com/google/common/collect/SingletonImmutableSet.java
index 0f882b3..088cb80 100644
--- a/android/guava/src/com/google/common/collect/SingletonImmutableSet.java
+++ b/android/guava/src/com/google/common/collect/SingletonImmutableSet.java
@@ -18,7 +18,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Preconditions;
-import com.google.errorprone.annotations.concurrent.LazyInit;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link ImmutableSet} with exactly one element.
@@ -28,35 +29,24 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+@ElementTypesAreNonnullByDefault
 final class SingletonImmutableSet<E> extends ImmutableSet<E> {
+  // We deliberately avoid caching the asList and hashCode here, to ensure that with
+  // compressed oops, a SingletonImmutableSet packs all the way down to the optimal 16 bytes.
 
   final transient E element;
-  // This is transient because it will be recalculated on the first
-  // call to hashCode().
-  //
-  // A race condition is avoided since threads will either see that the value
-  // is zero and recalculate it themselves, or two threads will see it at
-  // the same time, and both recalculate it.  If the cachedHashCode is 0,
-  // it will always be recalculated, unfortunately.
-  @LazyInit private transient int cachedHashCode;
 
   SingletonImmutableSet(E element) {
     this.element = Preconditions.checkNotNull(element);
   }
 
-  SingletonImmutableSet(E element, int hashCode) {
-    // Guaranteed to be non-null by the presence of the pre-computed hash code.
-    this.element = element;
-    cachedHashCode = hashCode;
-  }
-
   @Override
   public int size() {
     return 1;
   }
 
   @Override
-  public boolean contains(Object target) {
+  public boolean contains(@CheckForNull Object target) {
     return element.equals(target);
   }
 
@@ -66,7 +56,7 @@
   }
 
   @Override
-  ImmutableList<E> createAsList() {
+  public ImmutableList<E> asList() {
     return ImmutableList.of(element);
   }
 
@@ -76,24 +66,14 @@
   }
 
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     dst[offset] = element;
     return offset + 1;
   }
 
   @Override
   public final int hashCode() {
-    // Racy single-check.
-    int code = cachedHashCode;
-    if (code == 0) {
-      cachedHashCode = code = element.hashCode();
-    }
-    return code;
-  }
-
-  @Override
-  boolean isHashCodeFast() {
-    return cachedHashCode != 0;
+    return element.hashCode();
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/collect/SingletonImmutableTable.java b/android/guava/src/com/google/common/collect/SingletonImmutableTable.java
index 58a182c..cfaeadb 100644
--- a/android/guava/src/com/google/common/collect/SingletonImmutableTable.java
+++ b/android/guava/src/com/google/common/collect/SingletonImmutableTable.java
@@ -27,6 +27,7 @@
  * @author Gregory Kick
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 class SingletonImmutableTable<R, C, V> extends ImmutableTable<R, C, V> {
   final R singleRowKey;
   final C singleColumnKey;
diff --git a/android/guava/src/com/google/common/collect/SortedIterable.java b/android/guava/src/com/google/common/collect/SortedIterable.java
index d46e8af..64ec08e 100644
--- a/android/guava/src/com/google/common/collect/SortedIterable.java
+++ b/android/guava/src/com/google/common/collect/SortedIterable.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.Iterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An {@code Iterable} whose elements are sorted relative to a {@code Comparator}, typically
@@ -25,7 +26,8 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-interface SortedIterable<T> extends Iterable<T> {
+@ElementTypesAreNonnullByDefault
+interface SortedIterable<T extends @Nullable Object> extends Iterable<T> {
   /**
    * Returns the {@code Comparator} by which the elements of this iterable are ordered, or {@code
    * Ordering.natural()} if the elements are ordered by their natural ordering.
diff --git a/android/guava/src/com/google/common/collect/SortedIterables.java b/android/guava/src/com/google/common/collect/SortedIterables.java
index 2c0aa7c..68b231a 100644
--- a/android/guava/src/com/google/common/collect/SortedIterables.java
+++ b/android/guava/src/com/google/common/collect/SortedIterables.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.SortedSet;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Utilities for dealing with sorted collections of all types.
@@ -26,6 +27,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class SortedIterables {
   private SortedIterables() {}
 
@@ -49,7 +51,8 @@
 
   @SuppressWarnings("unchecked")
   // if sortedSet.comparator() is null, the set must be naturally ordered
-  public static <E> Comparator<? super E> comparator(SortedSet<E> sortedSet) {
+  public static <E extends @Nullable Object> Comparator<? super E> comparator(
+      SortedSet<E> sortedSet) {
     Comparator<? super E> result = sortedSet.comparator();
     if (result == null) {
       result = (Comparator<? super E>) Ordering.natural();
diff --git a/android/guava/src/com/google/common/collect/SortedLists.java b/android/guava/src/com/google/common/collect/SortedLists.java
index 67c5a3b..0ebaab2 100644
--- a/android/guava/src/com/google/common/collect/SortedLists.java
+++ b/android/guava/src/com/google/common/collect/SortedLists.java
@@ -23,7 +23,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static methods pertaining to sorted {@link List} instances.
@@ -35,29 +35,38 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-@Beta final class SortedLists {
+@Beta
+@ElementTypesAreNonnullByDefault
+final class SortedLists {
   private SortedLists() {}
 
   /**
    * A specification for which index to return if the list contains at least one element that
    * compares as equal to the key.
-   */ enum KeyPresentBehavior {
+   */
+  enum KeyPresentBehavior {
     /**
      * Return the index of any list element that compares as equal to the key. No guarantees are
      * made as to which index is returned, if more than one element compares as equal to the key.
      */
     ANY_PRESENT {
       @Override
-      <E> int resultIndex(
-          Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex) {
+      <E extends @Nullable Object> int resultIndex(
+          Comparator<? super E> comparator,
+          @ParametricNullness E key,
+          List<? extends E> list,
+          int foundIndex) {
         return foundIndex;
       }
     },
     /** Return the index of the last list element that compares as equal to the key. */
     LAST_PRESENT {
       @Override
-      <E> int resultIndex(
-          Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex) {
+      <E extends @Nullable Object> int resultIndex(
+          Comparator<? super E> comparator,
+          @ParametricNullness E key,
+          List<? extends E> list,
+          int foundIndex) {
         // Of course, we have to use binary search to find the precise
         // breakpoint...
         int lower = foundIndex;
@@ -78,8 +87,11 @@
     /** Return the index of the first list element that compares as equal to the key. */
     FIRST_PRESENT {
       @Override
-      <E> int resultIndex(
-          Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex) {
+      <E extends @Nullable Object> int resultIndex(
+          Comparator<? super E> comparator,
+          @ParametricNullness E key,
+          List<? extends E> list,
+          int foundIndex) {
         // Of course, we have to use binary search to find the precise
         // breakpoint...
         int lower = 0;
@@ -104,8 +116,11 @@
      */
     FIRST_AFTER {
       @Override
-      public <E> int resultIndex(
-          Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex) {
+      public <E extends @Nullable Object> int resultIndex(
+          Comparator<? super E> comparator,
+          @ParametricNullness E key,
+          List<? extends E> list,
+          int foundIndex) {
         return LAST_PRESENT.resultIndex(comparator, key, list, foundIndex) + 1;
       }
     },
@@ -115,20 +130,27 @@
      */
     LAST_BEFORE {
       @Override
-      public <E> int resultIndex(
-          Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex) {
+      public <E extends @Nullable Object> int resultIndex(
+          Comparator<? super E> comparator,
+          @ParametricNullness E key,
+          List<? extends E> list,
+          int foundIndex) {
         return FIRST_PRESENT.resultIndex(comparator, key, list, foundIndex) - 1;
       }
     };
 
-    abstract <E> int resultIndex(
-        Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex);
+    abstract <E extends @Nullable Object> int resultIndex(
+        Comparator<? super E> comparator,
+        @ParametricNullness E key,
+        List<? extends E> list,
+        int foundIndex);
   }
 
   /**
    * A specification for which index to return if the list contains no elements that compare as
    * equal to the key.
-   */ enum KeyAbsentBehavior {
+   */
+  enum KeyAbsentBehavior {
     /**
      * Return the index of the next lower element in the list, or {@code -1} if there is no such
      * element.
@@ -193,12 +215,13 @@
    * <p>Equivalent to {@link #binarySearch(List, Function, Object, Comparator, KeyPresentBehavior,
    * KeyAbsentBehavior)} using {@link Ordering#natural}.
    */
-  public static <E, K extends Comparable> int binarySearch(
+  public static <E extends @Nullable Object, K extends Comparable> int binarySearch(
       List<E> list,
       Function<? super E, K> keyFunction,
-      @NullableDecl K key,
+      K key,
       KeyPresentBehavior presentBehavior,
       KeyAbsentBehavior absentBehavior) {
+    checkNotNull(key);
     return binarySearch(
         list, keyFunction, key, Ordering.natural(), presentBehavior, absentBehavior);
   }
@@ -210,10 +233,10 @@
    * KeyAbsentBehavior)} using {@link Lists#transform(List, Function) Lists.transform(list,
    * keyFunction)}.
    */
-  public static <E, K> int binarySearch(
+  public static <E extends @Nullable Object, K extends @Nullable Object> int binarySearch(
       List<E> list,
       Function<? super E, K> keyFunction,
-      @NullableDecl K key,
+      @ParametricNullness K key,
       Comparator<? super K> keyComparator,
       KeyPresentBehavior presentBehavior,
       KeyAbsentBehavior absentBehavior) {
@@ -244,9 +267,9 @@
    * @return the index determined by the {@code KeyPresentBehavior}, if the key is in the list;
    *     otherwise the index determined by the {@code KeyAbsentBehavior}.
    */
-  public static <E> int binarySearch(
+  public static <E extends @Nullable Object> int binarySearch(
       List<? extends E> list,
-      @NullableDecl E key,
+      @ParametricNullness E key,
       Comparator<? super E> comparator,
       KeyPresentBehavior presentBehavior,
       KeyAbsentBehavior absentBehavior) {
diff --git a/android/guava/src/com/google/common/collect/SortedMapDifference.java b/android/guava/src/com/google/common/collect/SortedMapDifference.java
index 4715e93..46cac8a 100644
--- a/android/guava/src/com/google/common/collect/SortedMapDifference.java
+++ b/android/guava/src/com/google/common/collect/SortedMapDifference.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.SortedMap;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An object representing the differences between two sorted maps.
@@ -26,7 +27,9 @@
  * @since 8.0
  */
 @GwtCompatible
-public interface SortedMapDifference<K, V> extends MapDifference<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface SortedMapDifference<K extends @Nullable Object, V extends @Nullable Object>
+    extends MapDifference<K, V> {
 
   @Override
   SortedMap<K, V> entriesOnlyOnLeft();
diff --git a/android/guava/src/com/google/common/collect/SortedMultiset.java b/android/guava/src/com/google/common/collect/SortedMultiset.java
index 2635b37..68932f5 100644
--- a/android/guava/src/com/google/common/collect/SortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/SortedMultiset.java
@@ -22,6 +22,8 @@
 import java.util.Iterator;
 import java.util.NavigableSet;
 import java.util.Set;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Multiset} which maintains the ordering of its elements, according to either their
@@ -42,7 +44,9 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
-public interface SortedMultiset<E> extends SortedMultisetBridge<E>, SortedIterable<E> {
+@ElementTypesAreNonnullByDefault
+public interface SortedMultiset<E extends @Nullable Object>
+    extends SortedMultisetBridge<E>, SortedIterable<E> {
   /**
    * Returns the comparator that orders this multiset, or {@link Ordering#natural()} if the natural
    * ordering of the elements is used.
@@ -54,24 +58,28 @@
    * Returns the entry of the first element in this multiset, or {@code null} if this multiset is
    * empty.
    */
+  @CheckForNull
   Entry<E> firstEntry();
 
   /**
    * Returns the entry of the last element in this multiset, or {@code null} if this multiset is
    * empty.
    */
+  @CheckForNull
   Entry<E> lastEntry();
 
   /**
    * Returns and removes the entry associated with the lowest element in this multiset, or returns
    * {@code null} if this multiset is empty.
    */
+  @CheckForNull
   Entry<E> pollFirstEntry();
 
   /**
    * Returns and removes the entry associated with the greatest element in this multiset, or returns
    * {@code null} if this multiset is empty.
    */
+  @CheckForNull
   Entry<E> pollLastEntry();
 
   /**
@@ -115,7 +123,7 @@
    * <p>The returned multiset will throw an {@link IllegalArgumentException} on attempts to add
    * elements outside its range.
    */
-  SortedMultiset<E> headMultiset(E upperBound, BoundType boundType);
+  SortedMultiset<E> headMultiset(@ParametricNullness E upperBound, BoundType boundType);
 
   /**
    * Returns a view of this multiset restricted to the range between {@code lowerBound} and {@code
@@ -130,7 +138,10 @@
    * lowerBoundType).headMultiset(upperBound, upperBoundType)}.
    */
   SortedMultiset<E> subMultiset(
-      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType);
+      @ParametricNullness E lowerBound,
+      BoundType lowerBoundType,
+      @ParametricNullness E upperBound,
+      BoundType upperBoundType);
 
   /**
    * Returns a view of this multiset restricted to the elements greater than {@code lowerBound},
@@ -141,5 +152,5 @@
    * <p>The returned multiset will throw an {@link IllegalArgumentException} on attempts to add
    * elements outside its range.
    */
-  SortedMultiset<E> tailMultiset(E lowerBound, BoundType boundType);
+  SortedMultiset<E> tailMultiset(@ParametricNullness E lowerBound, BoundType boundType);
 }
diff --git a/android/guava/src/com/google/common/collect/SortedMultisetBridge.java b/android/guava/src/com/google/common/collect/SortedMultisetBridge.java
index 064cb75..72d50be 100644
--- a/android/guava/src/com/google/common/collect/SortedMultisetBridge.java
+++ b/android/guava/src/com/google/common/collect/SortedMultisetBridge.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.GwtIncompatible;
 import java.util.SortedSet;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Superinterface of {@link SortedMultiset} to introduce a bridge method for {@code elementSet()},
@@ -27,7 +28,8 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
-interface SortedMultisetBridge<E> extends Multiset<E> {
+@ElementTypesAreNonnullByDefault
+interface SortedMultisetBridge<E extends @Nullable Object> extends Multiset<E> {
   @Override
   SortedSet<E> elementSet();
 }
diff --git a/android/guava/src/com/google/common/collect/SortedMultisets.java b/android/guava/src/com/google/common/collect/SortedMultisets.java
index 3c45c9f..1d1940c 100644
--- a/android/guava/src/com/google/common/collect/SortedMultisets.java
+++ b/android/guava/src/com/google/common/collect/SortedMultisets.java
@@ -28,7 +28,8 @@
 import java.util.NavigableSet;
 import java.util.NoSuchElementException;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides static utility methods for creating and working with {@link SortedMultiset} instances.
@@ -36,11 +37,14 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class SortedMultisets {
   private SortedMultisets() {}
 
   /** A skeleton implementation for {@link SortedMultiset#elementSet}. */
-  static class ElementSet<E> extends Multisets.ElementSet<E> implements SortedSet<E> {
+  @SuppressWarnings("JdkObsolete") // TODO(b/6160855): Switch GWT emulations to NavigableSet.
+  static class ElementSet<E extends @Nullable Object> extends Multisets.ElementSet<E>
+      implements SortedSet<E> {
     @Weak private final SortedMultiset<E> multiset;
 
     ElementSet(SortedMultiset<E> multiset) {
@@ -63,26 +67,28 @@
     }
 
     @Override
-    public SortedSet<E> subSet(E fromElement, E toElement) {
+    public SortedSet<E> subSet(@ParametricNullness E fromElement, @ParametricNullness E toElement) {
       return multiset().subMultiset(fromElement, CLOSED, toElement, OPEN).elementSet();
     }
 
     @Override
-    public SortedSet<E> headSet(E toElement) {
+    public SortedSet<E> headSet(@ParametricNullness E toElement) {
       return multiset().headMultiset(toElement, OPEN).elementSet();
     }
 
     @Override
-    public SortedSet<E> tailSet(E fromElement) {
+    public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
       return multiset().tailMultiset(fromElement, CLOSED).elementSet();
     }
 
     @Override
+    @ParametricNullness
     public E first() {
       return getElementOrThrow(multiset().firstEntry());
     }
 
     @Override
+    @ParametricNullness
     public E last() {
       return getElementOrThrow(multiset().lastEntry());
     }
@@ -90,28 +96,33 @@
 
   /** A skeleton navigable implementation for {@link SortedMultiset#elementSet}. */
   @GwtIncompatible // Navigable
-  static class NavigableElementSet<E> extends ElementSet<E> implements NavigableSet<E> {
+  static class NavigableElementSet<E extends @Nullable Object> extends ElementSet<E>
+      implements NavigableSet<E> {
     NavigableElementSet(SortedMultiset<E> multiset) {
       super(multiset);
     }
 
     @Override
-    public E lower(E e) {
+    @CheckForNull
+    public E lower(@ParametricNullness E e) {
       return getElementOrNull(multiset().headMultiset(e, OPEN).lastEntry());
     }
 
     @Override
-    public E floor(E e) {
+    @CheckForNull
+    public E floor(@ParametricNullness E e) {
       return getElementOrNull(multiset().headMultiset(e, CLOSED).lastEntry());
     }
 
     @Override
-    public E ceiling(E e) {
+    @CheckForNull
+    public E ceiling(@ParametricNullness E e) {
       return getElementOrNull(multiset().tailMultiset(e, CLOSED).firstEntry());
     }
 
     @Override
-    public E higher(E e) {
+    @CheckForNull
+    public E higher(@ParametricNullness E e) {
       return getElementOrNull(multiset().tailMultiset(e, OPEN).firstEntry());
     }
 
@@ -126,18 +137,23 @@
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       return getElementOrNull(multiset().pollFirstEntry());
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       return getElementOrNull(multiset().pollLastEntry());
     }
 
     @Override
     public NavigableSet<E> subSet(
-        E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+        @ParametricNullness E fromElement,
+        boolean fromInclusive,
+        @ParametricNullness E toElement,
+        boolean toInclusive) {
       return new NavigableElementSet<E>(
           multiset()
               .subMultiset(
@@ -146,26 +162,27 @@
     }
 
     @Override
-    public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+    public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
       return new NavigableElementSet<E>(
           multiset().headMultiset(toElement, BoundType.forBoolean(inclusive)));
     }
 
     @Override
-    public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+    public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
       return new NavigableElementSet<E>(
           multiset().tailMultiset(fromElement, BoundType.forBoolean(inclusive)));
     }
   }
 
-  private static <E> E getElementOrThrow(Entry<E> entry) {
+  private static <E extends @Nullable Object> E getElementOrThrow(@CheckForNull Entry<E> entry) {
     if (entry == null) {
       throw new NoSuchElementException();
     }
     return entry.getElement();
   }
 
-  private static <E> E getElementOrNull(@NullableDecl Entry<E> entry) {
+  @CheckForNull
+  private static <E extends @Nullable Object> E getElementOrNull(@CheckForNull Entry<E> entry) {
     return (entry == null) ? null : entry.getElement();
   }
 }
diff --git a/android/guava/src/com/google/common/collect/SortedSetMultimap.java b/android/guava/src/com/google/common/collect/SortedSetMultimap.java
index 33be3d0..8449014 100644
--- a/android/guava/src/com/google/common/collect/SortedSetMultimap.java
+++ b/android/guava/src/com/google/common/collect/SortedSetMultimap.java
@@ -24,7 +24,8 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@code SetMultimap} whose set of values for a given key are kept sorted; that is, they comprise
@@ -37,6 +38,10 @@
  * Though the method signature doesn't say so explicitly, the map returned by {@link #asMap} has
  * {@code SortedSet} values.
  *
+ * <p><b>Warning:</b> As in all {@link SetMultimap}s, do not modify either a key <i>or a value</i>
+ * of a {@code SortedSetMultimap} in a way that affects its {@link Object#equals} behavior (or its
+ * position in the order of the values). Undefined behavior and bugs will result.
+ *
  * <p>See the Guava User Guide article on <a href=
  * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
  * Multimap}</a>.
@@ -45,7 +50,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public interface SortedSetMultimap<K, V> extends SetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface SortedSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends SetMultimap<K, V> {
   // Following Javadoc copied from Multimap.
 
   /**
@@ -59,7 +66,7 @@
    * {@link Multimap} interface.
    */
   @Override
-  SortedSet<V> get(@NullableDecl K key);
+  SortedSet<V> get(@ParametricNullness K key);
 
   /**
    * Removes all values associated with a given key.
@@ -70,7 +77,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  SortedSet<V> removeAll(@NullableDecl Object key);
+  SortedSet<V> removeAll(@CheckForNull Object key);
 
   /**
    * Stores a collection of values with the same key, replacing any existing values for that key.
@@ -83,7 +90,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  SortedSet<V> replaceValues(K key, Iterable<? extends V> values);
+  SortedSet<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values);
 
   /**
    * Returns a map view that associates each key with the corresponding values in the multimap.
@@ -109,5 +116,6 @@
    * Returns the comparator that orders the multimap values, with {@code null} indicating that
    * natural ordering is used.
    */
+  @CheckForNull
   Comparator<? super V> valueComparator();
 }
diff --git a/android/guava/src/com/google/common/collect/SparseImmutableTable.java b/android/guava/src/com/google/common/collect/SparseImmutableTable.java
index a7fe85d..b314f7b 100644
--- a/android/guava/src/com/google/common/collect/SparseImmutableTable.java
+++ b/android/guava/src/com/google/common/collect/SparseImmutableTable.java
@@ -14,6 +14,8 @@
 
 package com.google.common.collect;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.Immutable;
 import java.util.LinkedHashMap;
@@ -23,6 +25,7 @@
 /** A {@code RegularImmutableTable} optimized for sparse data. */
 @GwtCompatible
 @Immutable(containerOf = {"R", "C", "V"})
+@ElementTypesAreNonnullByDefault
 final class SparseImmutableTable<R, C, V> extends RegularImmutableTable<R, C, V> {
   static final ImmutableTable<Object, Object, Object> EMPTY =
       new SparseImmutableTable<>(
@@ -61,12 +64,16 @@
       C columnKey = cell.getColumnKey();
       V value = cell.getValue();
 
-      cellRowIndices[i] = rowIndex.get(rowKey);
-      Map<C, V> thisRow = rows.get(rowKey);
+      /*
+       * These requireNonNull calls are safe because we construct the maps to hold all the provided
+       * cells.
+       */
+      cellRowIndices[i] = requireNonNull(rowIndex.get(rowKey));
+      Map<C, V> thisRow = requireNonNull(rows.get(rowKey));
       cellColumnInRowIndices[i] = thisRow.size();
       V oldValue = thisRow.put(columnKey, value);
       checkNoDuplicate(rowKey, columnKey, oldValue, value);
-      columns.get(columnKey).put(rowKey, value);
+      requireNonNull(columns.get(columnKey)).put(rowKey, value);
     }
     this.cellRowIndices = cellRowIndices;
     this.cellColumnInRowIndices = cellColumnInRowIndices;
@@ -128,7 +135,8 @@
     int[] cellColumnIndices = new int[cellSet().size()];
     int i = 0;
     for (Cell<R, C, V> cell : cellSet()) {
-      cellColumnIndices[i++] = columnKeyToIndex.get(cell.getColumnKey());
+      // requireNonNull is safe because the cell exists in the table.
+      cellColumnIndices[i++] = requireNonNull(columnKeyToIndex.get(cell.getColumnKey()));
     }
     return SerializedForm.create(this, cellRowIndices, cellColumnIndices);
   }
diff --git a/android/guava/src/com/google/common/collect/StandardRowSortedTable.java b/android/guava/src/com/google/common/collect/StandardRowSortedTable.java
index 19a14c3..bea5b7b 100644
--- a/android/guava/src/com/google/common/collect/StandardRowSortedTable.java
+++ b/android/guava/src/com/google/common/collect/StandardRowSortedTable.java
@@ -26,6 +26,7 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@code Table} whose iteration ordering across row keys is sorted by their
@@ -45,6 +46,7 @@
  * @author Jared Levy
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 class StandardRowSortedTable<R, C, V> extends StandardTable<R, C, V>
     implements RowSortedTable<R, C, V> {
   /*
@@ -102,6 +104,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super R> comparator() {
       return sortedBackingMap().comparator();
     }
diff --git a/android/guava/src/com/google/common/collect/StandardTable.java b/android/guava/src/com/google/common/collect/StandardTable.java
index efed27a..4c1ffe1 100644
--- a/android/guava/src/com/google/common/collect/StandardTable.java
+++ b/android/guava/src/com/google/common/collect/StandardTable.java
@@ -23,6 +23,8 @@
 import static com.google.common.base.Predicates.not;
 import static com.google.common.collect.Maps.safeContainsKey;
 import static com.google.common.collect.Maps.safeGet;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Function;
@@ -40,7 +42,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * {@link Table} implementation backed by a map that associates row keys with column key / value
@@ -62,6 +64,7 @@
  * @author Jared Levy
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 class StandardTable<R, C, V> extends AbstractTable<R, C, V> implements Serializable {
   @GwtTransient final Map<R, Map<C, V>> backingMap;
   @GwtTransient final Supplier<? extends Map<C, V>> factory;
@@ -74,12 +77,12 @@
   // Accessors
 
   @Override
-  public boolean contains(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+  public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return rowKey != null && columnKey != null && super.contains(rowKey, columnKey);
   }
 
   @Override
-  public boolean containsColumn(@NullableDecl Object columnKey) {
+  public boolean containsColumn(@CheckForNull Object columnKey) {
     if (columnKey == null) {
       return false;
     }
@@ -92,17 +95,18 @@
   }
 
   @Override
-  public boolean containsRow(@NullableDecl Object rowKey) {
+  public boolean containsRow(@CheckForNull Object rowKey) {
     return rowKey != null && safeContainsKey(backingMap, rowKey);
   }
 
   @Override
-  public boolean containsValue(@NullableDecl Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return value != null && super.containsValue(value);
   }
 
   @Override
-  public V get(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+  @CheckForNull
+  public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return (rowKey == null || columnKey == null) ? null : super.get(rowKey, columnKey);
   }
 
@@ -138,6 +142,7 @@
 
   @CanIgnoreReturnValue
   @Override
+  @CheckForNull
   public V put(R rowKey, C columnKey, V value) {
     checkNotNull(rowKey);
     checkNotNull(columnKey);
@@ -147,7 +152,8 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+  @CheckForNull
+  public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     if ((rowKey == null) || (columnKey == null)) {
       return null;
     }
@@ -163,7 +169,7 @@
   }
 
   @CanIgnoreReturnValue
-  private Map<R, V> removeColumn(Object column) {
+  private Map<R, V> removeColumn(@CheckForNull Object column) {
     Map<R, V> output = new LinkedHashMap<>();
     Iterator<Entry<R, Map<C, V>>> iterator = backingMap.entrySet().iterator();
     while (iterator.hasNext()) {
@@ -179,12 +185,14 @@
     return output;
   }
 
-  private boolean containsMapping(Object rowKey, Object columnKey, Object value) {
+  private boolean containsMapping(
+      @CheckForNull Object rowKey, @CheckForNull Object columnKey, @CheckForNull Object value) {
     return value != null && value.equals(get(rowKey, columnKey));
   }
 
   /** Remove a row key / column key / value mapping, if present. */
-  private boolean removeMapping(Object rowKey, Object columnKey, Object value) {
+  private boolean removeMapping(
+      @CheckForNull Object rowKey, @CheckForNull Object columnKey, @CheckForNull Object value) {
     if (containsMapping(rowKey, columnKey, value)) {
       remove(rowKey, columnKey);
       return true;
@@ -232,7 +240,7 @@
 
   private class CellIterator implements Iterator<Cell<R, C, V>> {
     final Iterator<Entry<R, Map<C, V>>> rowIterator = backingMap.entrySet().iterator();
-    @NullableDecl Entry<R, Map<C, V>> rowEntry;
+    @CheckForNull Entry<R, Map<C, V>> rowEntry;
     Iterator<Entry<C, V>> columnIterator = Iterators.emptyModifiableIterator();
 
     @Override
@@ -246,6 +254,20 @@
         rowEntry = rowIterator.next();
         columnIterator = rowEntry.getValue().entrySet().iterator();
       }
+      /*
+       * requireNonNull is safe because:
+       *
+       * - columnIterator started off pointing to an empty iterator, so we must have entered the
+       *   `if` body above at least once. Thus, if we got this far, that `if` body initialized
+       *   rowEntry at least once.
+       *
+       * - The only case in which rowEntry is cleared (during remove() below) happens only if the
+       *   caller removed every element from columnIterator. During that process, we would have had
+       *   to iterate it to exhaustion. Then we can apply the logic above about an empty
+       *   columnIterator. (This assumes no concurrent modification, but behavior under concurrent
+       *   modification is undefined, anyway.)
+       */
+      requireNonNull(rowEntry);
       Entry<C, V> columnEntry = columnIterator.next();
       return Tables.immutableCell(rowEntry.getKey(), columnEntry.getKey(), columnEntry.getValue());
     }
@@ -253,7 +275,17 @@
     @Override
     public void remove() {
       columnIterator.remove();
-      if (rowEntry.getValue().isEmpty()) {
+      /*
+       * requireNonNull is safe because:
+       *
+       * - columnIterator.remove() succeeded, so it must have returned a value, so it must have been
+       * initialized by next() -- which initializes rowEntry, too.
+       *
+       * - rowEntry isn't cleared except below. If it was cleared below, then either
+       *   columnIterator.remove() would have failed above (if the user hasn't called next() since
+       *   then) or rowEntry would have been initialized by next() (as discussed above).
+       */
+      if (requireNonNull(rowEntry).getValue().isEmpty()) {
         rowIterator.remove();
         rowEntry = null;
       }
@@ -272,39 +304,43 @@
       this.rowKey = checkNotNull(rowKey);
     }
 
-    @NullableDecl Map<C, V> backingRowMap;
+    @CheckForNull Map<C, V> backingRowMap;
 
-    Map<C, V> backingRowMap() {
-      return (backingRowMap == null || (backingRowMap.isEmpty() && backingMap.containsKey(rowKey)))
-          ? backingRowMap = computeBackingRowMap()
-          : backingRowMap;
+    final void updateBackingRowMapField() {
+      if (backingRowMap == null || (backingRowMap.isEmpty() && backingMap.containsKey(rowKey))) {
+        backingRowMap = computeBackingRowMap();
+      }
     }
 
+    @CheckForNull
     Map<C, V> computeBackingRowMap() {
       return backingMap.get(rowKey);
     }
 
     // Call this every time we perform a removal.
     void maintainEmptyInvariant() {
-      if (backingRowMap() != null && backingRowMap.isEmpty()) {
+      updateBackingRowMapField();
+      if (backingRowMap != null && backingRowMap.isEmpty()) {
         backingMap.remove(rowKey);
         backingRowMap = null;
       }
     }
 
     @Override
-    public boolean containsKey(Object key) {
-      Map<C, V> backingRowMap = backingRowMap();
+    public boolean containsKey(@CheckForNull Object key) {
+      updateBackingRowMapField();
       return (key != null && backingRowMap != null) && Maps.safeContainsKey(backingRowMap, key);
     }
 
     @Override
-    public V get(Object key) {
-      Map<C, V> backingRowMap = backingRowMap();
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
+      updateBackingRowMapField();
       return (key != null && backingRowMap != null) ? Maps.safeGet(backingRowMap, key) : null;
     }
 
     @Override
+    @CheckForNull
     public V put(C key, V value) {
       checkNotNull(key);
       checkNotNull(value);
@@ -315,8 +351,9 @@
     }
 
     @Override
-    public V remove(Object key) {
-      Map<C, V> backingRowMap = backingRowMap();
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
+      updateBackingRowMapField();
       if (backingRowMap == null) {
         return null;
       }
@@ -327,7 +364,7 @@
 
     @Override
     public void clear() {
-      Map<C, V> backingRowMap = backingRowMap();
+      updateBackingRowMapField();
       if (backingRowMap != null) {
         backingRowMap.clear();
       }
@@ -336,17 +373,17 @@
 
     @Override
     public int size() {
-      Map<C, V> map = backingRowMap();
-      return (map == null) ? 0 : map.size();
+      updateBackingRowMapField();
+      return (backingRowMap == null) ? 0 : backingRowMap.size();
     }
 
     @Override
     Iterator<Entry<C, V>> entryIterator() {
-      final Map<C, V> map = backingRowMap();
-      if (map == null) {
+      updateBackingRowMapField();
+      if (backingRowMap == null) {
         return Iterators.emptyModifiableIterator();
       }
-      final Iterator<Entry<C, V>> iterator = map.entrySet().iterator();
+      final Iterator<Entry<C, V>> iterator = backingRowMap.entrySet().iterator();
       return new Iterator<Entry<C, V>>() {
         @Override
         public boolean hasNext() {
@@ -379,7 +416,7 @@
         }
 
         @Override
-        public boolean equals(Object object) {
+        public boolean equals(@CheckForNull Object object) {
           // TODO(lowasser): identify why this affects GWT tests
           return standardEquals(object);
         }
@@ -405,22 +442,25 @@
     }
 
     @Override
+    @CheckForNull
     public V put(R key, V value) {
       return StandardTable.this.put(key, columnKey, value);
     }
 
     @Override
-    public V get(Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       return StandardTable.this.get(key, columnKey);
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return StandardTable.this.contains(key, columnKey);
     }
 
     @Override
-    public V remove(Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       return StandardTable.this.remove(key, columnKey);
     }
 
@@ -478,7 +518,7 @@
       }
 
       @Override
-      public boolean contains(Object o) {
+      public boolean contains(@CheckForNull Object o) {
         if (o instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) o;
           return containsMapping(entry.getKey(), columnKey, entry.getValue());
@@ -487,7 +527,7 @@
       }
 
       @Override
-      public boolean remove(Object obj) {
+      public boolean remove(@CheckForNull Object obj) {
         if (obj instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) obj;
           return removeMapping(entry.getKey(), columnKey, entry.getValue());
@@ -505,6 +545,7 @@
       final Iterator<Entry<R, Map<C, V>>> iterator = backingMap.entrySet().iterator();
 
       @Override
+      @CheckForNull
       protected Entry<R, V> computeNext() {
         while (iterator.hasNext()) {
           final Entry<R, Map<C, V>> entry = iterator.next();
@@ -523,7 +564,22 @@
 
               @Override
               public V setValue(V value) {
-                return entry.getValue().put(columnKey, checkNotNull(value));
+                /*
+                 * The cast is safe because of the containsKey check above. (Well, it's possible for
+                 * the map to change between that call and this one. But if that happens, the
+                 * behavior is undefined because of the concurrent mutation.)
+                 *
+                 * (Our prototype checker happens to be "smart" enough to understand this for the
+                 * *get* call in getValue but not for the *put* call here.)
+                 *
+                 * (Arguably we should use requireNonNull rather than uncheckedCastNullableTToT: We
+                 * know that V is a non-null type because that's the only kind of value type that
+                 * StandardTable supports. Thus, requireNonNull is safe as long as the cell is still
+                 * present. (And if it's not present, behavior is undefined.) However, that's a
+                 * behavior change relative to the old code, so it didn't seem worth risking.)
+                 */
+                return uncheckedCastNullableTToT(
+                    entry.getValue().put(columnKey, checkNotNull(value)));
               }
             }
             return new EntryImpl();
@@ -545,12 +601,12 @@
       }
 
       @Override
-      public boolean contains(Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         return StandardTable.this.contains(obj, columnKey);
       }
 
       @Override
-      public boolean remove(Object obj) {
+      public boolean remove(@CheckForNull Object obj) {
         return StandardTable.this.remove(obj, columnKey) != null;
       }
 
@@ -572,7 +628,7 @@
       }
 
       @Override
-      public boolean remove(Object obj) {
+      public boolean remove(@CheckForNull Object obj) {
         return obj != null && removeFromColumnIf(Maps.<V>valuePredicateOnEntries(equalTo(obj)));
       }
 
@@ -593,7 +649,7 @@
     return rowMap().keySet();
   }
 
-  @NullableDecl private transient Set<C> columnKeySet;
+  @CheckForNull private transient Set<C> columnKeySet;
 
   /**
    * {@inheritDoc}
@@ -622,7 +678,7 @@
     }
 
     @Override
-    public boolean remove(Object obj) {
+    public boolean remove(@CheckForNull Object obj) {
       if (obj == null) {
         return false;
       }
@@ -677,7 +733,7 @@
     }
 
     @Override
-    public boolean contains(Object obj) {
+    public boolean contains(@CheckForNull Object obj) {
       return containsColumn(obj);
     }
   }
@@ -695,6 +751,7 @@
     Iterator<Entry<C, V>> entryIterator = Iterators.emptyIterator();
 
     @Override
+    @CheckForNull
     protected C computeNext() {
       while (true) {
         if (entryIterator.hasNext()) {
@@ -723,7 +780,7 @@
     return super.values();
   }
 
-  @NullableDecl private transient Map<R, Map<C, V>> rowMap;
+  @CheckForNull private transient Map<R, Map<C, V>> rowMap;
 
   @Override
   public Map<R, Map<C, V>> rowMap() {
@@ -738,19 +795,22 @@
   @WeakOuter
   class RowMap extends ViewCachingAbstractMap<R, Map<C, V>> {
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return containsRow(key);
     }
 
     // performing cast only when key is in backing map and has the correct type
     @SuppressWarnings("unchecked")
     @Override
-    public Map<C, V> get(Object key) {
-      return containsRow(key) ? row((R) key) : null;
+    @CheckForNull
+    public Map<C, V> get(@CheckForNull Object key) {
+      // requireNonNull is safe because of the containsRow check.
+      return containsRow(key) ? row((R) requireNonNull(key)) : null;
     }
 
     @Override
-    public Map<C, V> remove(Object key) {
+    @CheckForNull
+    public Map<C, V> remove(@CheckForNull Object key) {
       return (key == null) ? null : backingMap.remove(key);
     }
 
@@ -779,7 +839,7 @@
       }
 
       @Override
-      public boolean contains(Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         if (obj instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) obj;
           return entry.getKey() != null
@@ -790,7 +850,7 @@
       }
 
       @Override
-      public boolean remove(Object obj) {
+      public boolean remove(@CheckForNull Object obj) {
         if (obj instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) obj;
           return entry.getKey() != null
@@ -802,7 +862,7 @@
     }
   }
 
-  @NullableDecl private transient ColumnMap columnMap;
+  @CheckForNull private transient ColumnMap columnMap;
 
   @Override
   public Map<C, Map<R, V>> columnMap() {
@@ -816,17 +876,20 @@
     // has the correct type.
     @SuppressWarnings("unchecked")
     @Override
-    public Map<R, V> get(Object key) {
-      return containsColumn(key) ? column((C) key) : null;
+    @CheckForNull
+    public Map<R, V> get(@CheckForNull Object key) {
+      // requireNonNull is safe because of the containsColumn check.
+      return containsColumn(key) ? column((C) requireNonNull(key)) : null;
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return containsColumn(key);
     }
 
     @Override
-    public Map<R, V> remove(Object key) {
+    @CheckForNull
+    public Map<R, V> remove(@CheckForNull Object key) {
       return containsColumn(key) ? removeColumn(key) : null;
     }
 
@@ -865,23 +928,24 @@
       }
 
       @Override
-      public boolean contains(Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         if (obj instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) obj;
           if (containsColumn(entry.getKey())) {
-            // The cast to C occurs only when the key is in the map, implying
-            // that it has the correct type.
-            @SuppressWarnings("unchecked")
-            C columnKey = (C) entry.getKey();
-            return get(columnKey).equals(entry.getValue());
+            // requireNonNull is safe because of the containsColumn check.
+            return requireNonNull(get(entry.getKey())).equals(entry.getValue());
           }
         }
         return false;
       }
 
       @Override
-      public boolean remove(Object obj) {
-        if (contains(obj)) {
+      public boolean remove(@CheckForNull Object obj) {
+        /*
+         * `o instanceof Entry` is guaranteed by `contains`, but we check it here to satisfy our
+         * nullness checker.
+         */
+        if (contains(obj) && obj instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) obj;
           removeColumn(entry.getKey());
           return true;
@@ -922,7 +986,7 @@
       }
 
       @Override
-      public boolean remove(Object obj) {
+      public boolean remove(@CheckForNull Object obj) {
         for (Entry<C, Map<R, V>> entry : ColumnMap.this.entrySet()) {
           if (entry.getValue().equals(obj)) {
             removeColumn(entry.getKey());
diff --git a/android/guava/src/com/google/common/collect/Synchronized.java b/android/guava/src/com/google/common/collect/Synchronized.java
index c4cdb17..42bf611 100644
--- a/android/guava/src/com/google/common/collect/Synchronized.java
+++ b/android/guava/src/com/google/common/collect/Synchronized.java
@@ -32,7 +32,6 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.NavigableMap;
 import java.util.NavigableSet;
 import java.util.Queue;
@@ -40,7 +39,8 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Synchronized collection views. The returned synchronized collection views are serializable if the
@@ -55,6 +55,16 @@
  * @author Jared Levy
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
+/*
+ * I have decided not to bother adding @ParametricNullness annotations in this class. Adding them is
+ * a lot of busy work, and the annotation matters only when the APIs to be annotated are visible to
+ * Kotlin code. In this class, nothing is publicly visible (nor exposed indirectly through a
+ * publicly visible subclass), and I doubt any of our current or future Kotlin extensions for the
+ * package will refer to the class. Plus, @ParametricNullness is only a temporary workaround,
+ * anyway, so we just need to get by without the annotations here until Kotlin better understands
+ * our other nullness annotations.
+ */
 final class Synchronized {
   private Synchronized() {}
 
@@ -62,7 +72,7 @@
     final Object delegate;
     final Object mutex;
 
-    SynchronizedObject(Object delegate, @NullableDecl Object mutex) {
+    SynchronizedObject(Object delegate, @CheckForNull Object mutex) {
       this.delegate = checkNotNull(delegate);
       this.mutex = (mutex == null) ? this : mutex;
     }
@@ -96,14 +106,15 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static <E> Collection<E> collection(
-      Collection<E> collection, @NullableDecl Object mutex) {
+  private static <E extends @Nullable Object> Collection<E> collection(
+      Collection<E> collection, @CheckForNull Object mutex) {
     return new SynchronizedCollection<E>(collection, mutex);
   }
 
   @VisibleForTesting
-  static class SynchronizedCollection<E> extends SynchronizedObject implements Collection<E> {
-    private SynchronizedCollection(Collection<E> delegate, @NullableDecl Object mutex) {
+  static class SynchronizedCollection<E extends @Nullable Object> extends SynchronizedObject
+      implements Collection<E> {
+    private SynchronizedCollection(Collection<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -135,7 +146,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().contains(o);
       }
@@ -161,7 +172,7 @@
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().remove(o);
       }
@@ -189,14 +200,15 @@
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       synchronized (mutex) {
         return delegate().toArray();
       }
     }
 
     @Override
-    public <T> T[] toArray(T[] a) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] a) {
       synchronized (mutex) {
         return delegate().toArray(a);
       }
@@ -206,13 +218,14 @@
   }
 
   @VisibleForTesting
-  static <E> Set<E> set(Set<E> set, @NullableDecl Object mutex) {
+  static <E extends @Nullable Object> Set<E> set(Set<E> set, @CheckForNull Object mutex) {
     return new SynchronizedSet<E>(set, mutex);
   }
 
-  static class SynchronizedSet<E> extends SynchronizedCollection<E> implements Set<E> {
+  static class SynchronizedSet<E extends @Nullable Object> extends SynchronizedCollection<E>
+      implements Set<E> {
 
-    SynchronizedSet(Set<E> delegate, @NullableDecl Object mutex) {
+    SynchronizedSet(Set<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -222,7 +235,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -241,12 +254,14 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static <E> SortedSet<E> sortedSet(SortedSet<E> set, @NullableDecl Object mutex) {
+  private static <E extends @Nullable Object> SortedSet<E> sortedSet(
+      SortedSet<E> set, @CheckForNull Object mutex) {
     return new SynchronizedSortedSet<E>(set, mutex);
   }
 
-  static class SynchronizedSortedSet<E> extends SynchronizedSet<E> implements SortedSet<E> {
-    SynchronizedSortedSet(SortedSet<E> delegate, @NullableDecl Object mutex) {
+  static class SynchronizedSortedSet<E extends @Nullable Object> extends SynchronizedSet<E>
+      implements SortedSet<E> {
+    SynchronizedSortedSet(SortedSet<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -256,6 +271,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super E> comparator() {
       synchronized (mutex) {
         return delegate().comparator();
@@ -300,14 +316,16 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static <E> List<E> list(List<E> list, @NullableDecl Object mutex) {
+  private static <E extends @Nullable Object> List<E> list(
+      List<E> list, @CheckForNull Object mutex) {
     return (list instanceof RandomAccess)
         ? new SynchronizedRandomAccessList<E>(list, mutex)
         : new SynchronizedList<E>(list, mutex);
   }
 
-  private static class SynchronizedList<E> extends SynchronizedCollection<E> implements List<E> {
-    SynchronizedList(List<E> delegate, @NullableDecl Object mutex) {
+  private static class SynchronizedList<E extends @Nullable Object>
+      extends SynchronizedCollection<E> implements List<E> {
+    SynchronizedList(List<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -338,14 +356,14 @@
     }
 
     @Override
-    public int indexOf(Object o) {
+    public int indexOf(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().indexOf(o);
       }
     }
 
     @Override
-    public int lastIndexOf(Object o) {
+    public int lastIndexOf(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().lastIndexOf(o);
       }
@@ -383,7 +401,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -402,28 +420,29 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static class SynchronizedRandomAccessList<E> extends SynchronizedList<E>
-      implements RandomAccess {
-    SynchronizedRandomAccessList(List<E> list, @NullableDecl Object mutex) {
+  private static class SynchronizedRandomAccessList<E extends @Nullable Object>
+      extends SynchronizedList<E> implements RandomAccess {
+    SynchronizedRandomAccessList(List<E> list, @CheckForNull Object mutex) {
       super(list, mutex);
     }
 
     private static final long serialVersionUID = 0;
   }
 
-  static <E> Multiset<E> multiset(Multiset<E> multiset, @NullableDecl Object mutex) {
+  static <E extends @Nullable Object> Multiset<E> multiset(
+      Multiset<E> multiset, @CheckForNull Object mutex) {
     if (multiset instanceof SynchronizedMultiset || multiset instanceof ImmutableMultiset) {
       return multiset;
     }
     return new SynchronizedMultiset<E>(multiset, mutex);
   }
 
-  private static class SynchronizedMultiset<E> extends SynchronizedCollection<E>
-      implements Multiset<E> {
-    @NullableDecl transient Set<E> elementSet;
-    @NullableDecl transient Set<Entry<E>> entrySet;
+  private static class SynchronizedMultiset<E extends @Nullable Object>
+      extends SynchronizedCollection<E> implements Multiset<E> {
+    @CheckForNull transient Set<E> elementSet;
+    @CheckForNull transient Set<Multiset.Entry<E>> entrySet;
 
-    SynchronizedMultiset(Multiset<E> delegate, @NullableDecl Object mutex) {
+    SynchronizedMultiset(Multiset<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -433,7 +452,7 @@
     }
 
     @Override
-    public int count(Object o) {
+    public int count(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().count(o);
       }
@@ -447,7 +466,7 @@
     }
 
     @Override
-    public int remove(Object o, int n) {
+    public int remove(@CheckForNull Object o, int n) {
       synchronized (mutex) {
         return delegate().remove(o, n);
       }
@@ -478,7 +497,7 @@
     }
 
     @Override
-    public Set<Entry<E>> entrySet() {
+    public Set<Multiset.Entry<E>> entrySet() {
       synchronized (mutex) {
         if (entrySet == null) {
           entrySet = typePreservingSet(delegate().entrySet(), mutex);
@@ -488,7 +507,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -507,20 +526,21 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> Multimap<K, V> multimap(Multimap<K, V> multimap, @NullableDecl Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> Multimap<K, V> multimap(
+      Multimap<K, V> multimap, @CheckForNull Object mutex) {
     if (multimap instanceof SynchronizedMultimap || multimap instanceof BaseImmutableMultimap) {
       return multimap;
     }
     return new SynchronizedMultimap<>(multimap, mutex);
   }
 
-  private static class SynchronizedMultimap<K, V> extends SynchronizedObject
-      implements Multimap<K, V> {
-    @NullableDecl transient Set<K> keySet;
-    @NullableDecl transient Collection<V> valuesCollection;
-    @NullableDecl transient Collection<Entry<K, V>> entries;
-    @NullableDecl transient Map<K, Collection<V>> asMap;
-    @NullableDecl transient Multiset<K> keys;
+  private static class SynchronizedMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedObject implements Multimap<K, V> {
+    @CheckForNull transient Set<K> keySet;
+    @CheckForNull transient Collection<V> valuesCollection;
+    @CheckForNull transient Collection<Map.Entry<K, V>> entries;
+    @CheckForNull transient Map<K, Collection<V>> asMap;
+    @CheckForNull transient Multiset<K> keys;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -528,7 +548,7 @@
       return (Multimap<K, V>) super.delegate();
     }
 
-    SynchronizedMultimap(Multimap<K, V> delegate, @NullableDecl Object mutex) {
+    SynchronizedMultimap(Multimap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -547,21 +567,21 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().containsKey(key);
       }
     }
 
     @Override
-    public boolean containsValue(Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       synchronized (mutex) {
         return delegate().containsValue(value);
       }
     }
 
     @Override
-    public boolean containsEntry(Object key, Object value) {
+    public boolean containsEntry(@CheckForNull Object key, @CheckForNull Object value) {
       synchronized (mutex) {
         return delegate().containsEntry(key, value);
       }
@@ -603,14 +623,14 @@
     }
 
     @Override
-    public boolean remove(Object key, Object value) {
+    public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
       synchronized (mutex) {
         return delegate().remove(key, value);
       }
     }
 
     @Override
-    public Collection<V> removeAll(Object key) {
+    public Collection<V> removeAll(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().removeAll(key); // copy not synchronized
       }
@@ -644,7 +664,7 @@
     }
 
     @Override
-    public Collection<Entry<K, V>> entries() {
+    public Collection<Map.Entry<K, V>> entries() {
       synchronized (mutex) {
         if (entries == null) {
           entries = typePreservingCollection(delegate().entries(), mutex);
@@ -674,7 +694,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -693,17 +713,18 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> ListMultimap<K, V> listMultimap(
-      ListMultimap<K, V> multimap, @NullableDecl Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> ListMultimap<K, V> listMultimap(
+      ListMultimap<K, V> multimap, @CheckForNull Object mutex) {
     if (multimap instanceof SynchronizedListMultimap || multimap instanceof BaseImmutableMultimap) {
       return multimap;
     }
     return new SynchronizedListMultimap<>(multimap, mutex);
   }
 
-  private static class SynchronizedListMultimap<K, V> extends SynchronizedMultimap<K, V>
-      implements ListMultimap<K, V> {
-    SynchronizedListMultimap(ListMultimap<K, V> delegate, @NullableDecl Object mutex) {
+  private static class SynchronizedListMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedMultimap<K, V> implements ListMultimap<K, V> {
+    SynchronizedListMultimap(ListMultimap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -720,7 +741,7 @@
     }
 
     @Override
-    public List<V> removeAll(Object key) {
+    public List<V> removeAll(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().removeAll(key); // copy not synchronized
       }
@@ -736,19 +757,20 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> SetMultimap<K, V> setMultimap(
-      SetMultimap<K, V> multimap, @NullableDecl Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> SetMultimap<K, V> setMultimap(
+      SetMultimap<K, V> multimap, @CheckForNull Object mutex) {
     if (multimap instanceof SynchronizedSetMultimap || multimap instanceof BaseImmutableMultimap) {
       return multimap;
     }
     return new SynchronizedSetMultimap<>(multimap, mutex);
   }
 
-  private static class SynchronizedSetMultimap<K, V> extends SynchronizedMultimap<K, V>
-      implements SetMultimap<K, V> {
-    @NullableDecl transient Set<Entry<K, V>> entrySet;
+  private static class SynchronizedSetMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedMultimap<K, V> implements SetMultimap<K, V> {
+    @CheckForNull transient Set<Map.Entry<K, V>> entrySet;
 
-    SynchronizedSetMultimap(SetMultimap<K, V> delegate, @NullableDecl Object mutex) {
+    SynchronizedSetMultimap(SetMultimap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -765,7 +787,7 @@
     }
 
     @Override
-    public Set<V> removeAll(Object key) {
+    public Set<V> removeAll(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().removeAll(key); // copy not synchronized
       }
@@ -779,7 +801,7 @@
     }
 
     @Override
-    public Set<Entry<K, V>> entries() {
+    public Set<Map.Entry<K, V>> entries() {
       synchronized (mutex) {
         if (entrySet == null) {
           entrySet = set(delegate().entries(), mutex);
@@ -791,17 +813,19 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> SortedSetMultimap<K, V> sortedSetMultimap(
-      SortedSetMultimap<K, V> multimap, @NullableDecl Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedSetMultimap<K, V> sortedSetMultimap(
+          SortedSetMultimap<K, V> multimap, @CheckForNull Object mutex) {
     if (multimap instanceof SynchronizedSortedSetMultimap) {
       return multimap;
     }
     return new SynchronizedSortedSetMultimap<>(multimap, mutex);
   }
 
-  private static class SynchronizedSortedSetMultimap<K, V> extends SynchronizedSetMultimap<K, V>
-      implements SortedSetMultimap<K, V> {
-    SynchronizedSortedSetMultimap(SortedSetMultimap<K, V> delegate, @NullableDecl Object mutex) {
+  private static class SynchronizedSortedSetMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedSetMultimap<K, V> implements SortedSetMultimap<K, V> {
+    SynchronizedSortedSetMultimap(SortedSetMultimap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -818,7 +842,7 @@
     }
 
     @Override
-    public SortedSet<V> removeAll(Object key) {
+    public SortedSet<V> removeAll(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().removeAll(key); // copy not synchronized
       }
@@ -832,6 +856,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super V> valueComparator() {
       synchronized (mutex) {
         return delegate().valueComparator();
@@ -841,8 +866,8 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static <E> Collection<E> typePreservingCollection(
-      Collection<E> collection, @NullableDecl Object mutex) {
+  private static <E extends @Nullable Object> Collection<E> typePreservingCollection(
+      Collection<E> collection, @CheckForNull Object mutex) {
     if (collection instanceof SortedSet) {
       return sortedSet((SortedSet<E>) collection, mutex);
     }
@@ -855,7 +880,8 @@
     return collection(collection, mutex);
   }
 
-  private static <E> Set<E> typePreservingSet(Set<E> set, @NullableDecl Object mutex) {
+  private static <E extends @Nullable Object> Set<E> typePreservingSet(
+      Set<E> set, @CheckForNull Object mutex) {
     if (set instanceof SortedSet) {
       return sortedSet((SortedSet<E>) set, mutex);
     } else {
@@ -863,22 +889,24 @@
     }
   }
 
-  private static class SynchronizedAsMapEntries<K, V>
-      extends SynchronizedSet<Entry<K, Collection<V>>> {
-    SynchronizedAsMapEntries(Set<Entry<K, Collection<V>>> delegate, @NullableDecl Object mutex) {
+  private static class SynchronizedAsMapEntries<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedSet<Map.Entry<K, Collection<V>>> {
+    SynchronizedAsMapEntries(
+        Set<Map.Entry<K, Collection<V>>> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
     @Override
-    public Iterator<Entry<K, Collection<V>>> iterator() {
+    public Iterator<Map.Entry<K, Collection<V>>> iterator() {
       // Must be manually synchronized.
-      return new TransformedIterator<Entry<K, Collection<V>>, Entry<K, Collection<V>>>(
+      return new TransformedIterator<Map.Entry<K, Collection<V>>, Map.Entry<K, Collection<V>>>(
           super.iterator()) {
         @Override
-        Entry<K, Collection<V>> transform(final Entry<K, Collection<V>> entry) {
+        Map.Entry<K, Collection<V>> transform(final Map.Entry<K, Collection<V>> entry) {
           return new ForwardingMapEntry<K, Collection<V>>() {
             @Override
-            protected Entry<K, Collection<V>> delegate() {
+            protected Map.Entry<K, Collection<V>> delegate() {
               return entry;
             }
 
@@ -896,19 +924,27 @@
     @Override
     public Object[] toArray() {
       synchronized (mutex) {
-        return ObjectArrays.toArrayImpl(delegate());
+        /*
+         * toArrayImpl returns `@Nullable Object[]` rather than `Object[]` but only because it can
+         * be used with collections that may contain null. This collection never contains nulls, so
+         * we can treat it as a plain `Object[]`.
+         */
+        @SuppressWarnings("nullness")
+        Object[] result = (Object[]) ObjectArrays.toArrayImpl(delegate());
+        return result;
       }
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       synchronized (mutex) {
         return ObjectArrays.toArrayImpl(delegate(), array);
       }
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       synchronized (mutex) {
         return Maps.containsEntryImpl(delegate(), o);
       }
@@ -922,7 +958,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -932,7 +968,7 @@
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       synchronized (mutex) {
         return Maps.removeEntryImpl(delegate(), o);
       }
@@ -956,16 +992,18 @@
   }
 
   @VisibleForTesting
-  static <K, V> Map<K, V> map(Map<K, V> map, @NullableDecl Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> map(
+      Map<K, V> map, @CheckForNull Object mutex) {
     return new SynchronizedMap<>(map, mutex);
   }
 
-  private static class SynchronizedMap<K, V> extends SynchronizedObject implements Map<K, V> {
-    @NullableDecl transient Set<K> keySet;
-    @NullableDecl transient Collection<V> values;
-    @NullableDecl transient Set<Entry<K, V>> entrySet;
+  private static class SynchronizedMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedObject implements Map<K, V> {
+    @CheckForNull transient Set<K> keySet;
+    @CheckForNull transient Collection<V> values;
+    @CheckForNull transient Set<Map.Entry<K, V>> entrySet;
 
-    SynchronizedMap(Map<K, V> delegate, @NullableDecl Object mutex) {
+    SynchronizedMap(Map<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -983,21 +1021,21 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().containsKey(key);
       }
     }
 
     @Override
-    public boolean containsValue(Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       synchronized (mutex) {
         return delegate().containsValue(value);
       }
     }
 
     @Override
-    public Set<Entry<K, V>> entrySet() {
+    public Set<Map.Entry<K, V>> entrySet() {
       synchronized (mutex) {
         if (entrySet == null) {
           entrySet = set(delegate().entrySet(), mutex);
@@ -1007,7 +1045,8 @@
     }
 
     @Override
-    public V get(Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().get(key);
       }
@@ -1031,6 +1070,7 @@
     }
 
     @Override
+    @CheckForNull
     public V put(K key, V value) {
       synchronized (mutex) {
         return delegate().put(key, value);
@@ -1045,7 +1085,8 @@
     }
 
     @Override
-    public V remove(Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().remove(key);
       }
@@ -1069,7 +1110,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -1088,14 +1129,15 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> SortedMap<K, V> sortedMap(SortedMap<K, V> sortedMap, @NullableDecl Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> SortedMap<K, V> sortedMap(
+      SortedMap<K, V> sortedMap, @CheckForNull Object mutex) {
     return new SynchronizedSortedMap<>(sortedMap, mutex);
   }
 
-  static class SynchronizedSortedMap<K, V> extends SynchronizedMap<K, V>
-      implements SortedMap<K, V> {
+  static class SynchronizedSortedMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedMap<K, V> implements SortedMap<K, V> {
 
-    SynchronizedSortedMap(SortedMap<K, V> delegate, @NullableDecl Object mutex) {
+    SynchronizedSortedMap(SortedMap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1105,6 +1147,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       synchronized (mutex) {
         return delegate().comparator();
@@ -1149,7 +1192,8 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> BiMap<K, V> biMap(BiMap<K, V> bimap, @NullableDecl Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> BiMap<K, V> biMap(
+      BiMap<K, V> bimap, @CheckForNull Object mutex) {
     if (bimap instanceof SynchronizedBiMap || bimap instanceof ImmutableBiMap) {
       return bimap;
     }
@@ -1157,13 +1201,13 @@
   }
 
   @VisibleForTesting
-  static class SynchronizedBiMap<K, V> extends SynchronizedMap<K, V>
-      implements BiMap<K, V>, Serializable {
-    @NullableDecl private transient Set<V> valueSet;
-    @RetainedWith @NullableDecl private transient BiMap<V, K> inverse;
+  static class SynchronizedBiMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedMap<K, V> implements BiMap<K, V>, Serializable {
+    @CheckForNull private transient Set<V> valueSet;
+    @RetainedWith @CheckForNull private transient BiMap<V, K> inverse;
 
     private SynchronizedBiMap(
-        BiMap<K, V> delegate, @NullableDecl Object mutex, @NullableDecl BiMap<V, K> inverse) {
+        BiMap<K, V> delegate, @CheckForNull Object mutex, @CheckForNull BiMap<V, K> inverse) {
       super(delegate, mutex);
       this.inverse = inverse;
     }
@@ -1184,6 +1228,7 @@
     }
 
     @Override
+    @CheckForNull
     public V forcePut(K key, V value) {
       synchronized (mutex) {
         return delegate().forcePut(key, value);
@@ -1203,16 +1248,18 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static class SynchronizedAsMap<K, V> extends SynchronizedMap<K, Collection<V>> {
-    @NullableDecl transient Set<Entry<K, Collection<V>>> asMapEntrySet;
-    @NullableDecl transient Collection<Collection<V>> asMapValues;
+  private static class SynchronizedAsMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedMap<K, Collection<V>> {
+    @CheckForNull transient Set<Map.Entry<K, Collection<V>>> asMapEntrySet;
+    @CheckForNull transient Collection<Collection<V>> asMapValues;
 
-    SynchronizedAsMap(Map<K, Collection<V>> delegate, @NullableDecl Object mutex) {
+    SynchronizedAsMap(Map<K, Collection<V>> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
     @Override
-    public Collection<V> get(Object key) {
+    @CheckForNull
+    public Collection<V> get(@CheckForNull Object key) {
       synchronized (mutex) {
         Collection<V> collection = super.get(key);
         return (collection == null) ? null : typePreservingCollection(collection, mutex);
@@ -1220,7 +1267,7 @@
     }
 
     @Override
-    public Set<Entry<K, Collection<V>>> entrySet() {
+    public Set<Map.Entry<K, Collection<V>>> entrySet() {
       synchronized (mutex) {
         if (asMapEntrySet == null) {
           asMapEntrySet = new SynchronizedAsMapEntries<>(delegate().entrySet(), mutex);
@@ -1240,7 +1287,7 @@
     }
 
     @Override
-    public boolean containsValue(Object o) {
+    public boolean containsValue(@CheckForNull Object o) {
       // values() and its contains() method are both synchronized.
       return values().contains(o);
     }
@@ -1248,8 +1295,9 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static class SynchronizedAsMapValues<V> extends SynchronizedCollection<Collection<V>> {
-    SynchronizedAsMapValues(Collection<Collection<V>> delegate, @NullableDecl Object mutex) {
+  private static class SynchronizedAsMapValues<V extends @Nullable Object>
+      extends SynchronizedCollection<Collection<V>> {
+    SynchronizedAsMapValues(Collection<Collection<V>> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1269,9 +1317,9 @@
 
   @GwtIncompatible // NavigableSet
   @VisibleForTesting
-  static class SynchronizedNavigableSet<E> extends SynchronizedSortedSet<E>
+  static class SynchronizedNavigableSet<E extends @Nullable Object> extends SynchronizedSortedSet<E>
       implements NavigableSet<E> {
-    SynchronizedNavigableSet(NavigableSet<E> delegate, @NullableDecl Object mutex) {
+    SynchronizedNavigableSet(NavigableSet<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1281,6 +1329,7 @@
     }
 
     @Override
+    @CheckForNull
     public E ceiling(E e) {
       synchronized (mutex) {
         return delegate().ceiling(e);
@@ -1292,7 +1341,7 @@
       return delegate().descendingIterator(); // manually synchronized
     }
 
-    @NullableDecl transient NavigableSet<E> descendingSet;
+    @CheckForNull transient NavigableSet<E> descendingSet;
 
     @Override
     public NavigableSet<E> descendingSet() {
@@ -1307,6 +1356,7 @@
     }
 
     @Override
+    @CheckForNull
     public E floor(E e) {
       synchronized (mutex) {
         return delegate().floor(e);
@@ -1326,6 +1376,7 @@
     }
 
     @Override
+    @CheckForNull
     public E higher(E e) {
       synchronized (mutex) {
         return delegate().higher(e);
@@ -1333,6 +1384,7 @@
     }
 
     @Override
+    @CheckForNull
     public E lower(E e) {
       synchronized (mutex) {
         return delegate().lower(e);
@@ -1340,6 +1392,7 @@
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       synchronized (mutex) {
         return delegate().pollFirst();
@@ -1347,6 +1400,7 @@
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       synchronized (mutex) {
         return delegate().pollLast();
@@ -1383,33 +1437,34 @@
   }
 
   @GwtIncompatible // NavigableSet
-  static <E> NavigableSet<E> navigableSet(
-      NavigableSet<E> navigableSet, @NullableDecl Object mutex) {
+  static <E extends @Nullable Object> NavigableSet<E> navigableSet(
+      NavigableSet<E> navigableSet, @CheckForNull Object mutex) {
     return new SynchronizedNavigableSet<E>(navigableSet, mutex);
   }
 
   @GwtIncompatible // NavigableSet
-  static <E> NavigableSet<E> navigableSet(NavigableSet<E> navigableSet) {
+  static <E extends @Nullable Object> NavigableSet<E> navigableSet(NavigableSet<E> navigableSet) {
     return navigableSet(navigableSet, null);
   }
 
   @GwtIncompatible // NavigableMap
-  static <K, V> NavigableMap<K, V> navigableMap(NavigableMap<K, V> navigableMap) {
+  static <K extends @Nullable Object, V extends @Nullable Object> NavigableMap<K, V> navigableMap(
+      NavigableMap<K, V> navigableMap) {
     return navigableMap(navigableMap, null);
   }
 
   @GwtIncompatible // NavigableMap
-  static <K, V> NavigableMap<K, V> navigableMap(
-      NavigableMap<K, V> navigableMap, @NullableDecl Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> NavigableMap<K, V> navigableMap(
+      NavigableMap<K, V> navigableMap, @CheckForNull Object mutex) {
     return new SynchronizedNavigableMap<>(navigableMap, mutex);
   }
 
   @GwtIncompatible // NavigableMap
   @VisibleForTesting
-  static class SynchronizedNavigableMap<K, V> extends SynchronizedSortedMap<K, V>
-      implements NavigableMap<K, V> {
+  static class SynchronizedNavigableMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedSortedMap<K, V> implements NavigableMap<K, V> {
 
-    SynchronizedNavigableMap(NavigableMap<K, V> delegate, @NullableDecl Object mutex) {
+    SynchronizedNavigableMap(NavigableMap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1419,20 +1474,22 @@
     }
 
     @Override
-    public Entry<K, V> ceilingEntry(K key) {
+    @CheckForNull
+    public Map.Entry<K, V> ceilingEntry(K key) {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().ceilingEntry(key), mutex);
       }
     }
 
     @Override
+    @CheckForNull
     public K ceilingKey(K key) {
       synchronized (mutex) {
         return delegate().ceilingKey(key);
       }
     }
 
-    @NullableDecl transient NavigableSet<K> descendingKeySet;
+    @CheckForNull transient NavigableSet<K> descendingKeySet;
 
     @Override
     public NavigableSet<K> descendingKeySet() {
@@ -1444,7 +1501,7 @@
       }
     }
 
-    @NullableDecl transient NavigableMap<K, V> descendingMap;
+    @CheckForNull transient NavigableMap<K, V> descendingMap;
 
     @Override
     public NavigableMap<K, V> descendingMap() {
@@ -1457,20 +1514,23 @@
     }
 
     @Override
-    public Entry<K, V> firstEntry() {
+    @CheckForNull
+    public Map.Entry<K, V> firstEntry() {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().firstEntry(), mutex);
       }
     }
 
     @Override
-    public Entry<K, V> floorEntry(K key) {
+    @CheckForNull
+    public Map.Entry<K, V> floorEntry(K key) {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().floorEntry(key), mutex);
       }
     }
 
     @Override
+    @CheckForNull
     public K floorKey(K key) {
       synchronized (mutex) {
         return delegate().floorKey(key);
@@ -1490,13 +1550,15 @@
     }
 
     @Override
-    public Entry<K, V> higherEntry(K key) {
+    @CheckForNull
+    public Map.Entry<K, V> higherEntry(K key) {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().higherEntry(key), mutex);
       }
     }
 
     @Override
+    @CheckForNull
     public K higherKey(K key) {
       synchronized (mutex) {
         return delegate().higherKey(key);
@@ -1504,20 +1566,23 @@
     }
 
     @Override
-    public Entry<K, V> lastEntry() {
+    @CheckForNull
+    public Map.Entry<K, V> lastEntry() {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().lastEntry(), mutex);
       }
     }
 
     @Override
-    public Entry<K, V> lowerEntry(K key) {
+    @CheckForNull
+    public Map.Entry<K, V> lowerEntry(K key) {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().lowerEntry(key), mutex);
       }
     }
 
     @Override
+    @CheckForNull
     public K lowerKey(K key) {
       synchronized (mutex) {
         return delegate().lowerKey(key);
@@ -1529,7 +1594,7 @@
       return navigableKeySet();
     }
 
-    @NullableDecl transient NavigableSet<K> navigableKeySet;
+    @CheckForNull transient NavigableSet<K> navigableKeySet;
 
     @Override
     public NavigableSet<K> navigableKeySet() {
@@ -1542,14 +1607,16 @@
     }
 
     @Override
-    public Entry<K, V> pollFirstEntry() {
+    @CheckForNull
+    public Map.Entry<K, V> pollFirstEntry() {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().pollFirstEntry(), mutex);
       }
     }
 
     @Override
-    public Entry<K, V> pollLastEntry() {
+    @CheckForNull
+    public Map.Entry<K, V> pollLastEntry() {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().pollLastEntry(), mutex);
       }
@@ -1584,8 +1651,10 @@
   }
 
   @GwtIncompatible // works but is needed only for NavigableMap
-  private static <K, V> Entry<K, V> nullableSynchronizedEntry(
-      @NullableDecl Entry<K, V> entry, @NullableDecl Object mutex) {
+  @CheckForNull
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      Map.Entry<K, V> nullableSynchronizedEntry(
+          @CheckForNull Map.Entry<K, V> entry, @CheckForNull Object mutex) {
     if (entry == null) {
       return null;
     }
@@ -1593,20 +1662,21 @@
   }
 
   @GwtIncompatible // works but is needed only for NavigableMap
-  private static class SynchronizedEntry<K, V> extends SynchronizedObject implements Entry<K, V> {
+  private static class SynchronizedEntry<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedObject implements Map.Entry<K, V> {
 
-    SynchronizedEntry(Entry<K, V> delegate, @NullableDecl Object mutex) {
+    SynchronizedEntry(Map.Entry<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
     @SuppressWarnings("unchecked") // guaranteed by the constructor
     @Override
-    Entry<K, V> delegate() {
-      return (Entry<K, V>) super.delegate();
+    Map.Entry<K, V> delegate() {
+      return (Map.Entry<K, V>) super.delegate();
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       synchronized (mutex) {
         return delegate().equals(obj);
       }
@@ -1643,13 +1713,14 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <E> Queue<E> queue(Queue<E> queue, @NullableDecl Object mutex) {
+  static <E extends @Nullable Object> Queue<E> queue(Queue<E> queue, @CheckForNull Object mutex) {
     return (queue instanceof SynchronizedQueue) ? queue : new SynchronizedQueue<E>(queue, mutex);
   }
 
-  private static class SynchronizedQueue<E> extends SynchronizedCollection<E> implements Queue<E> {
+  private static class SynchronizedQueue<E extends @Nullable Object>
+      extends SynchronizedCollection<E> implements Queue<E> {
 
-    SynchronizedQueue(Queue<E> delegate, @NullableDecl Object mutex) {
+    SynchronizedQueue(Queue<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1673,6 +1744,7 @@
     }
 
     @Override
+    @CheckForNull
     public E peek() {
       synchronized (mutex) {
         return delegate().peek();
@@ -1680,6 +1752,7 @@
     }
 
     @Override
+    @CheckForNull
     public E poll() {
       synchronized (mutex) {
         return delegate().poll();
@@ -1696,13 +1769,14 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <E> Deque<E> deque(Deque<E> deque, @NullableDecl Object mutex) {
+  static <E extends @Nullable Object> Deque<E> deque(Deque<E> deque, @CheckForNull Object mutex) {
     return new SynchronizedDeque<E>(deque, mutex);
   }
 
-  private static final class SynchronizedDeque<E> extends SynchronizedQueue<E> implements Deque<E> {
+  private static final class SynchronizedDeque<E extends @Nullable Object>
+      extends SynchronizedQueue<E> implements Deque<E> {
 
-    SynchronizedDeque(Deque<E> delegate, @NullableDecl Object mutex) {
+    SynchronizedDeque(Deque<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1754,6 +1828,7 @@
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       synchronized (mutex) {
         return delegate().pollFirst();
@@ -1761,6 +1836,7 @@
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       synchronized (mutex) {
         return delegate().pollLast();
@@ -1782,6 +1858,7 @@
     }
 
     @Override
+    @CheckForNull
     public E peekFirst() {
       synchronized (mutex) {
         return delegate().peekFirst();
@@ -1789,6 +1866,7 @@
     }
 
     @Override
+    @CheckForNull
     public E peekLast() {
       synchronized (mutex) {
         return delegate().peekLast();
@@ -1796,14 +1874,14 @@
     }
 
     @Override
-    public boolean removeFirstOccurrence(Object o) {
+    public boolean removeFirstOccurrence(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().removeFirstOccurrence(o);
       }
     }
 
     @Override
-    public boolean removeLastOccurrence(Object o) {
+    public boolean removeLastOccurrence(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().removeLastOccurrence(o);
       }
@@ -1833,14 +1911,16 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <R, C, V> Table<R, C, V> table(Table<R, C, V> table, Object mutex) {
+  static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      Table<R, C, V> table(Table<R, C, V> table, @CheckForNull Object mutex) {
     return new SynchronizedTable<>(table, mutex);
   }
 
-  private static final class SynchronizedTable<R, C, V> extends SynchronizedObject
-      implements Table<R, C, V> {
+  private static final class SynchronizedTable<
+          R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedObject implements Table<R, C, V> {
 
-    SynchronizedTable(Table<R, C, V> delegate, Object mutex) {
+    SynchronizedTable(Table<R, C, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1851,35 +1931,36 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+    public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       synchronized (mutex) {
         return delegate().contains(rowKey, columnKey);
       }
     }
 
     @Override
-    public boolean containsRow(@NullableDecl Object rowKey) {
+    public boolean containsRow(@CheckForNull Object rowKey) {
       synchronized (mutex) {
         return delegate().containsRow(rowKey);
       }
     }
 
     @Override
-    public boolean containsColumn(@NullableDecl Object columnKey) {
+    public boolean containsColumn(@CheckForNull Object columnKey) {
       synchronized (mutex) {
         return delegate().containsColumn(columnKey);
       }
     }
 
     @Override
-    public boolean containsValue(@NullableDecl Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       synchronized (mutex) {
         return delegate().containsValue(value);
       }
     }
 
     @Override
-    public V get(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+    @CheckForNull
+    public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       synchronized (mutex) {
         return delegate().get(rowKey, columnKey);
       }
@@ -1907,7 +1988,8 @@
     }
 
     @Override
-    public V put(@NullableDecl R rowKey, @NullableDecl C columnKey, @NullableDecl V value) {
+    @CheckForNull
+    public V put(R rowKey, C columnKey, V value) {
       synchronized (mutex) {
         return delegate().put(rowKey, columnKey, value);
       }
@@ -1921,21 +2003,22 @@
     }
 
     @Override
-    public V remove(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+    @CheckForNull
+    public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       synchronized (mutex) {
         return delegate().remove(rowKey, columnKey);
       }
     }
 
     @Override
-    public Map<C, V> row(@NullableDecl R rowKey) {
+    public Map<C, V> row(R rowKey) {
       synchronized (mutex) {
         return map(delegate().row(rowKey), mutex);
       }
     }
 
     @Override
-    public Map<R, V> column(@NullableDecl C columnKey) {
+    public Map<R, V> column(C columnKey) {
       synchronized (mutex) {
         return map(delegate().column(columnKey), mutex);
       }
@@ -2009,7 +2092,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (this == obj) {
         return true;
       }
diff --git a/android/guava/src/com/google/common/collect/Table.java b/android/guava/src/com/google/common/collect/Table.java
index 1348794..97d3f70 100644
--- a/android/guava/src/com/google/common/collect/Table.java
+++ b/android/guava/src/com/google/common/collect/Table.java
@@ -24,7 +24,8 @@
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A collection that associates an ordered pair of keys, called a row key and a column key, with a
@@ -55,7 +56,9 @@
  */
 @DoNotMock("Use ImmutableTable, HashBasedTable, or another implementation")
 @GwtCompatible
-public interface Table<R, C, V> {
+@ElementTypesAreNonnullByDefault
+public interface Table<
+    R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object> {
   // TODO(jlevy): Consider adding methods similar to ConcurrentMap methods.
 
   // Accessors
@@ -67,29 +70,29 @@
    * @param columnKey key of column to search for
    */
   boolean contains(
-      @NullableDecl @CompatibleWith("R") Object rowKey,
-      @NullableDecl @CompatibleWith("C") Object columnKey);
+      @CompatibleWith("R") @CheckForNull Object rowKey,
+      @CompatibleWith("C") @CheckForNull Object columnKey);
 
   /**
    * Returns {@code true} if the table contains a mapping with the specified row key.
    *
    * @param rowKey key of row to search for
    */
-  boolean containsRow(@NullableDecl @CompatibleWith("R") Object rowKey);
+  boolean containsRow(@CompatibleWith("R") @CheckForNull Object rowKey);
 
   /**
    * Returns {@code true} if the table contains a mapping with the specified column.
    *
    * @param columnKey key of column to search for
    */
-  boolean containsColumn(@NullableDecl @CompatibleWith("C") Object columnKey);
+  boolean containsColumn(@CompatibleWith("C") @CheckForNull Object columnKey);
 
   /**
    * Returns {@code true} if the table contains a mapping with the specified value.
    *
    * @param value value to search for
    */
-  boolean containsValue(@NullableDecl @CompatibleWith("V") Object value);
+  boolean containsValue(@CompatibleWith("V") @CheckForNull Object value);
 
   /**
    * Returns the value corresponding to the given row and column keys, or {@code null} if no such
@@ -98,10 +101,10 @@
    * @param rowKey key of row to search for
    * @param columnKey key of column to search for
    */
-  @NullableDecl
+  @CheckForNull
   V get(
-      @NullableDecl @CompatibleWith("R") Object rowKey,
-      @NullableDecl @CompatibleWith("C") Object columnKey);
+      @CompatibleWith("R") @CheckForNull Object rowKey,
+      @CompatibleWith("C") @CheckForNull Object columnKey);
 
   /** Returns {@code true} if the table contains no mappings. */
   boolean isEmpty();
@@ -114,7 +117,7 @@
    * cell views, as returned by {@link #cellSet}, are equal.
    */
   @Override
-  boolean equals(@NullableDecl Object obj);
+  boolean equals(@CheckForNull Object obj);
 
   /**
    * Returns the hash code for this table. The hash code of a table is defined as the hash code of
@@ -139,8 +142,8 @@
    *     for the keys
    */
   @CanIgnoreReturnValue
-  @NullableDecl
-  V put(R rowKey, C columnKey, V value);
+  @CheckForNull
+  V put(@ParametricNullness R rowKey, @ParametricNullness C columnKey, @ParametricNullness V value);
 
   /**
    * Copies all mappings from the specified table to this table. The effect is equivalent to calling
@@ -158,10 +161,10 @@
    * @return the value previously associated with the keys, or {@code null} if no such value existed
    */
   @CanIgnoreReturnValue
-  @NullableDecl
+  @CheckForNull
   V remove(
-      @NullableDecl @CompatibleWith("R") Object rowKey,
-      @NullableDecl @CompatibleWith("C") Object columnKey);
+      @CompatibleWith("R") @CheckForNull Object rowKey,
+      @CompatibleWith("C") @CheckForNull Object columnKey);
 
   // Views
 
@@ -175,7 +178,7 @@
    * @param rowKey key of row to search for in the table
    * @return the corresponding map from column keys to values
    */
-  Map<C, V> row(R rowKey);
+  Map<C, V> row(@ParametricNullness R rowKey);
 
   /**
    * Returns a view of all mappings that have the given column key. For each row key / column key /
@@ -187,7 +190,7 @@
    * @param columnKey key of column to search for in the table
    * @return the corresponding map from row keys to values
    */
-  Map<R, V> column(C columnKey);
+  Map<R, V> column(@ParametricNullness C columnKey);
 
   /**
    * Returns a set of all row key / column key / value triplets. Changes to the returned set will
@@ -253,17 +256,18 @@
    *
    * @since 7.0
    */
-  interface Cell<R, C, V> {
+  interface Cell<
+      R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object> {
     /** Returns the row key of this cell. */
-    @NullableDecl
+    @ParametricNullness
     R getRowKey();
 
     /** Returns the column key of this cell. */
-    @NullableDecl
+    @ParametricNullness
     C getColumnKey();
 
     /** Returns the value of this cell. */
-    @NullableDecl
+    @ParametricNullness
     V getValue();
 
     /**
@@ -271,7 +275,7 @@
      * equal row keys, column keys, and values.
      */
     @Override
-    boolean equals(@NullableDecl Object obj);
+    boolean equals(@CheckForNull Object obj);
 
     /**
      * Returns the hash code of this cell.
diff --git a/android/guava/src/com/google/common/collect/Tables.java b/android/guava/src/com/google/common/collect/Tables.java
index 77c920c..772a75d 100644
--- a/android/guava/src/com/google/common/collect/Tables.java
+++ b/android/guava/src/com/google/common/collect/Tables.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -33,7 +34,8 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides static methods that involve a {@code Table}.
@@ -46,6 +48,7 @@
  * @since 7.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Tables {
   private Tables() {}
 
@@ -58,33 +61,44 @@
    * @param columnKey the column key to be associated with the returned cell
    * @param value the value to be associated with the returned cell
    */
-  public static <R, C, V> Cell<R, C, V> immutableCell(
-      @NullableDecl R rowKey, @NullableDecl C columnKey, @NullableDecl V value) {
+  public static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      Cell<R, C, V> immutableCell(
+          @ParametricNullness R rowKey,
+          @ParametricNullness C columnKey,
+          @ParametricNullness V value) {
     return new ImmutableCell<>(rowKey, columnKey, value);
   }
 
-  static final class ImmutableCell<R, C, V> extends AbstractCell<R, C, V> implements Serializable {
-    @NullableDecl private final R rowKey;
-    @NullableDecl private final C columnKey;
-    @NullableDecl private final V value;
+  static final class ImmutableCell<
+          R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractCell<R, C, V> implements Serializable {
+    @ParametricNullness private final R rowKey;
+    @ParametricNullness private final C columnKey;
+    @ParametricNullness private final V value;
 
-    ImmutableCell(@NullableDecl R rowKey, @NullableDecl C columnKey, @NullableDecl V value) {
+    ImmutableCell(
+        @ParametricNullness R rowKey,
+        @ParametricNullness C columnKey,
+        @ParametricNullness V value) {
       this.rowKey = rowKey;
       this.columnKey = columnKey;
       this.value = value;
     }
 
     @Override
+    @ParametricNullness
     public R getRowKey() {
       return rowKey;
     }
 
     @Override
+    @ParametricNullness
     public C getColumnKey() {
       return columnKey;
     }
 
     @Override
+    @ParametricNullness
     public V getValue() {
       return value;
     }
@@ -92,12 +106,14 @@
     private static final long serialVersionUID = 0;
   }
 
-  abstract static class AbstractCell<R, C, V> implements Cell<R, C, V> {
+  abstract static class AbstractCell<
+          R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      implements Cell<R, C, V> {
     // needed for serialization
     AbstractCell() {}
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj == this) {
         return true;
       }
@@ -133,13 +149,16 @@
    * columnKeySet().iterator()} doesn't. With a transposed {@link HashBasedTable}, it's the other
    * way around.
    */
-  public static <R, C, V> Table<C, R, V> transpose(Table<R, C, V> table) {
+  public static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      Table<C, R, V> transpose(Table<R, C, V> table) {
     return (table instanceof TransposeTable)
         ? ((TransposeTable<R, C, V>) table).original
         : new TransposeTable<C, R, V>(table);
   }
 
-  private static class TransposeTable<C, R, V> extends AbstractTable<C, R, V> {
+  private static class TransposeTable<
+          C extends @Nullable Object, R extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractTable<C, R, V> {
     final Table<R, C, V> original;
 
     TransposeTable(Table<R, C, V> original) {
@@ -152,7 +171,7 @@
     }
 
     @Override
-    public Map<C, V> column(R columnKey) {
+    public Map<C, V> column(@ParametricNullness R columnKey) {
       return original.row(columnKey);
     }
 
@@ -167,32 +186,37 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+    public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       return original.contains(columnKey, rowKey);
     }
 
     @Override
-    public boolean containsColumn(@NullableDecl Object columnKey) {
+    public boolean containsColumn(@CheckForNull Object columnKey) {
       return original.containsRow(columnKey);
     }
 
     @Override
-    public boolean containsRow(@NullableDecl Object rowKey) {
+    public boolean containsRow(@CheckForNull Object rowKey) {
       return original.containsColumn(rowKey);
     }
 
     @Override
-    public boolean containsValue(@NullableDecl Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       return original.containsValue(value);
     }
 
     @Override
-    public V get(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+    @CheckForNull
+    public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       return original.get(columnKey, rowKey);
     }
 
     @Override
-    public V put(C rowKey, R columnKey, V value) {
+    @CheckForNull
+    public V put(
+        @ParametricNullness C rowKey,
+        @ParametricNullness R columnKey,
+        @ParametricNullness V value) {
       return original.put(columnKey, rowKey, value);
     }
 
@@ -202,12 +226,13 @@
     }
 
     @Override
-    public V remove(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+    @CheckForNull
+    public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       return original.remove(columnKey, rowKey);
     }
 
     @Override
-    public Map<R, V> row(C rowKey) {
+    public Map<R, V> row(@ParametricNullness C rowKey) {
       return original.column(rowKey);
     }
 
@@ -316,12 +341,22 @@
    * @since 10.0
    */
   @Beta
-  public static <R, C, V1, V2> Table<R, C, V2> transformValues(
-      Table<R, C, V1> fromTable, Function<? super V1, V2> function) {
+  public static <
+          R extends @Nullable Object,
+          C extends @Nullable Object,
+          V1 extends @Nullable Object,
+          V2 extends @Nullable Object>
+      Table<R, C, V2> transformValues(
+          Table<R, C, V1> fromTable, Function<? super V1, V2> function) {
     return new TransformedTable<>(fromTable, function);
   }
 
-  private static class TransformedTable<R, C, V1, V2> extends AbstractTable<R, C, V2> {
+  private static class TransformedTable<
+          R extends @Nullable Object,
+          C extends @Nullable Object,
+          V1 extends @Nullable Object,
+          V2 extends @Nullable Object>
+      extends AbstractTable<R, C, V2> {
     final Table<R, C, V1> fromTable;
     final Function<? super V1, V2> function;
 
@@ -331,15 +366,19 @@
     }
 
     @Override
-    public boolean contains(Object rowKey, Object columnKey) {
+    public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       return fromTable.contains(rowKey, columnKey);
     }
 
     @Override
-    public V2 get(Object rowKey, Object columnKey) {
+    @CheckForNull
+    public V2 get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       // The function is passed a null input only when the table contains a null
       // value.
-      return contains(rowKey, columnKey) ? function.apply(fromTable.get(rowKey, columnKey)) : null;
+      // The cast is safe because of the contains() check.
+      return contains(rowKey, columnKey)
+          ? function.apply(uncheckedCastNullableTToT(fromTable.get(rowKey, columnKey)))
+          : null;
     }
 
     @Override
@@ -353,7 +392,11 @@
     }
 
     @Override
-    public V2 put(R rowKey, C columnKey, V2 value) {
+    @CheckForNull
+    public V2 put(
+        @ParametricNullness R rowKey,
+        @ParametricNullness C columnKey,
+        @ParametricNullness V2 value) {
       throw new UnsupportedOperationException();
     }
 
@@ -363,19 +406,21 @@
     }
 
     @Override
-    public V2 remove(Object rowKey, Object columnKey) {
+    @CheckForNull
+    public V2 remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       return contains(rowKey, columnKey)
-          ? function.apply(fromTable.remove(rowKey, columnKey))
+          // The cast is safe because of the contains() check.
+          ? function.apply(uncheckedCastNullableTToT(fromTable.remove(rowKey, columnKey)))
           : null;
     }
 
     @Override
-    public Map<C, V2> row(R rowKey) {
+    public Map<C, V2> row(@ParametricNullness R rowKey) {
       return Maps.transformValues(fromTable.row(rowKey), function);
     }
 
     @Override
-    public Map<R, V2> column(C columnKey) {
+    public Map<R, V2> column(@ParametricNullness C columnKey) {
       return Maps.transformValues(fromTable.column(columnKey), function);
     }
 
@@ -446,13 +491,14 @@
    *
    * @since 11.0
    */
-  public static <R, C, V> Table<R, C, V> unmodifiableTable(
-      Table<? extends R, ? extends C, ? extends V> table) {
+  public static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      Table<R, C, V> unmodifiableTable(Table<? extends R, ? extends C, ? extends V> table) {
     return new UnmodifiableTable<>(table);
   }
 
-  private static class UnmodifiableTable<R, C, V> extends ForwardingTable<R, C, V>
-      implements Serializable {
+  private static class UnmodifiableTable<
+          R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingTable<R, C, V> implements Serializable {
     final Table<? extends R, ? extends C, ? extends V> delegate;
 
     UnmodifiableTable(Table<? extends R, ? extends C, ? extends V> delegate) {
@@ -476,7 +522,7 @@
     }
 
     @Override
-    public Map<R, V> column(@NullableDecl C columnKey) {
+    public Map<R, V> column(@ParametricNullness C columnKey) {
       return Collections.unmodifiableMap(super.column(columnKey));
     }
 
@@ -492,7 +538,11 @@
     }
 
     @Override
-    public V put(@NullableDecl R rowKey, @NullableDecl C columnKey, @NullableDecl V value) {
+    @CheckForNull
+    public V put(
+        @ParametricNullness R rowKey,
+        @ParametricNullness C columnKey,
+        @ParametricNullness V value) {
       throw new UnsupportedOperationException();
     }
 
@@ -502,12 +552,13 @@
     }
 
     @Override
-    public V remove(@NullableDecl Object rowKey, @NullableDecl Object columnKey) {
+    @CheckForNull
+    public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Map<C, V> row(@NullableDecl R rowKey) {
+    public Map<C, V> row(@ParametricNullness R rowKey) {
       return Collections.unmodifiableMap(super.row(rowKey));
     }
 
@@ -543,8 +594,9 @@
    * @since 11.0
    */
   @Beta
-  public static <R, C, V> RowSortedTable<R, C, V> unmodifiableRowSortedTable(
-      RowSortedTable<R, ? extends C, ? extends V> table) {
+  public static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      RowSortedTable<R, C, V> unmodifiableRowSortedTable(
+          RowSortedTable<R, ? extends C, ? extends V> table) {
     /*
      * It's not ? extends R, because it's technically not covariant in R. Specifically,
      * table.rowMap().comparator() could return a comparator that only works for the ? extends R.
@@ -553,8 +605,9 @@
     return new UnmodifiableRowSortedMap<>(table);
   }
 
-  static final class UnmodifiableRowSortedMap<R, C, V> extends UnmodifiableTable<R, C, V>
-      implements RowSortedTable<R, C, V> {
+  static final class UnmodifiableRowSortedMap<
+          R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      extends UnmodifiableTable<R, C, V> implements RowSortedTable<R, C, V> {
 
     public UnmodifiableRowSortedMap(RowSortedTable<R, ? extends C, ? extends V> delegate) {
       super(delegate);
@@ -580,7 +633,8 @@
   }
 
   @SuppressWarnings("unchecked")
-  private static <K, V> Function<Map<K, V>, Map<K, V>> unmodifiableWrapper() {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      Function<Map<K, V>, Map<K, V>> unmodifiableWrapper() {
     return (Function) UNMODIFIABLE_WRAPPER;
   }
 
@@ -621,11 +675,12 @@
    * @return a synchronized view of the specified table
    * @since 22.0
    */
-  public static <R, C, V> Table<R, C, V> synchronizedTable(Table<R, C, V> table) {
+  public static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      Table<R, C, V> synchronizedTable(Table<R, C, V> table) {
     return Synchronized.table(table, null);
   }
 
-  static boolean equalsImpl(Table<?, ?, ?> table, @NullableDecl Object obj) {
+  static boolean equalsImpl(Table<?, ?, ?> table, @CheckForNull Object obj) {
     if (obj == table) {
       return true;
     } else if (obj instanceof Table) {
diff --git a/android/guava/src/com/google/common/collect/TopKSelector.java b/android/guava/src/com/google/common/collect/TopKSelector.java
index 5e4b200..f8cca0d 100644
--- a/android/guava/src/com/google/common/collect/TopKSelector.java
+++ b/android/guava/src/com/google/common/collect/TopKSelector.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.math.IntMath;
@@ -27,7 +28,8 @@
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An accumulator that selects the "top" {@code k} elements added to it, relative to a provided
@@ -50,7 +52,10 @@
  *
  * @author Louis Wasserman
  */
-@GwtCompatible final class TopKSelector<T> {
+@GwtCompatible
+@ElementTypesAreNonnullByDefault
+final class TopKSelector<
+    T extends @Nullable Object> {
 
   /**
    * Returns a {@code TopKSelector} that collects the lowest {@code k} elements added to it,
@@ -69,7 +74,8 @@
    *
    * @throws IllegalArgumentException if {@code k < 0} or {@code k > Integer.MAX_VALUE / 2}
    */
-  public static <T> TopKSelector<T> least(int k, Comparator<? super T> comparator) {
+  public static <T extends @Nullable Object> TopKSelector<T> least(
+      int k, Comparator<? super T> comparator) {
     return new TopKSelector<T>(comparator, k);
   }
 
@@ -90,7 +96,8 @@
    *
    * @throws IllegalArgumentException if {@code k < 0} or {@code k > Integer.MAX_VALUE / 2}
    */
-  public static <T> TopKSelector<T> greatest(int k, Comparator<? super T> comparator) {
+  public static <T extends @Nullable Object> TopKSelector<T> greatest(
+      int k, Comparator<? super T> comparator) {
     return new TopKSelector<T>(Ordering.from(comparator).reverse(), k);
   }
 
@@ -102,14 +109,14 @@
    * for the top k elements. Whenever the buffer is filled, we quickselect the top k elements to the
    * range [0, k) and ignore the remaining elements.
    */
-  private final T[] buffer;
+  private final @Nullable T[] buffer;
   private int bufferSize;
 
   /**
    * The largest of the lowest k elements we've seen so far relative to this comparator. If
    * bufferSize ≥ k, then we can ignore any elements greater than this value.
    */
-  @NullableDecl private T threshold;
+  @CheckForNull private T threshold;
 
   private TopKSelector(Comparator<? super T> comparator, int k) {
     this.comparator = checkNotNull(comparator, "comparator");
@@ -125,7 +132,7 @@
    * Adds {@code elem} as a candidate for the top {@code k} elements. This operation takes amortized
    * O(1) time.
    */
-  public void offer(@NullableDecl T elem) {
+  public void offer(@ParametricNullness T elem) {
     if (k == 0) {
       return;
     } else if (bufferSize == 0) {
@@ -134,10 +141,12 @@
       bufferSize = 1;
     } else if (bufferSize < k) {
       buffer[bufferSize++] = elem;
-      if (comparator.compare(elem, threshold) > 0) {
+      // uncheckedCastNullableTToT is safe because bufferSize > 0.
+      if (comparator.compare(elem, uncheckedCastNullableTToT(threshold)) > 0) {
         threshold = elem;
       }
-    } else if (comparator.compare(elem, threshold) < 0) {
+      // uncheckedCastNullableTToT is safe because bufferSize > 0.
+    } else if (comparator.compare(elem, uncheckedCastNullableTToT(threshold)) < 0) {
       // Otherwise, we can ignore elem; we've seen k better elements.
       buffer[bufferSize++] = elem;
       if (bufferSize == 2 * k) {
@@ -176,15 +185,17 @@
       iterations++;
       if (iterations >= maxIterations) {
         // We've already taken O(k log k), let's make sure we don't take longer than O(k log k).
-        Arrays.sort(buffer, left, right, comparator);
+        Arrays.sort(buffer, left, right + 1, comparator);
         break;
       }
     }
     bufferSize = k;
 
-    threshold = buffer[minThresholdPosition];
+    threshold = uncheckedCastNullableTToT(buffer[minThresholdPosition]);
     for (int i = minThresholdPosition + 1; i < k; i++) {
-      if (comparator.compare(buffer[i], threshold) > 0) {
+      if (comparator.compare(
+              uncheckedCastNullableTToT(buffer[i]), uncheckedCastNullableTToT(threshold))
+          > 0) {
         threshold = buffer[i];
       }
     }
@@ -197,12 +208,12 @@
    * (pivotNewIndex, right] is greater than pivotValue.
    */
   private int partition(int left, int right, int pivotIndex) {
-    T pivotValue = buffer[pivotIndex];
+    T pivotValue = uncheckedCastNullableTToT(buffer[pivotIndex]);
     buffer[pivotIndex] = buffer[right];
 
     int pivotNewIndex = left;
     for (int i = left; i < right; i++) {
-      if (comparator.compare(buffer[i], pivotValue) < 0) {
+      if (comparator.compare(uncheckedCastNullableTToT(buffer[i]), pivotValue) < 0) {
         swap(pivotNewIndex, i);
         pivotNewIndex++;
       }
diff --git a/android/guava/src/com/google/common/collect/TransformedIterator.java b/android/guava/src/com/google/common/collect/TransformedIterator.java
index b7214b8..2456cec 100644
--- a/android/guava/src/com/google/common/collect/TransformedIterator.java
+++ b/android/guava/src/com/google/common/collect/TransformedIterator.java
@@ -20,6 +20,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.Iterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An iterator that transforms a backing iterator; for internal use. This avoids the object overhead
@@ -28,14 +29,17 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class TransformedIterator<F, T> implements Iterator<T> {
+@ElementTypesAreNonnullByDefault
+abstract class TransformedIterator<F extends @Nullable Object, T extends @Nullable Object>
+    implements Iterator<T> {
   final Iterator<? extends F> backingIterator;
 
   TransformedIterator(Iterator<? extends F> backingIterator) {
     this.backingIterator = checkNotNull(backingIterator);
   }
 
-  abstract T transform(F from);
+  @ParametricNullness
+  abstract T transform(@ParametricNullness F from);
 
   @Override
   public final boolean hasNext() {
@@ -43,6 +47,7 @@
   }
 
   @Override
+  @ParametricNullness
   public final T next() {
     return transform(backingIterator.next());
   }
diff --git a/android/guava/src/com/google/common/collect/TransformedListIterator.java b/android/guava/src/com/google/common/collect/TransformedListIterator.java
index ac2eea1..66b42e4 100644
--- a/android/guava/src/com/google/common/collect/TransformedListIterator.java
+++ b/android/guava/src/com/google/common/collect/TransformedListIterator.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Function;
 import java.util.ListIterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An iterator that transforms a backing list iterator; for internal use. This avoids the object
@@ -27,8 +28,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class TransformedListIterator<F, T> extends TransformedIterator<F, T>
-    implements ListIterator<T> {
+@ElementTypesAreNonnullByDefault
+abstract class TransformedListIterator<F extends @Nullable Object, T extends @Nullable Object>
+    extends TransformedIterator<F, T> implements ListIterator<T> {
   TransformedListIterator(ListIterator<? extends F> backingIterator) {
     super(backingIterator);
   }
@@ -43,6 +45,7 @@
   }
 
   @Override
+  @ParametricNullness
   public final T previous() {
     return transform(backingIterator().previous());
   }
@@ -58,12 +61,12 @@
   }
 
   @Override
-  public void set(T element) {
+  public void set(@ParametricNullness T element) {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public void add(T element) {
+  public void add(@ParametricNullness T element) {
     throw new UnsupportedOperationException();
   }
 }
diff --git a/android/guava/src/com/google/common/collect/TreeBasedTable.java b/android/guava/src/com/google/common/collect/TreeBasedTable.java
index dc665eb..315404a 100644
--- a/android/guava/src/com/google/common/collect/TreeBasedTable.java
+++ b/android/guava/src/com/google/common/collect/TreeBasedTable.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Function;
@@ -31,7 +32,7 @@
 import java.util.SortedMap;
 import java.util.SortedSet;
 import java.util.TreeMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@code Table} whose row keys and column keys are ordered by their natural
@@ -66,6 +67,7 @@
  * @since 7.0
  */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 public class TreeBasedTable<R, C, V> extends StandardRowSortedTable<R, C, V> {
   private final Comparator<? super C> columnComparator;
 
@@ -135,7 +137,11 @@
    */
   @Deprecated
   public Comparator<? super R> rowComparator() {
-    return rowKeySet().comparator();
+    /*
+     * requireNonNull is safe because the factories require non-null Comparators, which they pass on
+     * to the backing collections.
+     */
+    return requireNonNull(rowKeySet().comparator());
   }
 
   /**
@@ -169,14 +175,14 @@
   }
 
   private class TreeRow extends Row implements SortedMap<C, V> {
-    @NullableDecl final C lowerBound;
-    @NullableDecl final C upperBound;
+    @CheckForNull final C lowerBound;
+    @CheckForNull final C upperBound;
 
     TreeRow(R rowKey) {
       this(rowKey, null, null);
     }
 
-    TreeRow(R rowKey, @NullableDecl C lowerBound, @NullableDecl C upperBound) {
+    TreeRow(R rowKey, @CheckForNull C lowerBound, @CheckForNull C upperBound) {
       super(rowKey);
       this.lowerBound = lowerBound;
       this.upperBound = upperBound;
@@ -201,7 +207,7 @@
       return cmp.compare(a, b);
     }
 
-    boolean rangeContains(@NullableDecl Object o) {
+    boolean rangeContains(@CheckForNull Object o) {
       return o != null
           && (lowerBound == null || compare(lowerBound, o) <= 0)
           && (upperBound == null || compare(upperBound, o) > 0);
@@ -227,43 +233,36 @@
 
     @Override
     public C firstKey() {
-      SortedMap<C, V> backing = backingRowMap();
-      if (backing == null) {
+      updateBackingRowMapField();
+      if (backingRowMap == null) {
         throw new NoSuchElementException();
       }
-      return backingRowMap().firstKey();
+      return ((SortedMap<C, V>) backingRowMap).firstKey();
     }
 
     @Override
     public C lastKey() {
-      SortedMap<C, V> backing = backingRowMap();
-      if (backing == null) {
+      updateBackingRowMapField();
+      if (backingRowMap == null) {
         throw new NoSuchElementException();
       }
-      return backingRowMap().lastKey();
+      return ((SortedMap<C, V>) backingRowMap).lastKey();
     }
 
-    @NullableDecl transient SortedMap<C, V> wholeRow;
+    @CheckForNull transient SortedMap<C, V> wholeRow;
 
-    /*
-     * If the row was previously empty, we check if there's a new row here every
-     * time we're queried.
-     */
-    SortedMap<C, V> wholeRow() {
+    // If the row was previously empty, we check if there's a new row here every time we're queried.
+    void updateWholeRowField() {
       if (wholeRow == null || (wholeRow.isEmpty() && backingMap.containsKey(rowKey))) {
         wholeRow = (SortedMap<C, V>) backingMap.get(rowKey);
       }
-      return wholeRow;
     }
 
     @Override
-    SortedMap<C, V> backingRowMap() {
-      return (SortedMap<C, V>) super.backingRowMap();
-    }
-
-    @Override
+    @CheckForNull
     SortedMap<C, V> computeBackingRowMap() {
-      SortedMap<C, V> map = wholeRow();
+      updateWholeRowField();
+      SortedMap<C, V> map = wholeRow;
       if (map != null) {
         if (lowerBound != null) {
           map = map.tailMap(lowerBound);
@@ -278,7 +277,8 @@
 
     @Override
     void maintainEmptyInvariant() {
-      if (wholeRow() != null && wholeRow.isEmpty()) {
+      updateWholeRowField();
+      if (wholeRow != null && wholeRow.isEmpty()) {
         backingMap.remove(rowKey);
         wholeRow = null;
         backingRowMap = null;
@@ -286,11 +286,12 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return rangeContains(key) && super.containsKey(key);
     }
 
     @Override
+    @CheckForNull
     public V put(C key, V value) {
       checkArgument(rangeContains(checkNotNull(key)));
       return super.put(key, value);
@@ -327,9 +328,10 @@
             comparator);
 
     return new AbstractIterator<C>() {
-      @NullableDecl C lastValue;
+      @CheckForNull C lastValue;
 
       @Override
+      @CheckForNull
       protected C computeNext() {
         while (merged.hasNext()) {
           C next = merged.next();
diff --git a/android/guava/src/com/google/common/collect/TreeMultimap.java b/android/guava/src/com/google/common/collect/TreeMultimap.java
index 85531e3..04ae207 100644
--- a/android/guava/src/com/google/common/collect/TreeMultimap.java
+++ b/android/guava/src/com/google/common/collect/TreeMultimap.java
@@ -31,7 +31,7 @@
 import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@code Multimap} whose keys and values are ordered by their natural ordering or
@@ -72,7 +72,9 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public class TreeMultimap<K, V> extends AbstractSortedKeySortedSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public class TreeMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractSortedKeySortedSetMultimap<K, V> {
   private transient Comparator<? super K> keyComparator;
   private transient Comparator<? super V> valueComparator;
 
@@ -90,7 +92,7 @@
    * @param keyComparator the comparator that determines the key ordering
    * @param valueComparator the comparator that determines the value ordering
    */
-  public static <K, V> TreeMultimap<K, V> create(
+  public static <K extends @Nullable Object, V extends @Nullable Object> TreeMultimap<K, V> create(
       Comparator<? super K> keyComparator, Comparator<? super V> valueComparator) {
     return new TreeMultimap<>(checkNotNull(keyComparator), checkNotNull(valueComparator));
   }
@@ -138,7 +140,7 @@
   }
 
   @Override
-  Collection<V> createCollection(@NullableDecl K key) {
+  Collection<V> createCollection(@ParametricNullness K key) {
     if (key == null) {
       keyComparator().compare(key, key);
     }
@@ -163,7 +165,7 @@
   /** @since 14.0 (present with return type {@code SortedSet} since 2.0) */
   @Override
   @GwtIncompatible // NavigableSet
-  public NavigableSet<V> get(@NullableDecl K key) {
+  public NavigableSet<V> get(@ParametricNullness K key) {
     return (NavigableSet<V>) super.get(key);
   }
 
diff --git a/android/guava/src/com/google/common/collect/TreeMultiset.java b/android/guava/src/com/google/common/collect/TreeMultiset.java
index dac0eab..c64c35a 100644
--- a/android/guava/src/com/google/common/collect/TreeMultiset.java
+++ b/android/guava/src/com/google/common/collect/TreeMultiset.java
@@ -19,7 +19,8 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -34,7 +35,8 @@
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A multiset which maintains the ordering of its elements, according to either their natural order
@@ -55,7 +57,9 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
-public final class TreeMultiset<E> extends AbstractSortedMultiset<E> implements Serializable {
+@ElementTypesAreNonnullByDefault
+public final class TreeMultiset<E extends @Nullable Object> extends AbstractSortedMultiset<E>
+    implements Serializable {
 
   /**
    * Creates a new, empty multiset, sorted according to the elements' natural order. All elements
@@ -85,7 +89,8 @@
    *     indicates that the elements' <i>natural ordering</i> should be used.
    */
   @SuppressWarnings("unchecked")
-  public static <E> TreeMultiset<E> create(@NullableDecl Comparator<? super E> comparator) {
+  public static <E extends @Nullable Object> TreeMultiset<E> create(
+      @CheckForNull Comparator<? super E> comparator) {
     return (comparator == null)
         ? new TreeMultiset<E>((Comparator) Ordering.natural())
         : new TreeMultiset<E>(comparator);
@@ -120,7 +125,7 @@
   TreeMultiset(Comparator<? super E> comparator) {
     super(comparator);
     this.range = GeneralRange.all(comparator);
-    this.header = new AvlNode<E>(null, 1);
+    this.header = new AvlNode<>();
     successor(header, header);
     this.rootReference = new Reference<>();
   }
@@ -134,7 +139,7 @@
       }
 
       @Override
-      long treeAggregate(@NullableDecl AvlNode<?> root) {
+      long treeAggregate(@CheckForNull AvlNode<?> root) {
         return (root == null) ? 0 : root.totalCount;
       }
     },
@@ -145,14 +150,14 @@
       }
 
       @Override
-      long treeAggregate(@NullableDecl AvlNode<?> root) {
+      long treeAggregate(@CheckForNull AvlNode<?> root) {
         return (root == null) ? 0 : root.distinctElements;
       }
     };
 
     abstract int nodeAggregate(AvlNode<?> node);
 
-    abstract long treeAggregate(@NullableDecl AvlNode<?> root);
+    abstract long treeAggregate(@CheckForNull AvlNode<?> root);
   }
 
   private long aggregateForEntries(Aggregate aggr) {
@@ -167,11 +172,14 @@
     return total;
   }
 
-  private long aggregateBelowRange(Aggregate aggr, @NullableDecl AvlNode<E> node) {
+  private long aggregateBelowRange(Aggregate aggr, @CheckForNull AvlNode<E> node) {
     if (node == null) {
       return 0;
     }
-    int cmp = comparator().compare(range.getLowerEndpoint(), node.elem);
+    // The cast is safe because we call this method only if hasLowerBound().
+    int cmp =
+        comparator()
+            .compare(uncheckedCastNullableTToT(range.getLowerEndpoint()), node.getElement());
     if (cmp < 0) {
       return aggregateBelowRange(aggr, node.left);
     } else if (cmp == 0) {
@@ -190,11 +198,14 @@
     }
   }
 
-  private long aggregateAboveRange(Aggregate aggr, @NullableDecl AvlNode<E> node) {
+  private long aggregateAboveRange(Aggregate aggr, @CheckForNull AvlNode<E> node) {
     if (node == null) {
       return 0;
     }
-    int cmp = comparator().compare(range.getUpperEndpoint(), node.elem);
+    // The cast is safe because we call this method only if hasUpperBound().
+    int cmp =
+        comparator()
+            .compare(uncheckedCastNullableTToT(range.getUpperEndpoint()), node.getElement());
     if (cmp > 0) {
       return aggregateAboveRange(aggr, node.right);
     } else if (cmp == 0) {
@@ -223,12 +234,12 @@
     return Ints.saturatedCast(aggregateForEntries(Aggregate.DISTINCT));
   }
 
-  static int distinctElements(@NullableDecl AvlNode<?> node) {
+  static int distinctElements(@CheckForNull AvlNode<?> node) {
     return (node == null) ? 0 : node.distinctElements;
   }
 
   @Override
-  public int count(@NullableDecl Object element) {
+  public int count(@CheckForNull Object element) {
     try {
       @SuppressWarnings("unchecked")
       E e = (E) element;
@@ -244,7 +255,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public int add(@NullableDecl E element, int occurrences) {
+  public int add(@ParametricNullness E element, int occurrences) {
     checkNonnegative(occurrences, "occurrences");
     if (occurrences == 0) {
       return count(element);
@@ -266,7 +277,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public int remove(@NullableDecl Object element, int occurrences) {
+  public int remove(@CheckForNull Object element, int occurrences) {
     checkNonnegative(occurrences, "occurrences");
     if (occurrences == 0) {
       return count(element);
@@ -290,7 +301,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public int setCount(@NullableDecl E element, int count) {
+  public int setCount(@ParametricNullness E element, int count) {
     checkNonnegative(count, "count");
     if (!range.contains(element)) {
       checkArgument(count == 0);
@@ -312,7 +323,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean setCount(@NullableDecl E element, int oldCount, int newCount) {
+  public boolean setCount(@ParametricNullness E element, int oldCount, int newCount) {
     checkNonnegative(newCount, "newCount");
     checkNonnegative(oldCount, "oldCount");
     checkArgument(range.contains(element));
@@ -338,8 +349,8 @@
   public void clear() {
     if (!range.hasLowerBound() && !range.hasUpperBound()) {
       // We can do this in O(n) rather than removing one by one, which could force rebalancing.
-      for (AvlNode<E> current = header.succ; current != header; ) {
-        AvlNode<E> next = current.succ;
+      for (AvlNode<E> current = header.succ(); current != header; ) {
+        AvlNode<E> next = current.succ();
 
         current.elemCount = 0;
         // Also clear these fields so that one deleted Entry doesn't retain all elements.
@@ -361,6 +372,7 @@
   private Entry<E> wrapEntry(final AvlNode<E> baseEntry) {
     return new Multisets.AbstractEntry<E>() {
       @Override
+      @ParametricNullness
       public E getElement() {
         return baseEntry.getElement();
       }
@@ -378,7 +390,7 @@
   }
 
   /** Returns the first node in the tree that is in range. */
-  @NullableDecl
+  @CheckForNull
   private AvlNode<E> firstNode() {
     AvlNode<E> root = rootReference.get();
     if (root == null) {
@@ -386,22 +398,23 @@
     }
     AvlNode<E> node;
     if (range.hasLowerBound()) {
-      E endpoint = range.getLowerEndpoint();
-      node = rootReference.get().ceiling(comparator(), endpoint);
+      // The cast is safe because of the hasLowerBound check.
+      E endpoint = uncheckedCastNullableTToT(range.getLowerEndpoint());
+      node = root.ceiling(comparator(), endpoint);
       if (node == null) {
         return null;
       }
       if (range.getLowerBoundType() == BoundType.OPEN
           && comparator().compare(endpoint, node.getElement()) == 0) {
-        node = node.succ;
+        node = node.succ();
       }
     } else {
-      node = header.succ;
+      node = header.succ();
     }
     return (node == header || !range.contains(node.getElement())) ? null : node;
   }
 
-  @NullableDecl
+  @CheckForNull
   private AvlNode<E> lastNode() {
     AvlNode<E> root = rootReference.get();
     if (root == null) {
@@ -409,17 +422,18 @@
     }
     AvlNode<E> node;
     if (range.hasUpperBound()) {
-      E endpoint = range.getUpperEndpoint();
-      node = rootReference.get().floor(comparator(), endpoint);
+      // The cast is safe because of the hasUpperBound check.
+      E endpoint = uncheckedCastNullableTToT(range.getUpperEndpoint());
+      node = root.floor(comparator(), endpoint);
       if (node == null) {
         return null;
       }
       if (range.getUpperBoundType() == BoundType.OPEN
           && comparator().compare(endpoint, node.getElement()) == 0) {
-        node = node.pred;
+        node = node.pred();
       }
     } else {
-      node = header.pred;
+      node = header.pred();
     }
     return (node == header || !range.contains(node.getElement())) ? null : node;
   }
@@ -432,8 +446,8 @@
   @Override
   Iterator<Entry<E>> entryIterator() {
     return new Iterator<Entry<E>>() {
-      AvlNode<E> current = firstNode();
-      @NullableDecl Entry<E> prevEntry;
+      @CheckForNull AvlNode<E> current = firstNode();
+      @CheckForNull Entry<E> prevEntry;
 
       @Override
       public boolean hasNext() {
@@ -452,19 +466,20 @@
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
-        Entry<E> result = wrapEntry(current);
+        // requireNonNull is safe because current is only nulled out after iteration is complete.
+        Entry<E> result = wrapEntry(requireNonNull(current));
         prevEntry = result;
-        if (current.succ == header) {
+        if (current.succ() == header) {
           current = null;
         } else {
-          current = current.succ;
+          current = current.succ();
         }
         return result;
       }
 
       @Override
       public void remove() {
-        checkRemove(prevEntry != null);
+        checkState(prevEntry != null, "no calls to next() since the last call to remove()");
         setCount(prevEntry.getElement(), 0);
         prevEntry = null;
       }
@@ -474,8 +489,8 @@
   @Override
   Iterator<Entry<E>> descendingEntryIterator() {
     return new Iterator<Entry<E>>() {
-      AvlNode<E> current = lastNode();
-      Entry<E> prevEntry = null;
+      @CheckForNull AvlNode<E> current = lastNode();
+      @CheckForNull Entry<E> prevEntry = null;
 
       @Override
       public boolean hasNext() {
@@ -494,19 +509,21 @@
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
+        // requireNonNull is safe because current is only nulled out after iteration is complete.
+        requireNonNull(current);
         Entry<E> result = wrapEntry(current);
         prevEntry = result;
-        if (current.pred == header) {
+        if (current.pred() == header) {
           current = null;
         } else {
-          current = current.pred;
+          current = current.pred();
         }
         return result;
       }
 
       @Override
       public void remove() {
-        checkRemove(prevEntry != null);
+        checkState(prevEntry != null, "no calls to next() since the last call to remove()");
         setCount(prevEntry.getElement(), 0);
         prevEntry = null;
       }
@@ -519,7 +536,7 @@
   }
 
   @Override
-  public SortedMultiset<E> headMultiset(@NullableDecl E upperBound, BoundType boundType) {
+  public SortedMultiset<E> headMultiset(@ParametricNullness E upperBound, BoundType boundType) {
     return new TreeMultiset<E>(
         rootReference,
         range.intersect(GeneralRange.upTo(comparator(), upperBound, boundType)),
@@ -527,7 +544,7 @@
   }
 
   @Override
-  public SortedMultiset<E> tailMultiset(@NullableDecl E lowerBound, BoundType boundType) {
+  public SortedMultiset<E> tailMultiset(@ParametricNullness E lowerBound, BoundType boundType) {
     return new TreeMultiset<E>(
         rootReference,
         range.intersect(GeneralRange.downTo(comparator(), lowerBound, boundType)),
@@ -535,14 +552,14 @@
   }
 
   private static final class Reference<T> {
-    @NullableDecl private T value;
+    @CheckForNull private T value;
 
-    @NullableDecl
+    @CheckForNull
     public T get() {
       return value;
     }
 
-    public void checkAndSet(@NullableDecl T expected, T newValue) {
+    public void checkAndSet(@CheckForNull T expected, @CheckForNull T newValue) {
       if (value != expected) {
         throw new ConcurrentModificationException();
       }
@@ -554,8 +571,18 @@
     }
   }
 
-  private static final class AvlNode<E> {
-    @NullableDecl private final E elem;
+  private static final class AvlNode<E extends @Nullable Object> {
+    /*
+     * For "normal" nodes, the type of this field is `E`, not `@Nullable E` (though note that E is a
+     * type that can include null, as in a TreeMultiset<@Nullable String>).
+     *
+     * For the header node, though, this field contains `null`, regardless of the type of the
+     * multiset.
+     *
+     * Most code that operates on an AvlNode never operates on the header node. Such code can access
+     * the elem field without a null check by calling getElement().
+     */
+    @CheckForNull private final E elem;
 
     // elemCount is 0 iff this node has been deleted.
     private int elemCount;
@@ -563,12 +590,23 @@
     private int distinctElements;
     private long totalCount;
     private int height;
-    @NullableDecl private AvlNode<E> left;
-    @NullableDecl private AvlNode<E> right;
-    @NullableDecl private AvlNode<E> pred;
-    @NullableDecl private AvlNode<E> succ;
+    @CheckForNull private AvlNode<E> left;
+    @CheckForNull private AvlNode<E> right;
+    /*
+     * pred and succ are nullable after construction, but we always call successor() to initialize
+     * them immediately thereafter.
+     *
+     * They may be subsequently nulled out by TreeMultiset.clear(). I think that the only place that
+     * we can reference a node whose fields have been cleared is inside the iterator (and presumably
+     * only under concurrent modification).
+     *
+     * To access these fields when you know that they are not null, call the pred() and succ()
+     * methods, which perform null checks before returning the fields.
+     */
+    @CheckForNull private AvlNode<E> pred;
+    @CheckForNull private AvlNode<E> succ;
 
-    AvlNode(@NullableDecl E elem, int elemCount) {
+    AvlNode(@ParametricNullness E elem, int elemCount) {
       checkArgument(elemCount > 0);
       this.elem = elem;
       this.elemCount = elemCount;
@@ -579,8 +617,24 @@
       this.right = null;
     }
 
-    public int count(Comparator<? super E> comparator, E e) {
-      int cmp = comparator.compare(e, elem);
+    /** Constructor for the header node. */
+    AvlNode() {
+      this.elem = null;
+      this.elemCount = 1;
+    }
+
+    // For discussion of pred() and succ(), see the comment on the pred and succ fields.
+
+    private AvlNode<E> pred() {
+      return requireNonNull(pred);
+    }
+
+    private AvlNode<E> succ() {
+      return requireNonNull(succ);
+    }
+
+    int count(Comparator<? super E> comparator, @ParametricNullness E e) {
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         return (left == null) ? 0 : left.count(comparator, e);
       } else if (cmp > 0) {
@@ -590,30 +644,31 @@
       }
     }
 
-    private AvlNode<E> addRightChild(E e, int count) {
+    private AvlNode<E> addRightChild(@ParametricNullness E e, int count) {
       right = new AvlNode<E>(e, count);
-      successor(this, right, succ);
+      successor(this, right, succ());
       height = Math.max(2, height);
       distinctElements++;
       totalCount += count;
       return this;
     }
 
-    private AvlNode<E> addLeftChild(E e, int count) {
+    private AvlNode<E> addLeftChild(@ParametricNullness E e, int count) {
       left = new AvlNode<E>(e, count);
-      successor(pred, left, this);
+      successor(pred(), left, this);
       height = Math.max(2, height);
       distinctElements++;
       totalCount += count;
       return this;
     }
 
-    AvlNode<E> add(Comparator<? super E> comparator, @NullableDecl E e, int count, int[] result) {
+    AvlNode<E> add(
+        Comparator<? super E> comparator, @ParametricNullness E e, int count, int[] result) {
       /*
        * It speeds things up considerably to unconditionally add count to totalCount here,
        * but that destroys failure atomicity in the case of count overflow. =(
        */
-      int cmp = comparator.compare(e, elem);
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         AvlNode<E> initLeft = left;
         if (initLeft == null) {
@@ -653,9 +708,10 @@
       return this;
     }
 
+    @CheckForNull
     AvlNode<E> remove(
-        Comparator<? super E> comparator, @NullableDecl E e, int count, int[] result) {
-      int cmp = comparator.compare(e, elem);
+        Comparator<? super E> comparator, @ParametricNullness E e, int count, int[] result) {
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         AvlNode<E> initLeft = left;
         if (initLeft == null) {
@@ -705,9 +761,10 @@
       }
     }
 
+    @CheckForNull
     AvlNode<E> setCount(
-        Comparator<? super E> comparator, @NullableDecl E e, int count, int[] result) {
-      int cmp = comparator.compare(e, elem);
+        Comparator<? super E> comparator, @ParametricNullness E e, int count, int[] result) {
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         AvlNode<E> initLeft = left;
         if (initLeft == null) {
@@ -754,13 +811,14 @@
       return this;
     }
 
+    @CheckForNull
     AvlNode<E> setCount(
         Comparator<? super E> comparator,
-        @NullableDecl E e,
+        @ParametricNullness E e,
         int expectedCount,
         int newCount,
         int[] result) {
-      int cmp = comparator.compare(e, elem);
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         AvlNode<E> initLeft = left;
         if (initLeft == null) {
@@ -817,16 +875,17 @@
       return this;
     }
 
+    @CheckForNull
     private AvlNode<E> deleteMe() {
       int oldElemCount = this.elemCount;
       this.elemCount = 0;
-      successor(pred, succ);
+      successor(pred(), succ());
       if (left == null) {
         return right;
       } else if (right == null) {
         return left;
       } else if (left.height >= right.height) {
-        AvlNode<E> newTop = pred;
+        AvlNode<E> newTop = pred();
         // newTop is the maximum node in my left subtree
         newTop.left = left.removeMax(newTop);
         newTop.right = right;
@@ -834,7 +893,7 @@
         newTop.totalCount = totalCount - oldElemCount;
         return newTop.rebalance();
       } else {
-        AvlNode<E> newTop = succ;
+        AvlNode<E> newTop = succ();
         newTop.right = right.removeMin(newTop);
         newTop.left = left;
         newTop.distinctElements = distinctElements - 1;
@@ -844,6 +903,7 @@
     }
 
     // Removes the minimum node from this subtree to be reused elsewhere
+    @CheckForNull
     private AvlNode<E> removeMin(AvlNode<E> node) {
       if (left == null) {
         return right;
@@ -856,6 +916,7 @@
     }
 
     // Removes the maximum node from this subtree to be reused elsewhere
+    @CheckForNull
     private AvlNode<E> removeMax(AvlNode<E> node) {
       if (right == null) {
         return left;
@@ -885,11 +946,15 @@
     private AvlNode<E> rebalance() {
       switch (balanceFactor()) {
         case -2:
+          // requireNonNull is safe because right must exist in order to get a negative factor.
+          requireNonNull(right);
           if (right.balanceFactor() > 0) {
             right = right.rotateRight();
           }
           return rotateLeft();
         case 2:
+          // requireNonNull is safe because left must exist in order to get a positive factor.
+          requireNonNull(left);
           if (left.balanceFactor() < 0) {
             left = left.rotateLeft();
           }
@@ -928,17 +993,17 @@
       return newTop;
     }
 
-    private static long totalCount(@NullableDecl AvlNode<?> node) {
+    private static long totalCount(@CheckForNull AvlNode<?> node) {
       return (node == null) ? 0 : node.totalCount;
     }
 
-    private static int height(@NullableDecl AvlNode<?> node) {
+    private static int height(@CheckForNull AvlNode<?> node) {
       return (node == null) ? 0 : node.height;
     }
 
-    @NullableDecl
-    private AvlNode<E> ceiling(Comparator<? super E> comparator, E e) {
-      int cmp = comparator.compare(e, elem);
+    @CheckForNull
+    private AvlNode<E> ceiling(Comparator<? super E> comparator, @ParametricNullness E e) {
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         return (left == null) ? this : MoreObjects.firstNonNull(left.ceiling(comparator, e), this);
       } else if (cmp == 0) {
@@ -948,9 +1013,9 @@
       }
     }
 
-    @NullableDecl
-    private AvlNode<E> floor(Comparator<? super E> comparator, E e) {
-      int cmp = comparator.compare(e, elem);
+    @CheckForNull
+    private AvlNode<E> floor(Comparator<? super E> comparator, @ParametricNullness E e) {
+      int cmp = comparator.compare(e, getElement());
       if (cmp > 0) {
         return (right == null) ? this : MoreObjects.firstNonNull(right.floor(comparator, e), this);
       } else if (cmp == 0) {
@@ -960,8 +1025,10 @@
       }
     }
 
+    @ParametricNullness
     E getElement() {
-      return elem;
+      // For discussion of this cast, see the comment on the elem field.
+      return uncheckedCastNullableTToT(elem);
     }
 
     int getCount() {
@@ -974,12 +1041,13 @@
     }
   }
 
-  private static <T> void successor(AvlNode<T> a, AvlNode<T> b) {
+  private static <T extends @Nullable Object> void successor(AvlNode<T> a, AvlNode<T> b) {
     a.succ = b;
     b.pred = a;
   }
 
-  private static <T> void successor(AvlNode<T> a, AvlNode<T> b, AvlNode<T> c) {
+  private static <T extends @Nullable Object> void successor(
+      AvlNode<T> a, AvlNode<T> b, AvlNode<T> c) {
     successor(a, b);
     successor(b, c);
   }
@@ -1012,7 +1080,7 @@
         .set(this, GeneralRange.all(comparator));
     Serialization.getFieldSetter(TreeMultiset.class, "rootReference")
         .set(this, new Reference<AvlNode<E>>());
-    AvlNode<E> header = new AvlNode<E>(null, 1);
+    AvlNode<E> header = new AvlNode<>();
     Serialization.getFieldSetter(TreeMultiset.class, "header").set(this, header);
     successor(header, header);
     Serialization.populateMultiset(this, stream);
diff --git a/android/guava/src/com/google/common/collect/TreeRangeMap.java b/android/guava/src/com/google/common/collect/TreeRangeMap.java
index 8cb31b7..0ce8e89 100644
--- a/android/guava/src/com/google/common/collect/TreeRangeMap.java
+++ b/android/guava/src/com/google/common/collect/TreeRangeMap.java
@@ -21,6 +21,7 @@
 import static com.google.common.base.Predicates.compose;
 import static com.google.common.base.Predicates.in;
 import static com.google.common.base.Predicates.not;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -37,7 +38,7 @@
 import java.util.NavigableMap;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@code RangeMap} based on a {@code TreeMap}, supporting all optional
@@ -50,6 +51,7 @@
  */
 @Beta
 @GwtIncompatible // NavigableMap
+@ElementTypesAreNonnullByDefault
 public final class TreeRangeMap<K extends Comparable, V> implements RangeMap<K, V> {
 
   private final NavigableMap<Cut<K>, RangeMapEntry<K, V>> entriesByLowerBound;
@@ -100,14 +102,14 @@
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public V get(K key) {
     Entry<Range<K>, V> entry = getEntry(key);
     return (entry == null) ? null : entry.getValue();
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public Entry<Range<K>, V> getEntry(K key) {
     Entry<Cut<K>, RangeMapEntry<K, V>> mapEntry =
         entriesByLowerBound.floorEntry(Cut.belowValue(key));
@@ -155,7 +157,7 @@
 
   /** Returns the range that spans the given range and entry, if the entry can be coalesced. */
   private static <K extends Comparable, V> Range<K> coalesce(
-      Range<K> range, V value, @NullableDecl Entry<Cut<K>, RangeMapEntry<K, V>> entry) {
+      Range<K> range, V value, @CheckForNull Entry<Cut<K>, RangeMapEntry<K, V>> entry) {
     if (entry != null
         && entry.getValue().getKey().isConnected(range)
         && entry.getValue().getValue().equals(value)) {
@@ -180,7 +182,8 @@
   public Range<K> span() {
     Entry<Cut<K>, RangeMapEntry<K, V>> firstEntry = entriesByLowerBound.firstEntry();
     Entry<Cut<K>, RangeMapEntry<K, V>> lastEntry = entriesByLowerBound.lastEntry();
-    if (firstEntry == null) {
+    // Either both are null or neither is, but we check both to satisfy the nullness checker.
+    if (firstEntry == null || lastEntry == null) {
       throw new NoSuchElementException();
     }
     return Range.create(
@@ -261,12 +264,13 @@
     }
 
     @Override
-    public boolean containsKey(@NullableDecl Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return get(key) != null;
     }
 
     @Override
-    public V get(@NullableDecl Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       if (key instanceof Range) {
         Range<?> range = (Range<?>) key;
         RangeMapEntry<K, V> rangeMapEntry = entriesByLowerBound.get(range.lowerBound);
@@ -299,44 +303,45 @@
 
   @SuppressWarnings("unchecked")
   private RangeMap<K, V> emptySubRangeMap() {
-    return EMPTY_SUB_RANGE_MAP;
+    return (RangeMap<K, V>) (RangeMap<?, ?>) EMPTY_SUB_RANGE_MAP;
   }
 
-  private static final RangeMap EMPTY_SUB_RANGE_MAP =
-      new RangeMap() {
+  @SuppressWarnings("ConstantCaseForConstants") // This RangeMap is immutable.
+  private static final RangeMap<Comparable<?>, Object> EMPTY_SUB_RANGE_MAP =
+      new RangeMap<Comparable<?>, Object>() {
         @Override
-        @NullableDecl
-        public Object get(Comparable key) {
+        @CheckForNull
+        public Object get(Comparable<?> key) {
           return null;
         }
 
         @Override
-        @NullableDecl
-        public Entry<Range, Object> getEntry(Comparable key) {
+        @CheckForNull
+        public Entry<Range<Comparable<?>>, Object> getEntry(Comparable<?> key) {
           return null;
         }
 
         @Override
-        public Range span() {
+        public Range<Comparable<?>> span() {
           throw new NoSuchElementException();
         }
 
         @Override
-        public void put(Range range, Object value) {
+        public void put(Range<Comparable<?>> range, Object value) {
           checkNotNull(range);
           throw new IllegalArgumentException(
               "Cannot insert range " + range + " into an empty subRangeMap");
         }
 
         @Override
-        public void putCoalescing(Range range, Object value) {
+        public void putCoalescing(Range<Comparable<?>> range, Object value) {
           checkNotNull(range);
           throw new IllegalArgumentException(
               "Cannot insert range " + range + " into an empty subRangeMap");
         }
 
         @Override
-        public void putAll(RangeMap rangeMap) {
+        public void putAll(RangeMap<Comparable<?>, Object> rangeMap) {
           if (!rangeMap.asMapOfRanges().isEmpty()) {
             throw new IllegalArgumentException(
                 "Cannot putAll(nonEmptyRangeMap) into an empty subRangeMap");
@@ -347,22 +352,22 @@
         public void clear() {}
 
         @Override
-        public void remove(Range range) {
+        public void remove(Range<Comparable<?>> range) {
           checkNotNull(range);
         }
 
         @Override
-        public Map<Range, Object> asMapOfRanges() {
+        public Map<Range<Comparable<?>>, Object> asMapOfRanges() {
           return Collections.emptyMap();
         }
 
         @Override
-        public Map<Range, Object> asDescendingMapOfRanges() {
+        public Map<Range<Comparable<?>>, Object> asDescendingMapOfRanges() {
           return Collections.emptyMap();
         }
 
         @Override
-        public RangeMap subRangeMap(Range range) {
+        public RangeMap<Comparable<?>, Object> subRangeMap(Range<Comparable<?>> range) {
           checkNotNull(range);
           return this;
         }
@@ -377,13 +382,13 @@
     }
 
     @Override
-    @NullableDecl
+    @CheckForNull
     public V get(K key) {
       return subRange.contains(key) ? TreeRangeMap.this.get(key) : null;
     }
 
     @Override
-    @NullableDecl
+    @CheckForNull
     public Entry<Range<K>, V> getEntry(K key) {
       if (subRange.contains(key)) {
         Entry<Range<K>, V> entry = TreeRangeMap.this.getEntry(key);
@@ -499,6 +504,7 @@
           return new AbstractIterator<Entry<Range<K>, V>>() {
 
             @Override
+            @CheckForNull
             protected Entry<Range<K>, V> computeNext() {
               if (backingItr.hasNext()) {
                 RangeMapEntry<K, V> entry = backingItr.next();
@@ -515,7 +521,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof RangeMap) {
         RangeMap<?, ?> rangeMap = (RangeMap<?, ?>) o;
         return asMapOfRanges().equals(rangeMap.asMapOfRanges());
@@ -536,12 +542,13 @@
     class SubRangeMapAsMap extends AbstractMap<Range<K>, V> {
 
       @Override
-      public boolean containsKey(Object key) {
+      public boolean containsKey(@CheckForNull Object key) {
         return get(key) != null;
       }
 
       @Override
-      public V get(Object key) {
+      @CheckForNull
+      public V get(@CheckForNull Object key) {
         try {
           if (key instanceof Range) {
             @SuppressWarnings("unchecked") // we catch ClassCastExceptions
@@ -574,11 +581,13 @@
       }
 
       @Override
-      public V remove(Object key) {
+      @CheckForNull
+      public V remove(@CheckForNull Object key) {
         V value = get(key);
         if (value != null) {
-          @SuppressWarnings("unchecked") // it's definitely in the map, so safe
-          Range<K> range = (Range<K>) key;
+          // it's definitely in the map, so the cast and requireNonNull are safe
+          @SuppressWarnings("unchecked")
+          Range<K> range = (Range<K>) requireNonNull(key);
           TreeRangeMap.this.remove(range);
           return value;
         }
@@ -607,7 +616,7 @@
       public Set<Range<K>> keySet() {
         return new Maps.KeySet<Range<K>, V>(SubRangeMapAsMap.this) {
           @Override
-          public boolean remove(@NullableDecl Object o) {
+          public boolean remove(@CheckForNull Object o) {
             return SubRangeMapAsMap.this.remove(o) != null;
           }
 
@@ -660,6 +669,7 @@
         return new AbstractIterator<Entry<Range<K>, V>>() {
 
           @Override
+          @CheckForNull
           protected Entry<Range<K>, V> computeNext() {
             while (backingItr.hasNext()) {
               RangeMapEntry<K, V> entry = backingItr.next();
@@ -693,7 +703,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object o) {
+  public boolean equals(@CheckForNull Object o) {
     if (o instanceof RangeMap) {
       RangeMap<?, ?> rangeMap = (RangeMap<?, ?>) o;
       return asMapOfRanges().equals(rangeMap.asMapOfRanges());
diff --git a/android/guava/src/com/google/common/collect/TreeRangeSet.java b/android/guava/src/com/google/common/collect/TreeRangeSet.java
index c5a438a..8308880 100644
--- a/android/guava/src/com/google/common/collect/TreeRangeSet.java
+++ b/android/guava/src/com/google/common/collect/TreeRangeSet.java
@@ -30,7 +30,7 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.TreeMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link RangeSet} backed by a {@link TreeMap}.
@@ -40,6 +40,7 @@
  */
 @Beta
 @GwtIncompatible // uses NavigableMap
+@ElementTypesAreNonnullByDefault
 public class TreeRangeSet<C extends Comparable<?>> extends AbstractRangeSet<C>
     implements Serializable {
 
@@ -76,8 +77,8 @@
     this.rangesByLowerBound = rangesByLowerCut;
   }
 
-  @NullableDecl private transient Set<Range<C>> asRanges;
-  @NullableDecl private transient Set<Range<C>> asDescendingSetOfRanges;
+  @CheckForNull private transient Set<Range<C>> asRanges;
+  @CheckForNull private transient Set<Range<C>> asDescendingSetOfRanges;
 
   @Override
   public Set<Range<C>> asRanges() {
@@ -112,13 +113,13 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       return Sets.equalsImpl(this, o);
     }
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public Range<C> rangeContaining(C value) {
     checkNotNull(value);
     Entry<Cut<C>, Range<C>> floorEntry = rangesByLowerBound.floorEntry(Cut.belowValue(value));
@@ -152,7 +153,7 @@
     return floorEntry != null && floorEntry.getValue().encloses(range);
   }
 
-  @NullableDecl
+  @CheckForNull
   private Range<C> rangeEnclosing(Range<C> range) {
     checkNotNull(range);
     Entry<Cut<C>, Range<C>> floorEntry = rangesByLowerBound.floorEntry(range.lowerBound);
@@ -165,7 +166,11 @@
   public Range<C> span() {
     Entry<Cut<C>, Range<C>> firstEntry = rangesByLowerBound.firstEntry();
     Entry<Cut<C>, Range<C>> lastEntry = rangesByLowerBound.lastEntry();
-    if (firstEntry == null) {
+    if (firstEntry == null || lastEntry == null) {
+      /*
+       * Either both are null or neither is: Either the set is empty, or it's not. But we check both
+       * to make the nullness checker happy.
+       */
       throw new NoSuchElementException();
     }
     return Range.create(firstEntry.getValue().lowerBound, lastEntry.getValue().upperBound);
@@ -269,7 +274,7 @@
     }
   }
 
-  @NullableDecl private transient RangeSet<C> complement;
+  @CheckForNull private transient RangeSet<C> complement;
 
   @Override
   public RangeSet<C> complement() {
@@ -332,12 +337,13 @@
     }
 
     @Override
-    public boolean containsKey(@NullableDecl Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return get(key) != null;
     }
 
     @Override
-    public Range<C> get(@NullableDecl Object key) {
+    @CheckForNull
+    public Range<C> get(@CheckForNull Object key) {
       if (key instanceof Cut) {
         try {
           @SuppressWarnings("unchecked") // we catch CCEs
@@ -382,6 +388,7 @@
       }
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (!backingItr.hasNext()) {
             return endOfData();
@@ -415,6 +422,7 @@
       }
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (!backingItr.hasNext()) {
             return endOfData();
@@ -536,6 +544,7 @@
         Cut<C> nextComplementRangeLowerBound = firstComplementRangeLowerBound;
 
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (complementLowerBoundWindow.upperBound.isLessThan(nextComplementRangeLowerBound)
               || nextComplementRangeLowerBound == Cut.<C>aboveAll()) {
@@ -597,6 +606,7 @@
         Cut<C> nextComplementRangeUpperBound = firstComplementRangeUpperBound;
 
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (nextComplementRangeUpperBound == Cut.<C>belowAll()) {
             return endOfData();
@@ -624,8 +634,8 @@
     }
 
     @Override
-    @NullableDecl
-    public Range<C> get(Object key) {
+    @CheckForNull
+    public Range<C> get(@CheckForNull Object key) {
       if (key instanceof Cut) {
         try {
           @SuppressWarnings("unchecked")
@@ -643,7 +653,7 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return get(key) != null;
     }
   }
@@ -737,13 +747,13 @@
     }
 
     @Override
-    public boolean containsKey(@NullableDecl Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return get(key) != null;
     }
 
     @Override
-    @NullableDecl
-    public Range<C> get(@NullableDecl Object key) {
+    @CheckForNull
+    public Range<C> get(@CheckForNull Object key) {
       if (key instanceof Cut) {
         try {
           @SuppressWarnings("unchecked") // we catch CCE's
@@ -798,6 +808,7 @@
               .min(lowerBoundWindow.upperBound, Cut.belowValue(restriction.upperBound));
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (!completeRangeItr.hasNext()) {
             return endOfData();
@@ -831,6 +842,7 @@
               .iterator();
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (!completeRangeItr.hasNext()) {
             return endOfData();
@@ -880,7 +892,7 @@
     }
 
     @Override
-    @NullableDecl
+    @CheckForNull
     public Range<C> rangeContaining(C value) {
       if (!restriction.contains(value)) {
         return null;
diff --git a/android/guava/src/com/google/common/collect/TreeTraverser.java b/android/guava/src/com/google/common/collect/TreeTraverser.java
index 550cdfc..73f8154 100644
--- a/android/guava/src/com/google/common/collect/TreeTraverser.java
+++ b/android/guava/src/com/google/common/collect/TreeTraverser.java
@@ -25,6 +25,7 @@
 import java.util.Deque;
 import java.util.Iterator;
 import java.util.Queue;
+import javax.annotation.CheckForNull;
 
 /**
  * Views elements of a type {@code T} as nodes in a tree, and provides methods to traverse the trees
@@ -73,6 +74,7 @@
 @Deprecated
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class TreeTraverser<T> {
 
   /**
@@ -197,6 +199,7 @@
     }
 
     @Override
+    @CheckForNull
     protected T computeNext() {
       while (!stack.isEmpty()) {
         PostOrderNode<T> top = stack.getLast();
diff --git a/android/guava/src/com/google/common/collect/UnmodifiableIterator.java b/android/guava/src/com/google/common/collect/UnmodifiableIterator.java
index f0f76b2..03e52aa 100644
--- a/android/guava/src/com/google/common/collect/UnmodifiableIterator.java
+++ b/android/guava/src/com/google/common/collect/UnmodifiableIterator.java
@@ -17,7 +17,9 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.Iterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An iterator that does not support {@link #remove}.
@@ -30,7 +32,8 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class UnmodifiableIterator<E> implements Iterator<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class UnmodifiableIterator<E extends @Nullable Object> implements Iterator<E> {
   /** Constructor for use by subclasses. */
   protected UnmodifiableIterator() {}
 
@@ -42,6 +45,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void remove() {
     throw new UnsupportedOperationException();
   }
diff --git a/android/guava/src/com/google/common/collect/UnmodifiableListIterator.java b/android/guava/src/com/google/common/collect/UnmodifiableListIterator.java
index ec4219c..f3d3b92 100644
--- a/android/guava/src/com/google/common/collect/UnmodifiableListIterator.java
+++ b/android/guava/src/com/google/common/collect/UnmodifiableListIterator.java
@@ -17,7 +17,9 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.ListIterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A list iterator that does not support {@link #remove}, {@link #add}, or {@link #set}.
@@ -26,8 +28,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-public abstract class UnmodifiableListIterator<E> extends UnmodifiableIterator<E>
-    implements ListIterator<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class UnmodifiableListIterator<E extends @Nullable Object>
+    extends UnmodifiableIterator<E> implements ListIterator<E> {
   /** Constructor for use by subclasses. */
   protected UnmodifiableListIterator() {}
 
@@ -39,7 +42,8 @@
    */
   @Deprecated
   @Override
-  public final void add(E e) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void add(@ParametricNullness E e) {
     throw new UnsupportedOperationException();
   }
 
@@ -51,7 +55,8 @@
    */
   @Deprecated
   @Override
-  public final void set(E e) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void set(@ParametricNullness E e) {
     throw new UnsupportedOperationException();
   }
 }
diff --git a/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java b/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
index 20286af..59bd2ce 100644
--- a/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
+++ b/android/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
@@ -20,7 +20,8 @@
 import com.google.common.collect.Multisets.UnmodifiableMultiset;
 import java.util.Comparator;
 import java.util.NavigableSet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link Multisets#unmodifiableSortedMultiset(SortedMultiset)}, split out into
@@ -30,7 +31,8 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(emulated = true)
-final class UnmodifiableSortedMultiset<E> extends UnmodifiableMultiset<E>
+@ElementTypesAreNonnullByDefault
+final class UnmodifiableSortedMultiset<E extends @Nullable Object> extends UnmodifiableMultiset<E>
     implements SortedMultiset<E> {
   UnmodifiableSortedMultiset(SortedMultiset<E> delegate) {
     super(delegate);
@@ -56,7 +58,7 @@
     return (NavigableSet<E>) super.elementSet();
   }
 
-  @NullableDecl private transient UnmodifiableSortedMultiset<E> descendingMultiset;
+  @CheckForNull private transient UnmodifiableSortedMultiset<E> descendingMultiset;
 
   @Override
   public SortedMultiset<E> descendingMultiset() {
@@ -70,39 +72,46 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     return delegate().firstEntry();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     return delegate().lastEntry();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollFirstEntry() {
     throw new UnsupportedOperationException();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollLastEntry() {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public SortedMultiset<E> headMultiset(E upperBound, BoundType boundType) {
+  public SortedMultiset<E> headMultiset(@ParametricNullness E upperBound, BoundType boundType) {
     return Multisets.unmodifiableSortedMultiset(delegate().headMultiset(upperBound, boundType));
   }
 
   @Override
   public SortedMultiset<E> subMultiset(
-      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType) {
+      @ParametricNullness E lowerBound,
+      BoundType lowerBoundType,
+      @ParametricNullness E upperBound,
+      BoundType upperBoundType) {
     return Multisets.unmodifiableSortedMultiset(
         delegate().subMultiset(lowerBound, lowerBoundType, upperBound, upperBoundType));
   }
 
   @Override
-  public SortedMultiset<E> tailMultiset(E lowerBound, BoundType boundType) {
+  public SortedMultiset<E> tailMultiset(@ParametricNullness E lowerBound, BoundType boundType) {
     return Multisets.unmodifiableSortedMultiset(delegate().tailMultiset(lowerBound, boundType));
   }
 
diff --git a/android/guava/src/com/google/common/collect/UsingToStringOrdering.java b/android/guava/src/com/google/common/collect/UsingToStringOrdering.java
index 3167946..3443b43 100644
--- a/android/guava/src/com/google/common/collect/UsingToStringOrdering.java
+++ b/android/guava/src/com/google/common/collect/UsingToStringOrdering.java
@@ -21,6 +21,7 @@
 
 /** An ordering that uses the natural order of the string representation of the values. */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 final class UsingToStringOrdering extends Ordering<Object> implements Serializable {
   static final UsingToStringOrdering INSTANCE = new UsingToStringOrdering();
 
diff --git a/android/guava/src/com/google/common/collect/package-info.java b/android/guava/src/com/google/common/collect/package-info.java
index f9f6758..d46e65f 100644
--- a/android/guava/src/com/google/common/collect/package-info.java
+++ b/android/guava/src/com/google/common/collect/package-info.java
@@ -97,6 +97,7 @@
  *
  * <ul>
  *   <li>{@link com.google.common.collect.ImmutableMultiset}
+ *   <li>{@link com.google.common.collect.ImmutableSortedMultiset}
  *   <li>{@link com.google.common.collect.HashMultiset}
  *   <li>{@link com.google.common.collect.LinkedHashMultiset}
  *   <li>{@link com.google.common.collect.TreeMultiset}
diff --git a/android/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java b/android/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
index 91e48e6..20e8563 100644
--- a/android/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
+++ b/android/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link CharEscaper} that uses an array to quickly look up replacement characters for a given
@@ -42,6 +43,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ArrayBasedCharEscaper extends CharEscaper {
   // The replacement array (see ArrayBasedEscaperMap).
   private final char[][] replacements;
@@ -117,8 +119,11 @@
    * Escapes a single character using the replacement array and safe range values. If the given
    * character does not have an explicit replacement and lies outside the safe range then {@link
    * #escapeUnsafe} is called.
+   *
+   * @return the replacement characters, or {@code null} if no escaping was required
    */
   @Override
+  @CheckForNull
   protected final char[] escape(char c) {
     if (c < replacementsLength) {
       char[] chars = replacements[c];
@@ -145,5 +150,6 @@
    * @return the replacement characters, or {@code null} if no escaping was required
    */
   // TODO(dbeaumont,cpovirk): Rename this something better once refactoring done
+  @CheckForNull
   protected abstract char[] escapeUnsafe(char c);
 }
diff --git a/android/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java b/android/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
index 400c3b1..a0883fe 100644
--- a/android/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
+++ b/android/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
@@ -38,6 +38,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class ArrayBasedEscaperMap {
   /**
    * Returns a new ArrayBasedEscaperMap for creating ArrayBasedCharEscaper or
@@ -73,7 +74,7 @@
     }
     char max = Collections.max(map.keySet());
     char[][] replacements = new char[max + 1][];
-    for (char c : map.keySet()) {
+    for (Character c : map.keySet()) {
       replacements[c] = map.get(c).toCharArray();
     }
     return replacements;
diff --git a/android/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java b/android/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
index 46057e9..5ea7807 100644
--- a/android/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
+++ b/android/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
@@ -19,7 +19,8 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link UnicodeEscaper} that uses an array to quickly look up replacement characters for a given
@@ -42,6 +43,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ArrayBasedUnicodeEscaper extends UnicodeEscaper {
   // The replacement array (see ArrayBasedEscaperMap).
   private final char[][] replacements;
@@ -73,7 +75,7 @@
       Map<Character, String> replacementMap,
       int safeMin,
       int safeMax,
-      @NullableDecl String unsafeReplacement) {
+      @Nullable String unsafeReplacement) {
     this(ArrayBasedEscaperMap.create(replacementMap), safeMin, safeMax, unsafeReplacement);
   }
 
@@ -96,7 +98,7 @@
       ArrayBasedEscaperMap escaperMap,
       int safeMin,
       int safeMax,
-      @NullableDecl String unsafeReplacement) {
+      @Nullable String unsafeReplacement) {
     checkNotNull(escaperMap); // GWT specific check (do not optimize)
     this.replacements = escaperMap.getReplacementArray();
     this.replacementsLength = replacements.length;
@@ -157,8 +159,11 @@
    * Escapes a single Unicode code point using the replacement array and safe range values. If the
    * given character does not have an explicit replacement and lies outside the safe range then
    * {@link #escapeUnsafe} is called.
+   *
+   * @return the replacement characters, or {@code null} if no escaping was required
    */
   @Override
+  @CheckForNull
   protected final char[] escape(int cp) {
     if (cp < replacementsLength) {
       char[] chars = replacements[cp];
@@ -199,5 +204,6 @@
    * @param cp the Unicode code point to escape
    * @return the replacement characters, or {@code null} if no escaping was required
    */
+  @CheckForNull
   protected abstract char[] escapeUnsafe(int cp);
 }
diff --git a/android/guava/src/com/google/common/escape/CharEscaper.java b/android/guava/src/com/google/common/escape/CharEscaper.java
index b8ffee3..55090f6 100644
--- a/android/guava/src/com/google/common/escape/CharEscaper.java
+++ b/android/guava/src/com/google/common/escape/CharEscaper.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import javax.annotation.CheckForNull;
 
 /**
  * An object that converts literal text into a format safe for inclusion in a particular context
@@ -41,6 +42,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class CharEscaper extends Escaper {
   /** Constructor for use by subclasses. */
   protected CharEscaper() {}
@@ -80,6 +82,7 @@
    * @param c the character to escape if necessary
    * @return the replacement characters, or {@code null} if no escaping was needed
    */
+  @CheckForNull
   protected abstract char[] escape(char c);
 
   /**
diff --git a/android/guava/src/com/google/common/escape/CharEscaperBuilder.java b/android/guava/src/com/google/common/escape/CharEscaperBuilder.java
index dba855f..cbe6958 100644
--- a/android/guava/src/com/google/common/escape/CharEscaperBuilder.java
+++ b/android/guava/src/com/google/common/escape/CharEscaperBuilder.java
@@ -22,6 +22,8 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Simple helper class to build a "sparse" array of objects based on the indexes that were added to
@@ -34,16 +36,17 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class CharEscaperBuilder {
   /**
    * Simple decorator that turns an array of replacement char[]s into a CharEscaper, this results in
    * a very fast escape method.
    */
   private static class CharArrayDecorator extends CharEscaper {
-    private final char[][] replacements;
+    private final char[] @Nullable [] replacements;
     private final int replaceLength;
 
-    CharArrayDecorator(char[][] replacements) {
+    CharArrayDecorator(char[] @Nullable [] replacements) {
       this.replacements = replacements;
       this.replaceLength = replacements.length;
     }
@@ -65,6 +68,7 @@
     }
 
     @Override
+    @CheckForNull
     protected char[] escape(char c) {
       return c < replaceLength ? replacements[c] : null;
     }
@@ -108,7 +112,7 @@
    *
    * @return a "sparse" array that holds the replacement mappings.
    */
-  public char[][] toArray() {
+  public char[] @Nullable [] toArray() {
     char[][] result = new char[max + 1][];
     for (Entry<Character, String> entry : map.entrySet()) {
       result[entry.getKey()] = entry.getValue().toCharArray();
diff --git a/android/guava/src/com/google/common/escape/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/escape/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..992c9a3
--- /dev/null
+++ b/android/guava/src/com/google/common/escape/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.escape;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/escape/Escaper.java b/android/guava/src/com/google/common/escape/Escaper.java
index 0d32a09..cdfe4e9 100644
--- a/android/guava/src/com/google/common/escape/Escaper.java
+++ b/android/guava/src/com/google/common/escape/Escaper.java
@@ -56,6 +56,7 @@
  */
 @DoNotMock("Use Escapers.nullEscaper() or another methods from the *Escapers classes")
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class Escaper {
   // TODO(dbeaumont): evaluate custom implementations, considering package private constructor.
   /** Constructor for use by subclasses. */
diff --git a/android/guava/src/com/google/common/escape/Escapers.java b/android/guava/src/com/google/common/escape/Escapers.java
index 5de338a..41af668 100644
--- a/android/guava/src/com/google/common/escape/Escapers.java
+++ b/android/guava/src/com/google/common/escape/Escapers.java
@@ -21,7 +21,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.HashMap;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to {@link Escaper} instances.
@@ -32,6 +33,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Escapers {
   private Escapers() {}
 
@@ -52,6 +54,7 @@
         }
 
         @Override
+        @CheckForNull
         protected char[] escape(char c) {
           // TODO: Fix tests not to call this directly and make it throw an error.
           return null;
@@ -95,7 +98,7 @@
     private final Map<Character, String> replacementMap = new HashMap<>();
     private char safeMin = Character.MIN_VALUE;
     private char safeMax = Character.MAX_VALUE;
-    private String unsafeReplacement = null;
+    @CheckForNull private String unsafeReplacement = null;
 
     // The constructor is exposed via the builder() method above.
     private Builder() {}
@@ -125,7 +128,7 @@
      * @return the builder instance
      */
     @CanIgnoreReturnValue
-    public Builder setUnsafeReplacement(@NullableDecl String unsafeReplacement) {
+    public Builder setUnsafeReplacement(@Nullable String unsafeReplacement) {
       this.unsafeReplacement = unsafeReplacement;
       return this;
     }
@@ -151,10 +154,12 @@
     /** Returns a new escaper based on the current state of the builder. */
     public Escaper build() {
       return new ArrayBasedCharEscaper(replacementMap, safeMin, safeMax) {
+        @CheckForNull
         private final char[] replacementChars =
             unsafeReplacement != null ? unsafeReplacement.toCharArray() : null;
 
         @Override
+        @CheckForNull
         protected char[] escapeUnsafe(char c) {
           return replacementChars;
         }
@@ -198,6 +203,7 @@
    * @param c the character to escape if necessary
    * @return the replacement string, or {@code null} if no escaping was needed
    */
+  @CheckForNull
   public static String computeReplacement(CharEscaper escaper, char c) {
     return stringOrNull(escaper.escape(c));
   }
@@ -211,11 +217,13 @@
    * @param cp the Unicode code point to escape if necessary
    * @return the replacement string, or {@code null} if no escaping was needed
    */
+  @CheckForNull
   public static String computeReplacement(UnicodeEscaper escaper, int cp) {
     return stringOrNull(escaper.escape(cp));
   }
 
-  private static String stringOrNull(char[] in) {
+  @CheckForNull
+  private static String stringOrNull(@CheckForNull char[] in) {
     return (in == null) ? null : new String(in);
   }
 
@@ -223,6 +231,7 @@
   private static UnicodeEscaper wrap(final CharEscaper escaper) {
     return new UnicodeEscaper() {
       @Override
+      @CheckForNull
       protected char[] escape(int cp) {
         // If a code point maps to a single character, just escape that.
         if (cp < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
diff --git a/android/guava/src/com/google/common/escape/ParametricNullness.java b/android/guava/src/com/google/common/escape/ParametricNullness.java
new file mode 100644
index 0000000..2f03d59
--- /dev/null
+++ b/android/guava/src/com/google/common/escape/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.escape;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/escape/Platform.java b/android/guava/src/com/google/common/escape/Platform.java
index 99a7d4f..dc6610c 100644
--- a/android/guava/src/com/google/common/escape/Platform.java
+++ b/android/guava/src/com/google/common/escape/Platform.java
@@ -22,6 +22,7 @@
  * @author Jesse Wilson
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class Platform {
   private Platform() {}
 
diff --git a/android/guava/src/com/google/common/escape/UnicodeEscaper.java b/android/guava/src/com/google/common/escape/UnicodeEscaper.java
index 0642162..c10ae34 100644
--- a/android/guava/src/com/google/common/escape/UnicodeEscaper.java
+++ b/android/guava/src/com/google/common/escape/UnicodeEscaper.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import javax.annotation.CheckForNull;
 
 /**
  * An {@link Escaper} that converts literal text into a format safe for inclusion in a particular
@@ -51,6 +52,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class UnicodeEscaper extends Escaper {
   /** The amount of padding (chars) to use when growing the escape buffer. */
   private static final int DEST_PAD = 32;
@@ -77,6 +79,7 @@
    * @param cp the Unicode code point to escape if necessary
    * @return the replacement characters, or {@code null} if no escaping was needed
    */
+  @CheckForNull
   protected abstract char[] escape(int cp);
 
   /**
diff --git a/android/guava/src/com/google/common/eventbus/AllowConcurrentEvents.java b/android/guava/src/com/google/common/eventbus/AllowConcurrentEvents.java
index 4c749b4..28bc4b2 100644
--- a/android/guava/src/com/google/common/eventbus/AllowConcurrentEvents.java
+++ b/android/guava/src/com/google/common/eventbus/AllowConcurrentEvents.java
@@ -14,7 +14,6 @@
 
 package com.google.common.eventbus;
 
-import com.google.common.annotations.Beta;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -31,5 +30,5 @@
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
-@Beta
+@ElementTypesAreNonnullByDefault
 public @interface AllowConcurrentEvents {}
diff --git a/android/guava/src/com/google/common/eventbus/AsyncEventBus.java b/android/guava/src/com/google/common/eventbus/AsyncEventBus.java
index 8650a8d..4f387a7 100644
--- a/android/guava/src/com/google/common/eventbus/AsyncEventBus.java
+++ b/android/guava/src/com/google/common/eventbus/AsyncEventBus.java
@@ -14,7 +14,6 @@
 
 package com.google.common.eventbus;
 
-import com.google.common.annotations.Beta;
 import java.util.concurrent.Executor;
 
 /**
@@ -24,7 +23,7 @@
  * @author Cliff Biffle
  * @since 10.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public class AsyncEventBus extends EventBus {
 
   /**
diff --git a/android/guava/src/com/google/common/eventbus/DeadEvent.java b/android/guava/src/com/google/common/eventbus/DeadEvent.java
index 6dbfee5..2cdb23f 100644
--- a/android/guava/src/com/google/common/eventbus/DeadEvent.java
+++ b/android/guava/src/com/google/common/eventbus/DeadEvent.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 
 /**
@@ -28,7 +27,7 @@
  * @author Cliff Biffle
  * @since 10.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public class DeadEvent {
 
   private final Object source;
diff --git a/android/guava/src/com/google/common/eventbus/Dispatcher.java b/android/guava/src/com/google/common/eventbus/Dispatcher.java
index 11e2de1..ff1ae2a 100644
--- a/android/guava/src/com/google/common/eventbus/Dispatcher.java
+++ b/android/guava/src/com/google/common/eventbus/Dispatcher.java
@@ -31,6 +31,7 @@
  *
  * @author Colin Decker
  */
+@ElementTypesAreNonnullByDefault
 abstract class Dispatcher {
 
   /**
diff --git a/android/guava/src/com/google/common/eventbus/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/eventbus/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..e8542bb
--- /dev/null
+++ b/android/guava/src/com/google/common/eventbus/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.eventbus;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/eventbus/EventBus.java b/android/guava/src/com/google/common/eventbus/EventBus.java
index e505399..4afc197 100644
--- a/android/guava/src/com/google/common/eventbus/EventBus.java
+++ b/android/guava/src/com/google/common/eventbus/EventBus.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.lang.reflect.Method;
@@ -29,6 +28,62 @@
 /**
  * Dispatches events to listeners, and provides ways for listeners to register themselves.
  *
+ * <h2>Avoid EventBus</h2>
+ *
+ * <p><b>We recommend against using EventBus.</b> It was designed many years ago, and newer
+ * libraries offer better ways to decouple components and react to events.
+ *
+ * <p>To decouple components, we recommend a dependency-injection framework. For Android code, most
+ * apps use <a href="https://dagger.dev">Dagger</a>. For server code, common options include <a
+ * href="https://github.com/google/guice/wiki/Motivation">Guice</a> and <a
+ * href="https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-introduction">Spring</a>.
+ * Frameworks typically offer a way to register multiple listeners independently and then request
+ * them together as a set (<a href="https://dagger.dev/dev-guide/multibindings">Dagger</a>, <a
+ * href="https://github.com/google/guice/wiki/Multibindings">Guice</a>, <a
+ * href="https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-autowired-annotation">Spring</a>).
+ *
+ * <p>To react to events, we recommend a reactive-streams framework like <a
+ * href="https://github.com/ReactiveX/RxJava/wiki">RxJava</a> (supplemented with its <a
+ * href="https://github.com/ReactiveX/RxAndroid">RxAndroid</a> extension if you are building for
+ * Android) or <a href="https://projectreactor.io/">Project Reactor</a>. (For the basics of
+ * translating code from using an event bus to using a reactive-streams framework, see these two
+ * guides: <a href="https://blog.jkl.gg/implementing-an-event-bus-with-rxjava-rxbus/">1</a>, <a
+ * href="https://lorentzos.com/rxjava-as-event-bus-the-right-way-10a36bdd49ba">2</a>.) Some usages
+ * of EventBus may be better written using <a
+ * href="https://kotlinlang.org/docs/coroutines-guide.html">Kotlin coroutines</a>, including <a
+ * href="https://kotlinlang.org/docs/flow.html">Flow</a> and <a
+ * href="https://kotlinlang.org/docs/channels.html">Channels</a>. Yet other usages are better served
+ * by individual libraries that provide specialized support for particular use cases.
+ *
+ * <p>Disadvantages of EventBus include:
+ *
+ * <ul>
+ *   <li>It makes the cross-references between producer and subscriber harder to find. This can
+ *       complicate debugging, lead to unintentional reentrant calls, and force apps to eagerly
+ *       initialize all possible subscribers at startup time.
+ *   <li>It uses reflection in ways that break when code is processed by optimizers/minimizers like
+ *       <a href="https://developer.android.com/studio/build/shrink-code">R8 and Proguard</a>.
+ *   <li>It doesn't offer a way to wait for multiple events before taking action. For example, it
+ *       doesn't offer a way to wait for multiple producers to all report that they're "ready," nor
+ *       does it offer a way to batch multiple events from a single producer together.
+ *   <li>It doesn't support backpressure and other features needed for resilience.
+ *   <li>It doesn't provide much control of threading.
+ *   <li>It doesn't offer much monitoring.
+ *   <li>It doesn't propagate exceptions, so apps don't have a way to react to them.
+ *   <li>It doesn't interoperate well with RxJava, coroutines, and other more commonly used
+ *       alternatives.
+ *   <li>It imposes requirements on the lifecycle of its subscribers. For example, if an event
+ *       occurs between when one subscriber is removed and the next subscriber is added, the event
+ *       is dropped.
+ *   <li>Its performance is suboptimal, especially under Android.
+ *   <li>It <a href="https://github.com/google/guava/issues/1431">doesn't support parameterized
+ *       types</a>.
+ *   <li>With the introduction of lambdas in Java 8, EventBus went from less verbose than listeners
+ *       to <a href="https://github.com/google/guava/issues/3311">more verbose</a>.
+ * </ul>
+ *
+ * <h2>EventBus Summary</h2>
+ *
  * <p>The EventBus allows publish-subscribe-style communication between components without requiring
  * the components to explicitly register with one another (and thus be aware of each other). It is
  * designed exclusively to replace traditional Java in-process event distribution using explicit
@@ -92,7 +147,7 @@
  * @author Cliff Biffle
  * @since 10.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public class EventBus {
 
   private static final Logger logger = Logger.getLogger(EventBus.class.getName());
diff --git a/android/guava/src/com/google/common/eventbus/ParametricNullness.java b/android/guava/src/com/google/common/eventbus/ParametricNullness.java
new file mode 100644
index 0000000..fc5bb17
--- /dev/null
+++ b/android/guava/src/com/google/common/eventbus/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.eventbus;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/eventbus/Subscribe.java b/android/guava/src/com/google/common/eventbus/Subscribe.java
index 52b999d..88477f1 100644
--- a/android/guava/src/com/google/common/eventbus/Subscribe.java
+++ b/android/guava/src/com/google/common/eventbus/Subscribe.java
@@ -14,7 +14,6 @@
 
 package com.google.common.eventbus;
 
-import com.google.common.annotations.Beta;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -36,5 +35,5 @@
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
-@Beta
+@ElementTypesAreNonnullByDefault
 public @interface Subscribe {}
diff --git a/android/guava/src/com/google/common/eventbus/Subscriber.java b/android/guava/src/com/google/common/eventbus/Subscriber.java
index 42a63f2..73e7f42 100644
--- a/android/guava/src/com/google/common/eventbus/Subscriber.java
+++ b/android/guava/src/com/google/common/eventbus/Subscriber.java
@@ -21,7 +21,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.concurrent.Executor;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A subscriber method on a specific object, plus the executor that should be used for dispatching
@@ -32,6 +32,7 @@
  *
  * @author Colin Decker
  */
+@ElementTypesAreNonnullByDefault
 class Subscriber {
 
   /** Creates a {@code Subscriber} for {@code method} on {@code listener}. */
@@ -108,7 +109,7 @@
   }
 
   @Override
-  public final boolean equals(@NullableDecl Object obj) {
+  public final boolean equals(@CheckForNull Object obj) {
     if (obj instanceof Subscriber) {
       Subscriber that = (Subscriber) obj;
       // Use == so that different equal instances will still receive events.
diff --git a/android/guava/src/com/google/common/eventbus/SubscriberExceptionContext.java b/android/guava/src/com/google/common/eventbus/SubscriberExceptionContext.java
index 6ddd86f..63c7d55 100644
--- a/android/guava/src/com/google/common/eventbus/SubscriberExceptionContext.java
+++ b/android/guava/src/com/google/common/eventbus/SubscriberExceptionContext.java
@@ -23,6 +23,7 @@
  *
  * @since 16.0
  */
+@ElementTypesAreNonnullByDefault
 public class SubscriberExceptionContext {
   private final EventBus eventBus;
   private final Object event;
@@ -31,7 +32,7 @@
 
   /**
    * @param eventBus The {@link EventBus} that handled the event and the subscriber. Useful for
-   *     broadcasting a a new event based on the error.
+   *     broadcasting a new event based on the error.
    * @param event The event object that caused the subscriber to throw.
    * @param subscriber The source subscriber context.
    * @param subscriberMethod the subscribed method.
@@ -46,7 +47,7 @@
 
   /**
    * @return The {@link EventBus} that handled the event and the subscriber. Useful for broadcasting
-   *     a a new event based on the error.
+   *     a new event based on the error.
    */
   public EventBus getEventBus() {
     return eventBus;
diff --git a/android/guava/src/com/google/common/eventbus/SubscriberExceptionHandler.java b/android/guava/src/com/google/common/eventbus/SubscriberExceptionHandler.java
index c239ad7..1c2fbb1 100644
--- a/android/guava/src/com/google/common/eventbus/SubscriberExceptionHandler.java
+++ b/android/guava/src/com/google/common/eventbus/SubscriberExceptionHandler.java
@@ -14,11 +14,13 @@
 
 package com.google.common.eventbus;
 
+
 /**
  * Handler for exceptions thrown by event subscribers.
  *
  * @since 16.0
  */
+@ElementTypesAreNonnullByDefault
 public interface SubscriberExceptionHandler {
   /** Handles exceptions thrown by subscribers. */
   void handleException(Throwable exception, SubscriberExceptionContext context);
diff --git a/android/guava/src/com/google/common/eventbus/SubscriberRegistry.java b/android/guava/src/com/google/common/eventbus/SubscriberRegistry.java
index 6a6ceac..46e9820 100644
--- a/android/guava/src/com/google/common/eventbus/SubscriberRegistry.java
+++ b/android/guava/src/com/google/common/eventbus/SubscriberRegistry.java
@@ -46,13 +46,14 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArraySet;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Registry of subscribers to a single event bus.
  *
  * @author Colin Decker
  */
+@ElementTypesAreNonnullByDefault
 final class SubscriberRegistry {
 
   /**
@@ -258,7 +259,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof MethodIdentifier) {
         MethodIdentifier ident = (MethodIdentifier) o;
         return name.equals(ident.name) && parameterTypes.equals(ident.parameterTypes);
diff --git a/android/guava/src/com/google/common/graph/AbstractBaseGraph.java b/android/guava/src/com/google/common/graph/AbstractBaseGraph.java
index b68656b..c4be6b6 100644
--- a/android/guava/src/com/google/common/graph/AbstractBaseGraph.java
+++ b/android/guava/src/com/google/common/graph/AbstractBaseGraph.java
@@ -30,7 +30,7 @@
 import com.google.common.primitives.Ints;
 import java.util.AbstractSet;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides a skeletal implementation of {@link BaseGraph}.
@@ -41,6 +41,7 @@
  * @author James Sexton
  * @param <N> Node parameter type
  */
+@ElementTypesAreNonnullByDefault
 abstract class AbstractBaseGraph<N> implements BaseGraph<N> {
 
   /**
@@ -76,7 +77,7 @@
       }
 
       @Override
-      public boolean remove(Object o) {
+      public boolean remove(@CheckForNull Object o) {
         throw new UnsupportedOperationException();
       }
 
@@ -85,7 +86,7 @@
       // Graph<LinkedList>.
       @SuppressWarnings("unchecked")
       @Override
-      public boolean contains(@NullableDecl Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         if (!(obj instanceof EndpointPair)) {
           return false;
         }
diff --git a/android/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java b/android/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
index 8335d0c..ac452d4 100644
--- a/android/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
@@ -20,6 +20,7 @@
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.graph.Graphs.checkNonNegative;
 import static com.google.common.graph.Graphs.checkPositive;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Iterators;
@@ -30,7 +31,7 @@
 import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A base implementation of {@link NetworkConnections} for directed networks.
@@ -39,17 +40,17 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 abstract class AbstractDirectedNetworkConnections<N, E> implements NetworkConnections<N, E> {
   /** Keys are edges incoming to the origin node, values are the source node. */
-  protected final Map<E, N> inEdgeMap;
+  final Map<E, N> inEdgeMap;
 
   /** Keys are edges outgoing from the origin node, values are the target node. */
-  protected final Map<E, N> outEdgeMap;
+  final Map<E, N> outEdgeMap;
 
   private int selfLoopCount;
 
-  protected AbstractDirectedNetworkConnections(
-      Map<E, N> inEdgeMap, Map<E, N> outEdgeMap, int selfLoopCount) {
+  AbstractDirectedNetworkConnections(Map<E, N> inEdgeMap, Map<E, N> outEdgeMap, int selfLoopCount) {
     this.inEdgeMap = checkNotNull(inEdgeMap);
     this.outEdgeMap = checkNotNull(outEdgeMap);
     this.selfLoopCount = checkNonNegative(selfLoopCount);
@@ -79,7 +80,7 @@
       }
 
       @Override
-      public boolean contains(@NullableDecl Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         return inEdgeMap.containsKey(obj) || outEdgeMap.containsKey(obj);
       }
     };
@@ -99,7 +100,8 @@
   public N adjacentNode(E edge) {
     // Since the reference node is defined to be 'source' for directed graphs,
     // we can assume this edge lives in the set of outgoing edges.
-    return checkNotNull(outEdgeMap.get(edge));
+    // (We're relying on callers to call this method only with an edge that's in the graph.)
+    return requireNonNull(outEdgeMap.get(edge));
   }
 
   @Override
@@ -108,13 +110,15 @@
       checkNonNegative(--selfLoopCount);
     }
     N previousNode = inEdgeMap.remove(edge);
-    return checkNotNull(previousNode);
+    // We're relying on callers to call this method only with an edge that's in the graph.
+    return requireNonNull(previousNode);
   }
 
   @Override
   public N removeOutEdge(E edge) {
     N previousNode = outEdgeMap.remove(edge);
-    return checkNotNull(previousNode);
+    // We're relying on callers to call this method only with an edge that's in the graph.
+    return requireNonNull(previousNode);
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/graph/AbstractGraph.java b/android/guava/src/com/google/common/graph/AbstractGraph.java
index fc71345..9402be5 100644
--- a/android/guava/src/com/google/common/graph/AbstractGraph.java
+++ b/android/guava/src/com/google/common/graph/AbstractGraph.java
@@ -17,7 +17,7 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides a skeletal implementation of {@link Graph}. It is recommended to extend this
@@ -28,10 +28,11 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractGraph<N> extends AbstractBaseGraph<N> implements Graph<N> {
 
   @Override
-  public final boolean equals(@NullableDecl Object obj) {
+  public final boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/graph/AbstractGraphBuilder.java b/android/guava/src/com/google/common/graph/AbstractGraphBuilder.java
index 84e461a..a4e1543 100644
--- a/android/guava/src/com/google/common/graph/AbstractGraphBuilder.java
+++ b/android/guava/src/com/google/common/graph/AbstractGraphBuilder.java
@@ -23,6 +23,7 @@
  *
  * @author James Sexton
  */
+@ElementTypesAreNonnullByDefault
 abstract class AbstractGraphBuilder<N> {
   final boolean directed;
   boolean allowsSelfLoops = false;
diff --git a/android/guava/src/com/google/common/graph/AbstractNetwork.java b/android/guava/src/com/google/common/graph/AbstractNetwork.java
index fad1514..9afbb03 100644
--- a/android/guava/src/com/google/common/graph/AbstractNetwork.java
+++ b/android/guava/src/com/google/common/graph/AbstractNetwork.java
@@ -34,7 +34,7 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides a skeletal implementation of {@link Network}. It is recommended to extend
@@ -49,6 +49,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractNetwork<N, E> implements Network<N, E> {
 
   @Override
@@ -89,7 +90,7 @@
           // Network<LinkedList>.
           @SuppressWarnings("unchecked")
           @Override
-          public boolean contains(@NullableDecl Object obj) {
+          public boolean contains(@CheckForNull Object obj) {
             if (!(obj instanceof EndpointPair)) {
               return false;
             }
@@ -194,7 +195,7 @@
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public E edgeConnectingOrNull(N nodeU, N nodeV) {
     Set<E> edgesConnecting = edgesConnecting(nodeU, nodeV);
     switch (edgesConnecting.size()) {
@@ -208,7 +209,7 @@
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public E edgeConnectingOrNull(EndpointPair<N> endpoints) {
     validateEndpoints(endpoints);
     return edgeConnectingOrNull(endpoints.nodeU(), endpoints.nodeV());
@@ -244,7 +245,7 @@
   }
 
   @Override
-  public final boolean equals(@NullableDecl Object obj) {
+  public final boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/graph/AbstractUndirectedNetworkConnections.java b/android/guava/src/com/google/common/graph/AbstractUndirectedNetworkConnections.java
index 03279d0..8f736d7 100644
--- a/android/guava/src/com/google/common/graph/AbstractUndirectedNetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/AbstractUndirectedNetworkConnections.java
@@ -18,10 +18,12 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
 
 import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 
 /**
  * A base implementation of {@link NetworkConnections} for undirected networks.
@@ -30,11 +32,12 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 abstract class AbstractUndirectedNetworkConnections<N, E> implements NetworkConnections<N, E> {
   /** Keys are edges incident to the origin node, values are the node at the other end. */
-  protected final Map<E, N> incidentEdgeMap;
+  final Map<E, N> incidentEdgeMap;
 
-  protected AbstractUndirectedNetworkConnections(Map<E, N> incidentEdgeMap) {
+  AbstractUndirectedNetworkConnections(Map<E, N> incidentEdgeMap) {
     this.incidentEdgeMap = checkNotNull(incidentEdgeMap);
   }
 
@@ -65,10 +68,12 @@
 
   @Override
   public N adjacentNode(E edge) {
-    return checkNotNull(incidentEdgeMap.get(edge));
+    // We're relying on callers to call this method only with an edge that's in the graph.
+    return requireNonNull(incidentEdgeMap.get(edge));
   }
 
   @Override
+  @CheckForNull
   public N removeInEdge(E edge, boolean isSelfLoop) {
     if (!isSelfLoop) {
       return removeOutEdge(edge);
@@ -79,7 +84,8 @@
   @Override
   public N removeOutEdge(E edge) {
     N previousNode = incidentEdgeMap.remove(edge);
-    return checkNotNull(previousNode);
+    // We're relying on callers to call this method only with an edge that's in the graph.
+    return requireNonNull(previousNode);
   }
 
   @Override
diff --git a/android/guava/src/com/google/common/graph/AbstractValueGraph.java b/android/guava/src/com/google/common/graph/AbstractValueGraph.java
index be2b7cc..940aeff 100644
--- a/android/guava/src/com/google/common/graph/AbstractValueGraph.java
+++ b/android/guava/src/com/google/common/graph/AbstractValueGraph.java
@@ -16,12 +16,14 @@
 
 package com.google.common.graph;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
 import com.google.common.collect.Maps;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides a skeletal implementation of {@link ValueGraph}. It is recommended to extend
@@ -36,6 +38,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractValueGraph<N, V> extends AbstractBaseGraph<N>
     implements ValueGraph<N, V> {
 
@@ -105,7 +108,7 @@
   }
 
   @Override
-  public final boolean equals(@NullableDecl Object obj) {
+  public final boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     }
@@ -142,7 +145,8 @@
         new Function<EndpointPair<N>, V>() {
           @Override
           public V apply(EndpointPair<N> edge) {
-            return graph.edgeValueOrDefault(edge.nodeU(), edge.nodeV(), null);
+            // requireNonNull is safe because the endpoint pair comes from the graph.
+            return requireNonNull(graph.edgeValueOrDefault(edge.nodeU(), edge.nodeV(), null));
           }
         };
     return Maps.asMap(graph.edges(), edgeToValueFn);
diff --git a/android/guava/src/com/google/common/graph/BaseGraph.java b/android/guava/src/com/google/common/graph/BaseGraph.java
index 1df5de7..68813e1 100644
--- a/android/guava/src/com/google/common/graph/BaseGraph.java
+++ b/android/guava/src/com/google/common/graph/BaseGraph.java
@@ -24,6 +24,7 @@
  * @author James Sexton
  * @param <N> Node parameter type
  */
+@ElementTypesAreNonnullByDefault
 interface BaseGraph<N> extends SuccessorsFunction<N>, PredecessorsFunction<N> {
   //
   // Graph-level accessors
diff --git a/android/guava/src/com/google/common/graph/DirectedGraphConnections.java b/android/guava/src/com/google/common/graph/DirectedGraphConnections.java
index 12887b7..23083da 100644
--- a/android/guava/src/com/google/common/graph/DirectedGraphConnections.java
+++ b/android/guava/src/com/google/common/graph/DirectedGraphConnections.java
@@ -40,7 +40,7 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link GraphConnections} for directed graphs.
@@ -50,6 +50,7 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class DirectedGraphConnections<N, V> implements GraphConnections<N, V> {
   /**
    * A wrapper class to indicate a node is both a predecessor and successor while still providing
@@ -82,7 +83,7 @@
       }
 
       @Override
-      public boolean equals(Object that) {
+      public boolean equals(@CheckForNull Object that) {
         if (that instanceof Pred) {
           return this.node.equals(((Pred<?>) that).node);
         } else {
@@ -103,7 +104,7 @@
       }
 
       @Override
-      public boolean equals(Object that) {
+      public boolean equals(@CheckForNull Object that) {
         if (that instanceof Succ) {
           return this.node.equals(((Succ<?>) that).node);
         } else {
@@ -133,14 +134,14 @@
    * LinkedHashMap combines two such edges into a single node-value pair, even though the edges may
    * not have been inserted consecutively.
    */
-  @NullableDecl private final List<NodeConnection<N>> orderedNodeConnections;
+  @CheckForNull private final List<NodeConnection<N>> orderedNodeConnections;
 
   private int predecessorCount;
   private int successorCount;
 
   private DirectedGraphConnections(
       Map<N, Object> adjacentNodeValues,
-      @NullableDecl List<NodeConnection<N>> orderedNodeConnections,
+      @CheckForNull List<NodeConnection<N>> orderedNodeConnections,
       int predecessorCount,
       int successorCount) {
     this.adjacentNodeValues = checkNotNull(adjacentNodeValues);
@@ -242,6 +243,7 @@
           final Set<N> seenNodes = new HashSet<>();
           return new AbstractIterator<N>() {
             @Override
+            @CheckForNull
             protected N computeNext() {
               while (nodeConnections.hasNext()) {
                 NodeConnection<N> nodeConnection = nodeConnections.next();
@@ -261,7 +263,7 @@
         }
 
         @Override
-        public boolean contains(@NullableDecl Object obj) {
+        public boolean contains(@CheckForNull Object obj) {
           return adjacentNodeValues.containsKey(obj);
         }
       };
@@ -277,6 +279,7 @@
           final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
           return new AbstractIterator<N>() {
             @Override
+            @CheckForNull
             protected N computeNext() {
               while (entries.hasNext()) {
                 Entry<N, Object> entry = entries.next();
@@ -291,6 +294,7 @@
           final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
           return new AbstractIterator<N>() {
             @Override
+            @CheckForNull
             protected N computeNext() {
               while (nodeConnections.hasNext()) {
                 NodeConnection<N> nodeConnection = nodeConnections.next();
@@ -310,7 +314,7 @@
       }
 
       @Override
-      public boolean contains(@NullableDecl Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         return isPredecessor(adjacentNodeValues.get(obj));
       }
     };
@@ -325,6 +329,7 @@
           final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
           return new AbstractIterator<N>() {
             @Override
+            @CheckForNull
             protected N computeNext() {
               while (entries.hasNext()) {
                 Entry<N, Object> entry = entries.next();
@@ -339,6 +344,7 @@
           final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
           return new AbstractIterator<N>() {
             @Override
+            @CheckForNull
             protected N computeNext() {
               while (nodeConnections.hasNext()) {
                 NodeConnection<N> nodeConnection = nodeConnections.next();
@@ -358,7 +364,7 @@
       }
 
       @Override
-      public boolean contains(@NullableDecl Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         return isSuccessor(adjacentNodeValues.get(obj));
       }
     };
@@ -407,6 +413,7 @@
     final AtomicBoolean alreadySeenSelfLoop = new AtomicBoolean(false);
     return new AbstractIterator<EndpointPair<N>>() {
       @Override
+      @CheckForNull
       protected EndpointPair<N> computeNext() {
         while (resultWithDoubleSelfLoop.hasNext()) {
           EndpointPair<N> edge = resultWithDoubleSelfLoop.next();
@@ -425,6 +432,7 @@
 
   @SuppressWarnings("unchecked")
   @Override
+  @CheckForNull
   public V value(N node) {
     checkNotNull(node);
     Object value = adjacentNodeValues.get(node);
@@ -466,6 +474,7 @@
 
   @SuppressWarnings("unchecked")
   @Override
+  @CheckForNull
   public V removeSuccessor(Object node) {
     checkNotNull(node);
     Object previousValue = adjacentNodeValues.get(node);
@@ -489,7 +498,14 @@
       }
     }
 
-    return (V) removedValue;
+    /*
+     * TODO(cpovirk): `return (V) removedValue` once our checker permits that.
+     *
+     * (We promoted a class of warnings into errors because sometimes they indicate real problems.
+     * But now we need to "undo" some instance of spurious errors, as discussed in
+     * https://github.com/jspecify/checker-framework/issues/8.)
+     */
+    return removedValue == null ? null : (V) removedValue;
   }
 
   @Override
@@ -522,6 +538,7 @@
 
   @SuppressWarnings("unchecked")
   @Override
+  @CheckForNull
   public V addSuccessor(N node, V value) {
     Object previousValue = adjacentNodeValues.put(node, value);
     Object previousSuccessor;
@@ -546,14 +563,15 @@
       }
     }
 
-    return (V) previousSuccessor;
+    // See the comment on the similar cast in removeSuccessor.
+    return previousSuccessor == null ? null : (V) previousSuccessor;
   }
 
-  private static boolean isPredecessor(@NullableDecl Object value) {
+  private static boolean isPredecessor(@CheckForNull Object value) {
     return (value == PRED) || (value instanceof PredAndSucc);
   }
 
-  private static boolean isSuccessor(@NullableDecl Object value) {
+  private static boolean isSuccessor(@CheckForNull Object value) {
     return (value != PRED) && (value != null);
   }
 }
diff --git a/android/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java b/android/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
index e1ed3cc..05f40c2 100644
--- a/android/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
@@ -30,7 +30,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link NetworkConnections} for directed networks with parallel edges.
@@ -39,6 +39,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class DirectedMultiNetworkConnections<N, E> extends AbstractDirectedNetworkConnections<N, E> {
 
   private DirectedMultiNetworkConnections(
@@ -59,7 +60,7 @@
         ImmutableMap.copyOf(inEdges), ImmutableMap.copyOf(outEdges), selfLoopCount);
   }
 
-  @LazyInit private transient Reference<Multiset<N>> predecessorsReference;
+  @CheckForNull @LazyInit private transient Reference<Multiset<N>> predecessorsReference;
 
   @Override
   public Set<N> predecessors() {
@@ -75,7 +76,7 @@
     return predecessors;
   }
 
-  @LazyInit private transient Reference<Multiset<N>> successorsReference;
+  @CheckForNull @LazyInit private transient Reference<Multiset<N>> successorsReference;
 
   @Override
   public Set<N> successors() {
@@ -139,8 +140,8 @@
     }
   }
 
-  @NullableDecl
-  private static <T> T getReference(@NullableDecl Reference<T> reference) {
+  @CheckForNull
+  private static <T> T getReference(@CheckForNull Reference<T> reference) {
     return (reference == null) ? null : reference.get();
   }
 }
diff --git a/android/guava/src/com/google/common/graph/DirectedNetworkConnections.java b/android/guava/src/com/google/common/graph/DirectedNetworkConnections.java
index 2a0b010..c2a25a5 100644
--- a/android/guava/src/com/google/common/graph/DirectedNetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/DirectedNetworkConnections.java
@@ -32,10 +32,10 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class DirectedNetworkConnections<N, E> extends AbstractDirectedNetworkConnections<N, E> {
 
-  protected DirectedNetworkConnections(
-      Map<E, N> inEdgeMap, Map<E, N> outEdgeMap, int selfLoopCount) {
+  DirectedNetworkConnections(Map<E, N> inEdgeMap, Map<E, N> outEdgeMap, int selfLoopCount) {
     super(inEdgeMap, outEdgeMap, selfLoopCount);
   }
 
diff --git a/android/guava/src/com/google/common/graph/EdgesConnecting.java b/android/guava/src/com/google/common/graph/EdgesConnecting.java
index d62eefa..797970b 100644
--- a/android/guava/src/com/google/common/graph/EdgesConnecting.java
+++ b/android/guava/src/com/google/common/graph/EdgesConnecting.java
@@ -23,7 +23,7 @@
 import com.google.common.collect.UnmodifiableIterator;
 import java.util.AbstractSet;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A class to represent the set of edges connecting an (implicit) origin node to a target node.
@@ -34,6 +34,7 @@
  * @author James Sexton
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class EdgesConnecting<E> extends AbstractSet<E> {
 
   private final Map<?, E> nodeToOutEdge;
@@ -58,12 +59,12 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object edge) {
+  public boolean contains(@CheckForNull Object edge) {
     E connectingEdge = getConnectingEdge();
     return (connectingEdge != null && connectingEdge.equals(edge));
   }
 
-  @NullableDecl
+  @CheckForNull
   private E getConnectingEdge() {
     return nodeToOutEdge.get(targetNode);
   }
diff --git a/android/guava/src/com/google/common/graph/ElementOrder.java b/android/guava/src/com/google/common/graph/ElementOrder.java
index 568fb42..ea13674 100644
--- a/android/guava/src/com/google/common/graph/ElementOrder.java
+++ b/android/guava/src/com/google/common/graph/ElementOrder.java
@@ -28,7 +28,7 @@
 import com.google.errorprone.annotations.Immutable;
 import java.util.Comparator;
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Used to represent the order of elements in a data structure that supports different options for
@@ -46,11 +46,12 @@
  */
 @Beta
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class ElementOrder<T> {
   private final Type type;
 
   @SuppressWarnings("Immutable") // Hopefully the comparator provided is immutable!
-  @NullableDecl
+  @CheckForNull
   private final Comparator<T> comparator;
 
   /**
@@ -71,7 +72,7 @@
     SORTED
   }
 
-  private ElementOrder(Type type, @NullableDecl Comparator<T> comparator) {
+  private ElementOrder(Type type, @CheckForNull Comparator<T> comparator) {
     this.type = checkNotNull(type);
     this.comparator = comparator;
     checkState((type == Type.SORTED) == (comparator != null));
@@ -160,7 +161,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/graph/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/graph/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..0798de0
--- /dev/null
+++ b/android/guava/src/com/google/common/graph/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.graph;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/graph/EndpointPair.java b/android/guava/src/com/google/common/graph/EndpointPair.java
index 7caa43b..7aa3860 100644
--- a/android/guava/src/com/google/common/graph/EndpointPair.java
+++ b/android/guava/src/com/google/common/graph/EndpointPair.java
@@ -24,7 +24,7 @@
 import com.google.common.collect.Iterators;
 import com.google.common.collect.UnmodifiableIterator;
 import com.google.errorprone.annotations.Immutable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable pair representing the two endpoints of an edge in a graph. The {@link EndpointPair}
@@ -39,6 +39,7 @@
  */
 @Beta
 @Immutable(containerOf = {"N"})
+@ElementTypesAreNonnullByDefault
 public abstract class EndpointPair<N> implements Iterable<N> {
   private final N nodeU;
   private final N nodeV;
@@ -103,8 +104,9 @@
    * Returns the node that is adjacent to {@code node} along the origin edge.
    *
    * @throws IllegalArgumentException if this {@link EndpointPair} does not contain {@code node}
+   * @since 20.0 (but the argument type was changed from {@code Object} to {@code N} in 31.0)
    */
-  public final N adjacentNode(Object node) {
+  public final N adjacentNode(N node) {
     if (node.equals(nodeU)) {
       return nodeV;
     } else if (node.equals(nodeV)) {
@@ -132,7 +134,7 @@
    * ordered {@link EndpointPair} is never equal to an unordered {@link EndpointPair}.
    */
   @Override
-  public abstract boolean equals(@NullableDecl Object obj);
+  public abstract boolean equals(@CheckForNull Object obj);
 
   /**
    * The hashcode of an ordered {@link EndpointPair} is equal to {@code Objects.hashCode(source(),
@@ -163,7 +165,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj == this) {
         return true;
       }
@@ -211,7 +213,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj == this) {
         return true;
       }
diff --git a/android/guava/src/com/google/common/graph/EndpointPairIterator.java b/android/guava/src/com/google/common/graph/EndpointPairIterator.java
index c4e6e07..7096dbe 100644
--- a/android/guava/src/com/google/common/graph/EndpointPairIterator.java
+++ b/android/guava/src/com/google/common/graph/EndpointPairIterator.java
@@ -17,24 +17,30 @@
 package com.google.common.graph;
 
 import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.AbstractIterator;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import java.util.Iterator;
 import java.util.Set;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A class to facilitate the set returned by {@link Graph#edges()}.
  *
  * @author James Sexton
  */
+@ElementTypesAreNonnullByDefault
 abstract class EndpointPairIterator<N> extends AbstractIterator<EndpointPair<N>> {
   private final BaseGraph<N> graph;
   private final Iterator<N> nodeIterator;
 
-  protected N node = null; // null is safe as an initial value because graphs don't allow null nodes
-  protected Iterator<N> successorIterator = ImmutableSet.<N>of().iterator();
+  @CheckForNull
+  N node = null; // null is safe as an initial value because graphs don't allow null nodes
+
+  Iterator<N> successorIterator = ImmutableSet.<N>of().iterator();
 
   static <N> EndpointPairIterator<N> of(BaseGraph<N> graph) {
     return graph.isDirected() ? new Directed<N>(graph) : new Undirected<N>(graph);
@@ -49,7 +55,7 @@
    * Called after {@link #successorIterator} is exhausted. Advances {@link #node} to the next node
    * and updates {@link #successorIterator} to iterate through the successors of {@link #node}.
    */
-  protected final boolean advance() {
+  final boolean advance() {
     checkState(!successorIterator.hasNext());
     if (!nodeIterator.hasNext()) {
       return false;
@@ -69,10 +75,12 @@
     }
 
     @Override
+    @CheckForNull
     protected EndpointPair<N> computeNext() {
       while (true) {
         if (successorIterator.hasNext()) {
-          return EndpointPair.ordered(node, successorIterator.next());
+          // requireNonNull is safe because successorIterator is empty until we set this.node.
+          return EndpointPair.ordered(requireNonNull(node), successorIterator.next());
         }
         if (!advance()) {
           return endOfData();
@@ -108,20 +116,28 @@
    * </pre>
    */
   private static final class Undirected<N> extends EndpointPairIterator<N> {
-    private Set<N> visitedNodes;
+    // It's a little weird that we add `null` to this set, but it makes for slightly simpler code.
+    @CheckForNull private Set<@Nullable N> visitedNodes;
 
     private Undirected(BaseGraph<N> graph) {
       super(graph);
-      this.visitedNodes = Sets.newHashSetWithExpectedSize(graph.nodes().size());
+      this.visitedNodes = Sets.newHashSetWithExpectedSize(graph.nodes().size() + 1);
     }
 
     @Override
+    @CheckForNull
     protected EndpointPair<N> computeNext() {
       while (true) {
+        /*
+         * requireNonNull is safe because visitedNodes isn't cleared until this method calls
+         * endOfData() (after which this method is never called again).
+         */
+        requireNonNull(visitedNodes);
         while (successorIterator.hasNext()) {
           N otherNode = successorIterator.next();
           if (!visitedNodes.contains(otherNode)) {
-            return EndpointPair.unordered(node, otherNode);
+            // requireNonNull is safe because successorIterator is empty until we set node.
+            return EndpointPair.unordered(requireNonNull(node), otherNode);
           }
         }
         // Add to visited set *after* processing neighbors so we still include self-loops.
diff --git a/android/guava/src/com/google/common/graph/ForwardingGraph.java b/android/guava/src/com/google/common/graph/ForwardingGraph.java
index 4a3ab8c..f4ddf42 100644
--- a/android/guava/src/com/google/common/graph/ForwardingGraph.java
+++ b/android/guava/src/com/google/common/graph/ForwardingGraph.java
@@ -24,9 +24,10 @@
  *
  * @author James Sexton
  */
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingGraph<N> extends AbstractGraph<N> {
 
-  protected abstract BaseGraph<N> delegate();
+  abstract BaseGraph<N> delegate();
 
   @Override
   public Set<N> nodes() {
diff --git a/android/guava/src/com/google/common/graph/ForwardingNetwork.java b/android/guava/src/com/google/common/graph/ForwardingNetwork.java
index 89766dc..fd21152 100644
--- a/android/guava/src/com/google/common/graph/ForwardingNetwork.java
+++ b/android/guava/src/com/google/common/graph/ForwardingNetwork.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import java.util.Set;
+import javax.annotation.CheckForNull;
 
 /**
  * A class to allow {@link Network} implementations to be backed by a provided delegate. This is not
@@ -25,9 +26,10 @@
  * @author James Sexton
  * @author Joshua O'Madadhain
  */
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingNetwork<N, E> extends AbstractNetwork<N, E> {
 
-  protected abstract Network<N, E> delegate();
+  abstract Network<N, E> delegate();
 
   @Override
   public Set<N> nodes() {
@@ -130,11 +132,13 @@
   }
 
   @Override
+  @CheckForNull
   public E edgeConnectingOrNull(N nodeU, N nodeV) {
     return delegate().edgeConnectingOrNull(nodeU, nodeV);
   }
 
   @Override
+  @CheckForNull
   public E edgeConnectingOrNull(EndpointPair<N> endpoints) {
     return delegate().edgeConnectingOrNull(endpoints);
   }
diff --git a/android/guava/src/com/google/common/graph/ForwardingValueGraph.java b/android/guava/src/com/google/common/graph/ForwardingValueGraph.java
index 2507890..70ed6e5 100644
--- a/android/guava/src/com/google/common/graph/ForwardingValueGraph.java
+++ b/android/guava/src/com/google/common/graph/ForwardingValueGraph.java
@@ -17,7 +17,7 @@
 package com.google.common.graph;
 
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A class to allow {@link ValueGraph} implementations to be backed by a provided delegate. This is
@@ -26,9 +26,10 @@
  * @author James Sexton
  * @author Joshua O'Madadhain
  */
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingValueGraph<N, V> extends AbstractValueGraph<N, V> {
 
-  protected abstract ValueGraph<N, V> delegate();
+  abstract ValueGraph<N, V> delegate();
 
   @Override
   public Set<N> nodes() {
@@ -105,14 +106,14 @@
   }
 
   @Override
-  @NullableDecl
-  public V edgeValueOrDefault(N nodeU, N nodeV, @NullableDecl V defaultValue) {
+  @CheckForNull
+  public V edgeValueOrDefault(N nodeU, N nodeV, @CheckForNull V defaultValue) {
     return delegate().edgeValueOrDefault(nodeU, nodeV, defaultValue);
   }
 
   @Override
-  @NullableDecl
-  public V edgeValueOrDefault(EndpointPair<N> endpoints, @NullableDecl V defaultValue) {
+  @CheckForNull
+  public V edgeValueOrDefault(EndpointPair<N> endpoints, @CheckForNull V defaultValue) {
     return delegate().edgeValueOrDefault(endpoints, defaultValue);
   }
 }
diff --git a/android/guava/src/com/google/common/graph/Graph.java b/android/guava/src/com/google/common/graph/Graph.java
index 8ed35fb..5dc0e71 100644
--- a/android/guava/src/com/google/common/graph/Graph.java
+++ b/android/guava/src/com/google/common/graph/Graph.java
@@ -20,7 +20,7 @@
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Collection;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An interface for <a
@@ -103,6 +103,7 @@
  */
 @Beta
 @DoNotMock("Use GraphBuilder to create a real instance")
+@ElementTypesAreNonnullByDefault
 public interface Graph<N> extends BaseGraph<N> {
   //
   // Graph-level accessors
@@ -289,7 +290,7 @@
    * <p>A reference implementation of this is provided by {@link AbstractGraph#equals(Object)}.
    */
   @Override
-  boolean equals(@NullableDecl Object object);
+  boolean equals(@CheckForNull Object object);
 
   /**
    * Returns the hash code for this graph. The hash code of a graph is defined as the hash code of
diff --git a/android/guava/src/com/google/common/graph/GraphBuilder.java b/android/guava/src/com/google/common/graph/GraphBuilder.java
index f00d7b1..d57ed37 100644
--- a/android/guava/src/com/google/common/graph/GraphBuilder.java
+++ b/android/guava/src/com/google/common/graph/GraphBuilder.java
@@ -64,6 +64,7 @@
  */
 @Beta
 @DoNotMock
+@ElementTypesAreNonnullByDefault
 public final class GraphBuilder<N> extends AbstractGraphBuilder<N> {
 
   /** Creates a new instance with the specified edge directionality. */
diff --git a/android/guava/src/com/google/common/graph/GraphConnections.java b/android/guava/src/com/google/common/graph/GraphConnections.java
index d783c78..7d4f8f0 100644
--- a/android/guava/src/com/google/common/graph/GraphConnections.java
+++ b/android/guava/src/com/google/common/graph/GraphConnections.java
@@ -19,7 +19,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An interface for representing and manipulating an origin node's adjacent nodes and edge values in
@@ -29,6 +29,7 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
+@ElementTypesAreNonnullByDefault
 interface GraphConnections<N, V> {
 
   Set<N> adjacentNodes();
@@ -48,7 +49,7 @@
    * Returns the value associated with the edge connecting the origin node to {@code node}, or null
    * if there is no such edge.
    */
-  @NullableDecl
+  @CheckForNull
   V value(N node);
 
   /** Remove {@code node} from the set of predecessors. */
@@ -59,6 +60,7 @@
    * the edge connecting the two nodes.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V removeSuccessor(N node);
 
   /**
@@ -73,5 +75,6 @@
    * the value previously associated with the edge connecting the two nodes.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V addSuccessor(N node, V value);
 }
diff --git a/android/guava/src/com/google/common/graph/GraphConstants.java b/android/guava/src/com/google/common/graph/GraphConstants.java
index 224c6d2..ae224fd 100644
--- a/android/guava/src/com/google/common/graph/GraphConstants.java
+++ b/android/guava/src/com/google/common/graph/GraphConstants.java
@@ -16,7 +16,9 @@
 
 package com.google.common.graph;
 
+
 /** A utility class to hold various constants used by the Guava Graph library. */
+@ElementTypesAreNonnullByDefault
 final class GraphConstants {
 
   private GraphConstants() {}
diff --git a/android/guava/src/com/google/common/graph/Graphs.java b/android/guava/src/com/google/common/graph/Graphs.java
index c278c71..bad8580 100644
--- a/android/guava/src/com/google/common/graph/Graphs.java
+++ b/android/guava/src/com/google/common/graph/Graphs.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.graph.GraphConstants.NODE_NOT_IN_GRAPH;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
@@ -32,7 +33,7 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods for {@link Graph}, {@link ValueGraph}, and {@link Network} instances.
@@ -42,6 +43,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class Graphs {
 
   private Graphs() {}
@@ -101,7 +103,7 @@
       Graph<N> graph,
       Map<Object, NodeVisitState> visitedNodes,
       N node,
-      @NullableDecl N previousNode) {
+      @CheckForNull N previousNode) {
     NodeVisitState state = visitedNodes.get(node);
     if (state == NodeVisitState.COMPLETE) {
       return false;
@@ -128,7 +130,7 @@
    * from B to A).
    */
   private static boolean canTraverseWithoutReusingEdge(
-      Graph<?> graph, Object nextNode, @NullableDecl Object previousNode) {
+      Graph<?> graph, Object nextNode, @CheckForNull Object previousNode) {
     if (graph.isDirected() || !Objects.equal(previousNode, nextNode)) {
       return true;
     }
@@ -265,7 +267,7 @@
     }
 
     @Override
-    protected Graph<N> delegate() {
+    Graph<N> delegate() {
       return graph;
     }
 
@@ -327,7 +329,7 @@
     }
 
     @Override
-    protected ValueGraph<N, V> delegate() {
+    ValueGraph<N, V> delegate() {
       return graph;
     }
 
@@ -362,14 +364,14 @@
     }
 
     @Override
-    @NullableDecl
-    public V edgeValueOrDefault(N nodeU, N nodeV, @NullableDecl V defaultValue) {
+    @CheckForNull
+    public V edgeValueOrDefault(N nodeU, N nodeV, @CheckForNull V defaultValue) {
       return delegate().edgeValueOrDefault(nodeV, nodeU, defaultValue); // transpose
     }
 
     @Override
-    @NullableDecl
-    public V edgeValueOrDefault(EndpointPair<N> endpoints, @NullableDecl V defaultValue) {
+    @CheckForNull
+    public V edgeValueOrDefault(EndpointPair<N> endpoints, @CheckForNull V defaultValue) {
       return delegate().edgeValueOrDefault(transpose(endpoints), defaultValue);
     }
   }
@@ -382,7 +384,7 @@
     }
 
     @Override
-    protected Network<N, E> delegate() {
+    Network<N, E> delegate() {
       return network;
     }
 
@@ -433,11 +435,13 @@
     }
 
     @Override
+    @CheckForNull
     public E edgeConnectingOrNull(N nodeU, N nodeV) {
       return delegate().edgeConnectingOrNull(nodeV, nodeU); // transpose
     }
 
     @Override
+    @CheckForNull
     public E edgeConnectingOrNull(EndpointPair<N> endpoints) {
       return delegate().edgeConnectingOrNull(transpose(endpoints));
     }
@@ -500,8 +504,11 @@
     for (N node : subgraph.nodes()) {
       for (N successorNode : graph.successors(node)) {
         if (subgraph.nodes().contains(successorNode)) {
+          // requireNonNull is safe because the endpoint pair comes from the graph.
           subgraph.putEdgeValue(
-              node, successorNode, graph.edgeValueOrDefault(node, successorNode, null));
+              node,
+              successorNode,
+              requireNonNull(graph.edgeValueOrDefault(node, successorNode, null)));
         }
       }
     }
@@ -556,8 +563,11 @@
       copy.addNode(node);
     }
     for (EndpointPair<N> edge : graph.edges()) {
+      // requireNonNull is safe because the endpoint pair comes from the graph.
       copy.putEdgeValue(
-          edge.nodeU(), edge.nodeV(), graph.edgeValueOrDefault(edge.nodeU(), edge.nodeV(), null));
+          edge.nodeU(),
+          edge.nodeV(),
+          requireNonNull(graph.edgeValueOrDefault(edge.nodeU(), edge.nodeV(), null)));
     }
     return copy;
   }
diff --git a/android/guava/src/com/google/common/graph/ImmutableGraph.java b/android/guava/src/com/google/common/graph/ImmutableGraph.java
index 4027ca8..afad211 100644
--- a/android/guava/src/com/google/common/graph/ImmutableGraph.java
+++ b/android/guava/src/com/google/common/graph/ImmutableGraph.java
@@ -45,6 +45,7 @@
  */
 @Beta
 @Immutable(containerOf = {"N"})
+@ElementTypesAreNonnullByDefault
 public class ImmutableGraph<N> extends ForwardingGraph<N> {
   @SuppressWarnings("Immutable") // The backing graph must be immutable.
   private final BaseGraph<N> backingGraph;
@@ -100,7 +101,7 @@
   }
 
   @Override
-  protected BaseGraph<N> delegate() {
+  BaseGraph<N> delegate() {
     return backingGraph;
   }
 
diff --git a/android/guava/src/com/google/common/graph/ImmutableNetwork.java b/android/guava/src/com/google/common/graph/ImmutableNetwork.java
index b35d722..cb636aa 100644
--- a/android/guava/src/com/google/common/graph/ImmutableNetwork.java
+++ b/android/guava/src/com/google/common/graph/ImmutableNetwork.java
@@ -46,6 +46,7 @@
 @Beta
 @Immutable(containerOf = {"N", "E"})
 @SuppressWarnings("Immutable") // Extends StandardNetwork but uses ImmutableMaps.
+@ElementTypesAreNonnullByDefault
 public final class ImmutableNetwork<N, E> extends StandardNetwork<N, E> {
 
   private ImmutableNetwork(Network<N, E> network) {
diff --git a/android/guava/src/com/google/common/graph/ImmutableValueGraph.java b/android/guava/src/com/google/common/graph/ImmutableValueGraph.java
index f2e2386..a1567da 100644
--- a/android/guava/src/com/google/common/graph/ImmutableValueGraph.java
+++ b/android/guava/src/com/google/common/graph/ImmutableValueGraph.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
@@ -43,6 +44,7 @@
 @Beta
 @Immutable(containerOf = {"N", "V"})
 @SuppressWarnings("Immutable") // Extends StandardValueGraph but uses ImmutableMaps.
+@ElementTypesAreNonnullByDefault
 public final class ImmutableValueGraph<N, V> extends StandardValueGraph<N, V> {
 
   private ImmutableValueGraph(ValueGraph<N, V> graph) {
@@ -94,7 +96,8 @@
         new Function<N, V>() {
           @Override
           public V apply(N successorNode) {
-            return graph.edgeValueOrDefault(node, successorNode, null);
+            // requireNonNull is safe because the endpoint pair comes from the graph.
+            return requireNonNull(graph.edgeValueOrDefault(node, successorNode, null));
           }
         };
     return graph.isDirected()
diff --git a/android/guava/src/com/google/common/graph/IncidentEdgeSet.java b/android/guava/src/com/google/common/graph/IncidentEdgeSet.java
index ba91c3b..ac94b65 100644
--- a/android/guava/src/com/google/common/graph/IncidentEdgeSet.java
+++ b/android/guava/src/com/google/common/graph/IncidentEdgeSet.java
@@ -18,15 +18,16 @@
 
 import java.util.AbstractSet;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Abstract base class for an incident edges set that allows different implementations of {@link
  * AbstractSet#iterator()}.
  */
+@ElementTypesAreNonnullByDefault
 abstract class IncidentEdgeSet<N> extends AbstractSet<EndpointPair<N>> {
-  protected final N node;
-  protected final BaseGraph<N> graph;
+  final N node;
+  final BaseGraph<N> graph;
 
   IncidentEdgeSet(BaseGraph<N> graph, N node) {
     this.graph = graph;
@@ -34,7 +35,7 @@
   }
 
   @Override
-  public boolean remove(Object o) {
+  public boolean remove(@CheckForNull Object o) {
     throw new UnsupportedOperationException();
   }
 
@@ -50,7 +51,7 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object obj) {
+  public boolean contains(@CheckForNull Object obj) {
     if (!(obj instanceof EndpointPair)) {
       return false;
     }
diff --git a/android/guava/src/com/google/common/graph/MapIteratorCache.java b/android/guava/src/com/google/common/graph/MapIteratorCache.java
index e53a7cd..aae9187 100644
--- a/android/guava/src/com/google/common/graph/MapIteratorCache.java
+++ b/android/guava/src/com/google/common/graph/MapIteratorCache.java
@@ -25,7 +25,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A map-like data structure that wraps a backing map and caches values while iterating through
@@ -41,6 +41,7 @@
  *
  * @author James Sexton
  */
+@ElementTypesAreNonnullByDefault
 class MapIteratorCache<K, V> {
   private final Map<K, V> backingMap;
 
@@ -53,43 +54,57 @@
    * while writing to it in another. All it does is help with _reading_ from multiple threads
    * concurrently. For more information, see AbstractNetworkTest.concurrentIteration.
    */
-  @NullableDecl private transient volatile Entry<K, V> cacheEntry;
+  @CheckForNull private transient volatile Entry<K, V> cacheEntry;
 
   MapIteratorCache(Map<K, V> backingMap) {
     this.backingMap = checkNotNull(backingMap);
   }
 
   @CanIgnoreReturnValue
-  public final V put(@NullableDecl K key, @NullableDecl V value) {
+  @CheckForNull
+  final V put(K key, V value) {
+    checkNotNull(key);
+    checkNotNull(value);
     clearCache();
     return backingMap.put(key, value);
   }
 
   @CanIgnoreReturnValue
-  public final V remove(@NullableDecl Object key) {
+  @CheckForNull
+  final V remove(Object key) {
+    checkNotNull(key);
     clearCache();
     return backingMap.remove(key);
   }
 
-  public final void clear() {
+  final void clear() {
     clearCache();
     backingMap.clear();
   }
 
-  public V get(@NullableDecl Object key) {
+  @CheckForNull
+  V get(Object key) {
+    checkNotNull(key);
     V value = getIfCached(key);
-    return (value != null) ? value : getWithoutCaching(key);
+    // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+    if (value == null) {
+      return getWithoutCaching(key);
+    } else {
+      return value;
+    }
   }
 
-  public final V getWithoutCaching(@NullableDecl Object key) {
+  @CheckForNull
+  final V getWithoutCaching(Object key) {
+    checkNotNull(key);
     return backingMap.get(key);
   }
 
-  public final boolean containsKey(@NullableDecl Object key) {
+  final boolean containsKey(@CheckForNull Object key) {
     return getIfCached(key) != null || backingMap.containsKey(key);
   }
 
-  public final Set<K> unmodifiableKeySet() {
+  final Set<K> unmodifiableKeySet() {
     return new AbstractSet<K>() {
       @Override
       public UnmodifiableIterator<K> iterator() {
@@ -116,15 +131,16 @@
       }
 
       @Override
-      public boolean contains(@NullableDecl Object key) {
+      public boolean contains(@CheckForNull Object key) {
         return containsKey(key);
       }
     };
   }
 
-  // Internal methods ('protected' is still package-visible, but treat as only subclass-visible)
+  // Internal methods (package-visible, but treat as only subclass-visible)
 
-  protected V getIfCached(@NullableDecl Object key) {
+  @CheckForNull
+  V getIfCached(@CheckForNull Object key) {
     Entry<K, V> entry = cacheEntry; // store local reference for thread-safety
 
     // Check cache. We use == on purpose because it's cheaper and a cache miss is ok.
@@ -134,7 +150,7 @@
     return null;
   }
 
-  protected void clearCache() {
+  void clearCache() {
     cacheEntry = null;
   }
 }
diff --git a/android/guava/src/com/google/common/graph/MapRetrievalCache.java b/android/guava/src/com/google/common/graph/MapRetrievalCache.java
index 01c45f7..ada78f2 100644
--- a/android/guava/src/com/google/common/graph/MapRetrievalCache.java
+++ b/android/guava/src/com/google/common/graph/MapRetrievalCache.java
@@ -16,8 +16,10 @@
 
 package com.google.common.graph;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import java.util.Map;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link MapIteratorCache} that adds additional caching. In addition to the caching provided by
@@ -25,10 +27,11 @@
  *
  * @author James Sexton
  */
-class MapRetrievalCache<K, V> extends MapIteratorCache<K, V> {
+@ElementTypesAreNonnullByDefault
+final class MapRetrievalCache<K, V> extends MapIteratorCache<K, V> {
   // See the note about volatile in the superclass.
-  @NullableDecl private transient volatile CacheEntry<K, V> cacheEntry1;
-  @NullableDecl private transient volatile CacheEntry<K, V> cacheEntry2;
+  @CheckForNull private transient volatile CacheEntry<K, V> cacheEntry1;
+  @CheckForNull private transient volatile CacheEntry<K, V> cacheEntry2;
 
   MapRetrievalCache(Map<K, V> backingMap) {
     super(backingMap);
@@ -36,7 +39,9 @@
 
   @SuppressWarnings("unchecked") // Safe because we only cast if key is found in map.
   @Override
-  public V get(@NullableDecl Object key) {
+  @CheckForNull
+  V get(Object key) {
+    checkNotNull(key);
     V value = getIfCached(key);
     if (value != null) {
       return value;
@@ -49,10 +54,11 @@
     return value;
   }
 
-  // Internal methods ('protected' is still package-visible, but treat as only subclass-visible)
+  // Internal methods (package-visible, but treat as only subclass-visible)
 
   @Override
-  protected V getIfCached(@NullableDecl Object key) {
+  @CheckForNull
+  V getIfCached(@CheckForNull Object key) {
     V value = super.getIfCached(key);
     if (value != null) {
       return value;
@@ -78,7 +84,7 @@
   }
 
   @Override
-  protected void clearCache() {
+  void clearCache() {
     super.clearCache();
     cacheEntry1 = null;
     cacheEntry2 = null;
diff --git a/android/guava/src/com/google/common/graph/MultiEdgesConnecting.java b/android/guava/src/com/google/common/graph/MultiEdgesConnecting.java
index 916c6dd..8a4250e 100644
--- a/android/guava/src/com/google/common/graph/MultiEdgesConnecting.java
+++ b/android/guava/src/com/google/common/graph/MultiEdgesConnecting.java
@@ -24,7 +24,7 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A class to represent the set of edges connecting an (implicit) origin node to a target node.
@@ -35,6 +35,7 @@
  * @author James Sexton
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 abstract class MultiEdgesConnecting<E> extends AbstractSet<E> {
 
   private final Map<E, ?> outEdgeToNode;
@@ -50,6 +51,7 @@
     final Iterator<? extends Entry<E, ?>> entries = outEdgeToNode.entrySet().iterator();
     return new AbstractIterator<E>() {
       @Override
+      @CheckForNull
       protected E computeNext() {
         while (entries.hasNext()) {
           Entry<E, ?> entry = entries.next();
@@ -63,7 +65,7 @@
   }
 
   @Override
-  public boolean contains(@NullableDecl Object edge) {
+  public boolean contains(@CheckForNull Object edge) {
     return targetNode.equals(outEdgeToNode.get(edge));
   }
 }
diff --git a/android/guava/src/com/google/common/graph/MutableGraph.java b/android/guava/src/com/google/common/graph/MutableGraph.java
index 8324079..b1f3359 100644
--- a/android/guava/src/com/google/common/graph/MutableGraph.java
+++ b/android/guava/src/com/google/common/graph/MutableGraph.java
@@ -29,6 +29,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public interface MutableGraph<N> extends Graph<N> {
 
   /**
diff --git a/android/guava/src/com/google/common/graph/MutableNetwork.java b/android/guava/src/com/google/common/graph/MutableNetwork.java
index d702903..64acb13 100644
--- a/android/guava/src/com/google/common/graph/MutableNetwork.java
+++ b/android/guava/src/com/google/common/graph/MutableNetwork.java
@@ -30,6 +30,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public interface MutableNetwork<N, E> extends Network<N, E> {
 
   /**
diff --git a/android/guava/src/com/google/common/graph/MutableValueGraph.java b/android/guava/src/com/google/common/graph/MutableValueGraph.java
index 70b286d..f32d2ee 100644
--- a/android/guava/src/com/google/common/graph/MutableValueGraph.java
+++ b/android/guava/src/com/google/common/graph/MutableValueGraph.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import javax.annotation.CheckForNull;
 
 /**
  * A subinterface of {@link ValueGraph} which adds mutation methods. When mutation is not required,
@@ -29,6 +30,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public interface MutableValueGraph<N, V> extends ValueGraph<N, V> {
 
   /**
@@ -59,6 +61,7 @@
    *     #allowsSelfLoops()}
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V putEdgeValue(N nodeU, N nodeV, V value);
 
   /**
@@ -83,6 +86,7 @@
    * @since 27.1
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V putEdgeValue(EndpointPair<N> endpoints, V value);
 
   /**
@@ -100,6 +104,7 @@
    *     nodeV}, or null if there was no such edge.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V removeEdge(N nodeU, N nodeV);
 
   /**
@@ -112,5 +117,6 @@
    * @since 27.1
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V removeEdge(EndpointPair<N> endpoints);
 }
diff --git a/android/guava/src/com/google/common/graph/Network.java b/android/guava/src/com/google/common/graph/Network.java
index a7c9086..70e39cd 100644
--- a/android/guava/src/com/google/common/graph/Network.java
+++ b/android/guava/src/com/google/common/graph/Network.java
@@ -19,7 +19,7 @@
 import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An interface for <a
@@ -103,6 +103,7 @@
  */
 @Beta
 @DoNotMock("Use NetworkBuilder to create a real instance")
+@ElementTypesAreNonnullByDefault
 public interface Network<N, E> extends SuccessorsFunction<N>, PredecessorsFunction<N> {
   //
   // Network-level accessors
@@ -318,7 +319,7 @@
    *     network
    * @since 23.0
    */
-  @NullableDecl
+  @CheckForNull
   E edgeConnectingOrNull(N nodeU, N nodeV);
 
   /**
@@ -333,7 +334,7 @@
    * @throws IllegalArgumentException if the endpoints are unordered and the graph is directed
    * @since 27.1
    */
-  @NullableDecl
+  @CheckForNull
   E edgeConnectingOrNull(EndpointPair<N> endpoints);
 
   /**
@@ -385,7 +386,7 @@
    * <p>A reference implementation of this is provided by {@link AbstractNetwork#equals(Object)}.
    */
   @Override
-  boolean equals(@NullableDecl Object object);
+  boolean equals(@CheckForNull Object object);
 
   /**
    * Returns the hash code for this network. The hash code of a network is defined as the hash code
diff --git a/android/guava/src/com/google/common/graph/NetworkBuilder.java b/android/guava/src/com/google/common/graph/NetworkBuilder.java
index d289ee2..9689444 100644
--- a/android/guava/src/com/google/common/graph/NetworkBuilder.java
+++ b/android/guava/src/com/google/common/graph/NetworkBuilder.java
@@ -67,6 +67,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class NetworkBuilder<N, E> extends AbstractGraphBuilder<N> {
   boolean allowsParallelEdges = false;
   ElementOrder<? super E> edgeOrder = ElementOrder.insertion();
diff --git a/android/guava/src/com/google/common/graph/NetworkConnections.java b/android/guava/src/com/google/common/graph/NetworkConnections.java
index 16a68d6..94d1780 100644
--- a/android/guava/src/com/google/common/graph/NetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/NetworkConnections.java
@@ -18,6 +18,7 @@
 
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 
 /**
  * An interface for representing and manipulating an origin node's adjacent nodes and incident edges
@@ -27,6 +28,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 interface NetworkConnections<N, E> {
 
   Set<N> adjacentNodes();
@@ -60,6 +62,7 @@
    * <p>In the undirected case, returns {@code null} if {@code isSelfLoop} is true.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   N removeInEdge(E edge, boolean isSelfLoop);
 
   /** Remove {@code edge} from the set of outgoing edges. Returns the former successor node. */
diff --git a/android/guava/src/com/google/common/graph/ParametricNullness.java b/android/guava/src/com/google/common/graph/ParametricNullness.java
new file mode 100644
index 0000000..62534eb
--- /dev/null
+++ b/android/guava/src/com/google/common/graph/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.graph;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/graph/PredecessorsFunction.java b/android/guava/src/com/google/common/graph/PredecessorsFunction.java
index f9ca48a..750a8ac 100644
--- a/android/guava/src/com/google/common/graph/PredecessorsFunction.java
+++ b/android/guava/src/com/google/common/graph/PredecessorsFunction.java
@@ -80,6 +80,7 @@
  */
 @Beta
 @DoNotMock("Implement with a lambda, or use GraphBuilder to build a Graph with the desired edges")
+@ElementTypesAreNonnullByDefault
 public interface PredecessorsFunction<N> {
 
   /**
diff --git a/android/guava/src/com/google/common/graph/StandardMutableGraph.java b/android/guava/src/com/google/common/graph/StandardMutableGraph.java
index 41acccf..1be9640 100644
--- a/android/guava/src/com/google/common/graph/StandardMutableGraph.java
+++ b/android/guava/src/com/google/common/graph/StandardMutableGraph.java
@@ -28,6 +28,7 @@
  * @author James Sexton
  * @param <N> Node parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class StandardMutableGraph<N> extends ForwardingGraph<N> implements MutableGraph<N> {
   private final MutableValueGraph<N, Presence> backingValueGraph;
 
@@ -37,7 +38,7 @@
   }
 
   @Override
-  protected BaseGraph<N> delegate() {
+  BaseGraph<N> delegate() {
     return backingValueGraph;
   }
 
diff --git a/android/guava/src/com/google/common/graph/StandardMutableNetwork.java b/android/guava/src/com/google/common/graph/StandardMutableNetwork.java
index 8cfe9c5..c58b6d3 100644
--- a/android/guava/src/com/google/common/graph/StandardMutableNetwork.java
+++ b/android/guava/src/com/google/common/graph/StandardMutableNetwork.java
@@ -22,6 +22,7 @@
 import static com.google.common.graph.GraphConstants.PARALLEL_EDGES_NOT_ALLOWED;
 import static com.google.common.graph.GraphConstants.REUSING_EDGE;
 import static com.google.common.graph.GraphConstants.SELF_LOOPS_NOT_ALLOWED;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableList;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -39,6 +40,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class StandardMutableNetwork<N, E> extends StandardNetwork<N, E>
     implements MutableNetwork<N, E> {
 
@@ -152,9 +154,10 @@
       return false;
     }
 
-    NetworkConnections<N, E> connectionsU = nodeConnections.get(nodeU);
+    // requireNonNull is safe because of the edgeToReferenceNode check above.
+    NetworkConnections<N, E> connectionsU = requireNonNull(nodeConnections.get(nodeU));
     N nodeV = connectionsU.adjacentNode(edge);
-    NetworkConnections<N, E> connectionsV = nodeConnections.get(nodeV);
+    NetworkConnections<N, E> connectionsV = requireNonNull(nodeConnections.get(nodeV));
     connectionsU.removeOutEdge(edge);
     connectionsV.removeInEdge(edge, allowsSelfLoops() && nodeU.equals(nodeV));
     edgeToReferenceNode.remove(edge);
diff --git a/android/guava/src/com/google/common/graph/StandardMutableValueGraph.java b/android/guava/src/com/google/common/graph/StandardMutableValueGraph.java
index 558d8d6..0ea641a 100644
--- a/android/guava/src/com/google/common/graph/StandardMutableValueGraph.java
+++ b/android/guava/src/com/google/common/graph/StandardMutableValueGraph.java
@@ -22,8 +22,10 @@
 import static com.google.common.graph.GraphConstants.SELF_LOOPS_NOT_ALLOWED;
 import static com.google.common.graph.Graphs.checkNonNegative;
 import static com.google.common.graph.Graphs.checkPositive;
+import static java.util.Objects.requireNonNull;
 
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import javax.annotation.CheckForNull;
 
 /**
  * Standard implementation of {@link MutableValueGraph} that supports both directed and undirected
@@ -38,6 +40,7 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class StandardMutableValueGraph<N, V> extends StandardValueGraph<N, V>
     implements MutableValueGraph<N, V> {
 
@@ -81,6 +84,7 @@
 
   @Override
   @CanIgnoreReturnValue
+  @CheckForNull
   public V putEdgeValue(N nodeU, N nodeV, V value) {
     checkNotNull(nodeU, "nodeU");
     checkNotNull(nodeV, "nodeV");
@@ -108,6 +112,7 @@
 
   @Override
   @CanIgnoreReturnValue
+  @CheckForNull
   public V putEdgeValue(EndpointPair<N> endpoints, V value) {
     validateEndpoints(endpoints);
     return putEdgeValue(endpoints.nodeU(), endpoints.nodeV(), value);
@@ -132,12 +137,16 @@
     }
 
     for (N successor : connections.successors()) {
-      nodeConnections.getWithoutCaching(successor).removePredecessor(node);
+      // requireNonNull is safe because the node is a successor.
+      requireNonNull(nodeConnections.getWithoutCaching(successor)).removePredecessor(node);
       --edgeCount;
     }
     if (isDirected()) { // In undirected graphs, the successor and predecessor sets are equal.
       for (N predecessor : connections.predecessors()) {
-        checkState(nodeConnections.getWithoutCaching(predecessor).removeSuccessor(node) != null);
+        // requireNonNull is safe because the node is a predecessor.
+        checkState(
+            requireNonNull(nodeConnections.getWithoutCaching(predecessor)).removeSuccessor(node)
+                != null);
         --edgeCount;
       }
     }
@@ -148,6 +157,7 @@
 
   @Override
   @CanIgnoreReturnValue
+  @CheckForNull
   public V removeEdge(N nodeU, N nodeV) {
     checkNotNull(nodeU, "nodeU");
     checkNotNull(nodeV, "nodeV");
@@ -168,6 +178,7 @@
 
   @Override
   @CanIgnoreReturnValue
+  @CheckForNull
   public V removeEdge(EndpointPair<N> endpoints) {
     validateEndpoints(endpoints);
     return removeEdge(endpoints.nodeU(), endpoints.nodeV());
diff --git a/android/guava/src/com/google/common/graph/StandardNetwork.java b/android/guava/src/com/google/common/graph/StandardNetwork.java
index 0fc292b..2aa103f 100644
--- a/android/guava/src/com/google/common/graph/StandardNetwork.java
+++ b/android/guava/src/com/google/common/graph/StandardNetwork.java
@@ -22,12 +22,12 @@
 import static com.google.common.graph.GraphConstants.DEFAULT_NODE_COUNT;
 import static com.google.common.graph.GraphConstants.EDGE_NOT_IN_GRAPH;
 import static com.google.common.graph.GraphConstants.NODE_NOT_IN_GRAPH;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Standard implementation of {@link Network} that supports the options supplied by {@link
@@ -48,6 +48,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 class StandardNetwork<N, E> extends AbstractNetwork<N, E> {
   private final boolean isDirected;
   private final boolean allowsParallelEdges;
@@ -55,11 +56,11 @@
   private final ElementOrder<N> nodeOrder;
   private final ElementOrder<E> edgeOrder;
 
-  protected final MapIteratorCache<N, NetworkConnections<N, E>> nodeConnections;
+  final MapIteratorCache<N, NetworkConnections<N, E>> nodeConnections;
 
   // We could make this a Map<E, EndpointPair<N>>. It would make incidentNodes(edge) slightly
   // faster, but also make Networks consume 5 to 20+% (increasing with average degree) more memory.
-  protected final MapIteratorCache<E, N> edgeToReferenceNode; // referenceNode == source if directed
+  final MapIteratorCache<E, N> edgeToReferenceNode; // referenceNode == source if directed
 
   /** Constructs a graph with the properties specified in {@code builder}. */
   StandardNetwork(NetworkBuilder<? super N, ? super E> builder) {
@@ -135,7 +136,8 @@
   @Override
   public EndpointPair<N> incidentNodes(E edge) {
     N nodeU = checkedReferenceNode(edge);
-    N nodeV = nodeConnections.get(nodeU).adjacentNode(edge);
+    // requireNonNull is safe because checkedReferenceNode made sure the edge is in the network.
+    N nodeV = requireNonNull(nodeConnections.get(nodeU)).adjacentNode(edge);
     return EndpointPair.of(this, nodeU, nodeV);
   }
 
@@ -174,7 +176,7 @@
     return checkedConnections(node).successors();
   }
 
-  protected final NetworkConnections<N, E> checkedConnections(N node) {
+  final NetworkConnections<N, E> checkedConnections(N node) {
     NetworkConnections<N, E> connections = nodeConnections.get(node);
     if (connections == null) {
       checkNotNull(node);
@@ -183,7 +185,7 @@
     return connections;
   }
 
-  protected final N checkedReferenceNode(E edge) {
+  final N checkedReferenceNode(E edge) {
     N referenceNode = edgeToReferenceNode.get(edge);
     if (referenceNode == null) {
       checkNotNull(edge);
@@ -192,11 +194,11 @@
     return referenceNode;
   }
 
-  protected final boolean containsNode(@NullableDecl N node) {
+  final boolean containsNode(N node) {
     return nodeConnections.containsKey(node);
   }
 
-  protected final boolean containsEdge(@NullableDecl E edge) {
+  final boolean containsEdge(E edge) {
     return edgeToReferenceNode.containsKey(edge);
   }
 }
diff --git a/android/guava/src/com/google/common/graph/StandardValueGraph.java b/android/guava/src/com/google/common/graph/StandardValueGraph.java
index 4eed0be..f2c71bc 100644
--- a/android/guava/src/com/google/common/graph/StandardValueGraph.java
+++ b/android/guava/src/com/google/common/graph/StandardValueGraph.java
@@ -24,7 +24,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Standard implementation of {@link ValueGraph} that supports the options supplied by {@link
@@ -43,14 +43,15 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
+@ElementTypesAreNonnullByDefault
 class StandardValueGraph<N, V> extends AbstractValueGraph<N, V> {
   private final boolean isDirected;
   private final boolean allowsSelfLoops;
   private final ElementOrder<N> nodeOrder;
 
-  protected final MapIteratorCache<N, GraphConnections<N, V>> nodeConnections;
+  final MapIteratorCache<N, GraphConnections<N, V>> nodeConnections;
 
-  protected long edgeCount; // must be updated when edges are added or removed
+  long edgeCount; // must be updated when edges are added or removed
 
   /** Constructs a graph with the properties specified in {@code builder}. */
   StandardValueGraph(AbstractGraphBuilder<? super N> builder) {
@@ -129,27 +130,27 @@
 
   @Override
   public boolean hasEdgeConnecting(N nodeU, N nodeV) {
-    return hasEdgeConnecting_internal(checkNotNull(nodeU), checkNotNull(nodeV));
+    return hasEdgeConnectingInternal(checkNotNull(nodeU), checkNotNull(nodeV));
   }
 
   @Override
   public boolean hasEdgeConnecting(EndpointPair<N> endpoints) {
     checkNotNull(endpoints);
     return isOrderingCompatible(endpoints)
-        && hasEdgeConnecting_internal(endpoints.nodeU(), endpoints.nodeV());
+        && hasEdgeConnectingInternal(endpoints.nodeU(), endpoints.nodeV());
   }
 
   @Override
-  @NullableDecl
-  public V edgeValueOrDefault(N nodeU, N nodeV, @NullableDecl V defaultValue) {
-    return edgeValueOrDefault_internal(checkNotNull(nodeU), checkNotNull(nodeV), defaultValue);
+  @CheckForNull
+  public V edgeValueOrDefault(N nodeU, N nodeV, @CheckForNull V defaultValue) {
+    return edgeValueOrDefaultInternal(checkNotNull(nodeU), checkNotNull(nodeV), defaultValue);
   }
 
   @Override
-  @NullableDecl
-  public V edgeValueOrDefault(EndpointPair<N> endpoints, @NullableDecl V defaultValue) {
+  @CheckForNull
+  public V edgeValueOrDefault(EndpointPair<N> endpoints, @CheckForNull V defaultValue) {
     validateEndpoints(endpoints);
-    return edgeValueOrDefault_internal(endpoints.nodeU(), endpoints.nodeV(), defaultValue);
+    return edgeValueOrDefaultInternal(endpoints.nodeU(), endpoints.nodeV(), defaultValue);
   }
 
   @Override
@@ -157,7 +158,7 @@
     return edgeCount;
   }
 
-  protected final GraphConnections<N, V> checkedConnections(N node) {
+  private final GraphConnections<N, V> checkedConnections(N node) {
     GraphConnections<N, V> connections = nodeConnections.get(node);
     if (connections == null) {
       checkNotNull(node);
@@ -166,18 +167,24 @@
     return connections;
   }
 
-  protected final boolean containsNode(@NullableDecl N node) {
+  final boolean containsNode(@CheckForNull N node) {
     return nodeConnections.containsKey(node);
   }
 
-  protected final boolean hasEdgeConnecting_internal(N nodeU, N nodeV) {
+  private final boolean hasEdgeConnectingInternal(N nodeU, N nodeV) {
     GraphConnections<N, V> connectionsU = nodeConnections.get(nodeU);
     return (connectionsU != null) && connectionsU.successors().contains(nodeV);
   }
 
-  protected final V edgeValueOrDefault_internal(N nodeU, N nodeV, V defaultValue) {
+  @CheckForNull
+  private final V edgeValueOrDefaultInternal(N nodeU, N nodeV, @CheckForNull V defaultValue) {
     GraphConnections<N, V> connectionsU = nodeConnections.get(nodeU);
     V value = (connectionsU == null) ? null : connectionsU.value(nodeV);
-    return value == null ? defaultValue : value;
+    // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+    if (value == null) {
+      return defaultValue;
+    } else {
+      return value;
+    }
   }
 }
diff --git a/android/guava/src/com/google/common/graph/SuccessorsFunction.java b/android/guava/src/com/google/common/graph/SuccessorsFunction.java
index f74f437..c29bb4b 100644
--- a/android/guava/src/com/google/common/graph/SuccessorsFunction.java
+++ b/android/guava/src/com/google/common/graph/SuccessorsFunction.java
@@ -80,6 +80,7 @@
  */
 @Beta
 @DoNotMock("Implement with a lambda, or use GraphBuilder to build a Graph with the desired edges")
+@ElementTypesAreNonnullByDefault
 public interface SuccessorsFunction<N> {
 
   /**
diff --git a/android/guava/src/com/google/common/graph/Traverser.java b/android/guava/src/com/google/common/graph/Traverser.java
index 0d8e6f9..5a36f9f 100644
--- a/android/guava/src/com/google/common/graph/Traverser.java
+++ b/android/guava/src/com/google/common/graph/Traverser.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.collect.AbstractIterator;
@@ -28,7 +29,7 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An object that can traverse the nodes that are reachable from a specified (set of) start node(s)
@@ -63,6 +64,7 @@
 @DoNotMock(
     "Call forGraph or forTree, passing a lambda or a Graph with the desired edges (built with"
         + " GraphBuilder)")
+@ElementTypesAreNonnullByDefault
 public abstract class Traverser<N> {
   private final SuccessorsFunction<N> successorFunction;
 
@@ -383,10 +385,20 @@
       final Set<N> visited = new HashSet<>();
       return new Traversal<N>(graph) {
         @Override
+        @CheckForNull
         N visitNext(Deque<Iterator<? extends N>> horizon) {
           Iterator<? extends N> top = horizon.getFirst();
           while (top.hasNext()) {
-            N element = checkNotNull(top.next());
+            N element = top.next();
+            // requireNonNull is safe because horizon contains only graph nodes.
+            /*
+             * TODO(cpovirk): Replace these two statements with one (`N element =
+             * requireNonNull(top.next())`) once our checker supports it.
+             *
+             * (The problem is likely
+             * https://github.com/jspecify/nullness-checker-for-checker-framework/blob/61aafa4ae52594830cfc2d61c8b113009dbdb045/src/main/java/com/google/jspecify/nullness/NullSpecAnnotatedTypeFactory.java#L896)
+             */
+            requireNonNull(element);
             if (visited.add(element)) {
               return element;
             }
@@ -399,6 +411,7 @@
 
     static <N> Traversal<N> inTree(SuccessorsFunction<N> tree) {
       return new Traversal<N>(tree) {
+        @CheckForNull
         @Override
         N visitNext(Deque<Iterator<? extends N>> horizon) {
           Iterator<? extends N> top = horizon.getFirst();
@@ -430,6 +443,7 @@
       horizon.add(startNodes);
       return new AbstractIterator<N>() {
         @Override
+        @CheckForNull
         protected N computeNext() {
           do {
             N next = visitNext(horizon);
@@ -454,6 +468,7 @@
       horizon.add(startNodes);
       return new AbstractIterator<N>() {
         @Override
+        @CheckForNull
         protected N computeNext() {
           for (N next = visitNext(horizon); next != null; next = visitNext(horizon)) {
             Iterator<? extends N> successors = successorFunction.successors(next).iterator();
@@ -463,7 +478,11 @@
             horizon.addFirst(successors);
             ancestorStack.push(next);
           }
-          return ancestorStack.isEmpty() ? endOfData() : ancestorStack.pop();
+          // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+          if (!ancestorStack.isEmpty()) {
+            return ancestorStack.pop();
+          }
+          return endOfData();
         }
       };
     }
@@ -478,7 +497,7 @@
      * into {@code horizon} between calls to {@code visitNext()}. This causes them to receive
      * additional values interleaved with those shown above.)
      */
-    @NullableDecl
+    @CheckForNull
     abstract N visitNext(Deque<Iterator<? extends N>> horizon);
   }
 
diff --git a/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java b/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java
index 49689f9..085e3a7 100644
--- a/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java
+++ b/android/guava/src/com/google/common/graph/UndirectedGraphConnections.java
@@ -29,6 +29,7 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link GraphConnections} for undirected graphs.
@@ -37,6 +38,7 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class UndirectedGraphConnections<N, V> implements GraphConnections<N, V> {
   private final Map<N, V> adjacentNodeValues;
 
@@ -89,6 +91,7 @@
   }
 
   @Override
+  @CheckForNull
   public V value(N node) {
     return adjacentNodeValues.get(node);
   }
@@ -100,6 +103,7 @@
   }
 
   @Override
+  @CheckForNull
   public V removeSuccessor(N node) {
     return adjacentNodeValues.remove(node);
   }
@@ -111,6 +115,7 @@
   }
 
   @Override
+  @CheckForNull
   public V addSuccessor(N node, V value) {
     return adjacentNodeValues.put(node, value);
   }
diff --git a/android/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java b/android/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
index a391379..a5c45ca 100644
--- a/android/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
@@ -30,7 +30,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link NetworkConnections} for undirected networks with parallel edges.
@@ -39,6 +39,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class UndirectedMultiNetworkConnections<N, E>
     extends AbstractUndirectedNetworkConnections<N, E> {
 
@@ -55,7 +56,7 @@
     return new UndirectedMultiNetworkConnections<>(ImmutableMap.copyOf(incidentEdges));
   }
 
-  @LazyInit private transient Reference<Multiset<N>> adjacentNodesReference;
+  @CheckForNull @LazyInit private transient Reference<Multiset<N>> adjacentNodesReference;
 
   @Override
   public Set<N> adjacentNodes() {
@@ -82,6 +83,7 @@
   }
 
   @Override
+  @CheckForNull
   public N removeInEdge(E edge, boolean isSelfLoop) {
     if (!isSelfLoop) {
       return removeOutEdge(edge);
@@ -115,8 +117,8 @@
     }
   }
 
-  @NullableDecl
-  private static <T> T getReference(@NullableDecl Reference<T> reference) {
+  @CheckForNull
+  private static <T> T getReference(@CheckForNull Reference<T> reference) {
     return (reference == null) ? null : reference.get();
   }
 }
diff --git a/android/guava/src/com/google/common/graph/UndirectedNetworkConnections.java b/android/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
index 1e253dd..38cb763 100644
--- a/android/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
+++ b/android/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
@@ -32,9 +32,10 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class UndirectedNetworkConnections<N, E> extends AbstractUndirectedNetworkConnections<N, E> {
 
-  protected UndirectedNetworkConnections(Map<E, N> incidentEdgeMap) {
+  UndirectedNetworkConnections(Map<E, N> incidentEdgeMap) {
     super(incidentEdgeMap);
   }
 
diff --git a/android/guava/src/com/google/common/graph/ValueGraph.java b/android/guava/src/com/google/common/graph/ValueGraph.java
index b7dd61c..bd3cf36 100644
--- a/android/guava/src/com/google/common/graph/ValueGraph.java
+++ b/android/guava/src/com/google/common/graph/ValueGraph.java
@@ -19,7 +19,7 @@
 import com.google.common.annotations.Beta;
 import java.util.Collection;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An interface for <a
@@ -107,6 +107,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public interface ValueGraph<N, V> extends BaseGraph<N> {
   //
   // ValueGraph-level accessors
@@ -285,8 +286,8 @@
    * @throws IllegalArgumentException if {@code nodeU} or {@code nodeV} is not an element of this
    *     graph
    */
-  @NullableDecl
-  V edgeValueOrDefault(N nodeU, N nodeV, @NullableDecl V defaultValue);
+  @CheckForNull
+  V edgeValueOrDefault(N nodeU, N nodeV, @CheckForNull V defaultValue);
 
   /**
    * Returns the value of the edge that connects {@code endpoints} (in the order, if any, specified
@@ -298,8 +299,8 @@
    * @throws IllegalArgumentException if the endpoints are unordered and the graph is directed
    * @since 27.1
    */
-  @NullableDecl
-  V edgeValueOrDefault(EndpointPair<N> endpoints, @NullableDecl V defaultValue);
+  @CheckForNull
+  V edgeValueOrDefault(EndpointPair<N> endpoints, @CheckForNull V defaultValue);
 
   //
   // ValueGraph identity
@@ -326,7 +327,7 @@
    * <p>A reference implementation of this is provided by {@link AbstractValueGraph#equals(Object)}.
    */
   @Override
-  boolean equals(@NullableDecl Object object);
+  boolean equals(@CheckForNull Object object);
 
   /**
    * Returns the hash code for this graph. The hash code of a graph is defined as the hash code of a
diff --git a/android/guava/src/com/google/common/graph/ValueGraphBuilder.java b/android/guava/src/com/google/common/graph/ValueGraphBuilder.java
index 4fc752d..ce146c3 100644
--- a/android/guava/src/com/google/common/graph/ValueGraphBuilder.java
+++ b/android/guava/src/com/google/common/graph/ValueGraphBuilder.java
@@ -66,6 +66,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class ValueGraphBuilder<N, V> extends AbstractGraphBuilder<N> {
 
   /** Creates a new instance with the specified edge directionality. */
diff --git a/android/guava/src/com/google/common/hash/AbstractByteHasher.java b/android/guava/src/com/google/common/hash/AbstractByteHasher.java
index 48d48c4..9f7e041 100644
--- a/android/guava/src/com/google/common/hash/AbstractByteHasher.java
+++ b/android/guava/src/com/google/common/hash/AbstractByteHasher.java
@@ -32,6 +32,7 @@
  * @author Colin Decker
  */
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 abstract class AbstractByteHasher extends AbstractHasher {
   private final ByteBuffer scratch = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);
 
diff --git a/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java b/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
index 048e6c2..4b69bb7 100644
--- a/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
+++ b/android/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
@@ -20,6 +20,7 @@
 import com.google.errorprone.annotations.Immutable;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An abstract composition of multiple hash functions. {@linkplain #newHasher()} delegates to the
@@ -29,6 +30,7 @@
  * @author Dimitris Andreou
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 abstract class AbstractCompositeHashFunction extends AbstractHashFunction {
 
   @SuppressWarnings("Immutable") // array not modified after creation
@@ -177,7 +179,8 @@
       }
 
       @Override
-      public <T> Hasher putObject(T instance, Funnel<? super T> funnel) {
+      public <T extends @Nullable Object> Hasher putObject(
+          @ParametricNullness T instance, Funnel<? super T> funnel) {
         for (Hasher hasher : hashers) {
           hasher.putObject(instance, funnel);
         }
diff --git a/android/guava/src/com/google/common/hash/AbstractHashFunction.java b/android/guava/src/com/google/common/hash/AbstractHashFunction.java
index 6184189..7308556 100644
--- a/android/guava/src/com/google/common/hash/AbstractHashFunction.java
+++ b/android/guava/src/com/google/common/hash/AbstractHashFunction.java
@@ -20,6 +20,7 @@
 import com.google.errorprone.annotations.Immutable;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Skeleton implementation of {@link HashFunction} in terms of {@link #newHasher()}.
@@ -27,9 +28,11 @@
  * <p>TODO(lowasser): make public
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 abstract class AbstractHashFunction implements HashFunction {
   @Override
-  public <T> HashCode hashObject(T instance, Funnel<? super T> funnel) {
+  public <T extends @Nullable Object> HashCode hashObject(
+      @ParametricNullness T instance, Funnel<? super T> funnel) {
     return newHasher().putObject(instance, funnel).hash();
   }
 
diff --git a/android/guava/src/com/google/common/hash/AbstractHasher.java b/android/guava/src/com/google/common/hash/AbstractHasher.java
index 326aa8d..c72e05b 100644
--- a/android/guava/src/com/google/common/hash/AbstractHasher.java
+++ b/android/guava/src/com/google/common/hash/AbstractHasher.java
@@ -18,6 +18,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An abstract implementation of {@link Hasher}, which only requires subtypes to implement {@link
@@ -26,6 +27,7 @@
  * @author Dimitris Andreou
  */
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 abstract class AbstractHasher implements Hasher {
   @Override
   public final Hasher putBoolean(boolean b) {
@@ -114,7 +116,8 @@
   }
 
   @Override
-  public <T> Hasher putObject(T instance, Funnel<? super T> funnel) {
+  public <T extends @Nullable Object> Hasher putObject(
+      @ParametricNullness T instance, Funnel<? super T> funnel) {
     funnel.funnel(instance, this);
     return this;
   }
diff --git a/android/guava/src/com/google/common/hash/AbstractNonStreamingHashFunction.java b/android/guava/src/com/google/common/hash/AbstractNonStreamingHashFunction.java
index 54c76de..4969e35 100644
--- a/android/guava/src/com/google/common/hash/AbstractNonStreamingHashFunction.java
+++ b/android/guava/src/com/google/common/hash/AbstractNonStreamingHashFunction.java
@@ -30,6 +30,7 @@
  * @author Dimitris Andreou
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 abstract class AbstractNonStreamingHashFunction extends AbstractHashFunction {
   @Override
   public Hasher newHasher() {
diff --git a/android/guava/src/com/google/common/hash/AbstractStreamingHasher.java b/android/guava/src/com/google/common/hash/AbstractStreamingHasher.java
index 67de74b..a987b48 100644
--- a/android/guava/src/com/google/common/hash/AbstractStreamingHasher.java
+++ b/android/guava/src/com/google/common/hash/AbstractStreamingHasher.java
@@ -29,6 +29,7 @@
  */
 // TODO(kevinb): this class still needs some design-and-document-for-inheritance love
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 abstract class AbstractStreamingHasher extends AbstractHasher {
   /** Buffer via which we pass data to the hash algorithm (the implementor) */
   private final ByteBuffer buffer;
diff --git a/android/guava/src/com/google/common/hash/BloomFilter.java b/android/guava/src/com/google/common/hash/BloomFilter.java
index 27187f7..6ffe583 100644
--- a/android/guava/src/com/google/common/hash/BloomFilter.java
+++ b/android/guava/src/com/google/common/hash/BloomFilter.java
@@ -33,7 +33,8 @@
 import java.io.OutputStream;
 import java.io.Serializable;
 import java.math.RoundingMode;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A Bloom filter for instances of {@code T}. A Bloom filter offers an approximate containment test
@@ -41,7 +42,7 @@
  * but if it claims that an element is <i>not</i> contained in it, then this is definitely true.
  *
  * <p>If you are unfamiliar with Bloom filters, this nice <a
- * href="http://llimllib.github.com/bloomfilter-tutorial/">tutorial</a> may help you understand how
+ * href="http://llimllib.github.io/bloomfilter-tutorial/">tutorial</a> may help you understand how
  * they work.
  *
  * <p>The false positive probability ({@code FPP}) of a Bloom filter is defined as the probability
@@ -63,7 +64,8 @@
  * @since 11.0 (thread-safe since 23.0)
  */
 @Beta
-public final class BloomFilter<T> implements Predicate<T>, Serializable {
+@ElementTypesAreNonnullByDefault
+public final class BloomFilter<T extends @Nullable Object> implements Predicate<T>, Serializable {
   /**
    * A strategy to translate T instances, to {@code numHashFunctions} bit indexes.
    *
@@ -76,15 +78,21 @@
      *
      * <p>Returns whether any bits changed as a result of this operation.
      */
-    <T> boolean put(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits);
+    <T extends @Nullable Object> boolean put(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits);
 
     /**
      * Queries {@code numHashFunctions} bits of the given bit array, by hashing a user element;
      * returns {@code true} if and only if all selected bits are set.
      */
-    <T> boolean mightContain(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits);
+    <T extends @Nullable Object> boolean mightContain(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits);
 
     /**
      * Identifier used to encode this strategy, when marshalled as part of a BloomFilter. Only
@@ -134,7 +142,7 @@
    * Returns {@code true} if the element <i>might</i> have been put in this Bloom filter, {@code
    * false} if this is <i>definitely</i> not the case.
    */
-  public boolean mightContain(T object) {
+  public boolean mightContain(@ParametricNullness T object) {
     return strategy.mightContain(object, funnel, numHashFunctions, bits);
   }
 
@@ -144,7 +152,7 @@
    */
   @Deprecated
   @Override
-  public boolean apply(T input) {
+  public boolean apply(@ParametricNullness T input) {
     return mightContain(input);
   }
 
@@ -160,7 +168,7 @@
    * @since 12.0 (present in 11.0 with {@code void} return type})
    */
   @CanIgnoreReturnValue
-  public boolean put(T object) {
+  public boolean put(@ParametricNullness T object) {
     return strategy.put(object, funnel, numHashFunctions, bits);
   }
 
@@ -267,7 +275,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
@@ -306,7 +314,7 @@
    * @param fpp the desired false positive probability (must be positive and less than 1.0)
    * @return a {@code BloomFilter}
    */
-  public static <T> BloomFilter<T> create(
+  public static <T extends @Nullable Object> BloomFilter<T> create(
       Funnel<? super T> funnel, int expectedInsertions, double fpp) {
     return create(funnel, (long) expectedInsertions, fpp);
   }
@@ -332,13 +340,13 @@
    * @return a {@code BloomFilter}
    * @since 19.0
    */
-  public static <T> BloomFilter<T> create(
+  public static <T extends @Nullable Object> BloomFilter<T> create(
       Funnel<? super T> funnel, long expectedInsertions, double fpp) {
     return create(funnel, expectedInsertions, fpp, BloomFilterStrategies.MURMUR128_MITZ_64);
   }
 
   @VisibleForTesting
-  static <T> BloomFilter<T> create(
+  static <T extends @Nullable Object> BloomFilter<T> create(
       Funnel<? super T> funnel, long expectedInsertions, double fpp, Strategy strategy) {
     checkNotNull(funnel);
     checkArgument(
@@ -383,7 +391,8 @@
    *     BloomFilter}; must be positive
    * @return a {@code BloomFilter}
    */
-  public static <T> BloomFilter<T> create(Funnel<? super T> funnel, int expectedInsertions) {
+  public static <T extends @Nullable Object> BloomFilter<T> create(
+      Funnel<? super T> funnel, int expectedInsertions) {
     return create(funnel, (long) expectedInsertions);
   }
 
@@ -407,7 +416,8 @@
    * @return a {@code BloomFilter}
    * @since 19.0
    */
-  public static <T> BloomFilter<T> create(Funnel<? super T> funnel, long expectedInsertions) {
+  public static <T extends @Nullable Object> BloomFilter<T> create(
+      Funnel<? super T> funnel, long expectedInsertions) {
     return create(funnel, expectedInsertions, 0.03); // FYI, for 3%, we always get 5 hash functions
   }
 
@@ -460,7 +470,7 @@
     return new SerialForm<T>(this);
   }
 
-  private static class SerialForm<T> implements Serializable {
+  private static class SerialForm<T extends @Nullable Object> implements Serializable {
     final long[] data;
     final int numHashFunctions;
     final Funnel<? super T> funnel;
@@ -513,8 +523,8 @@
    * @throws IOException if the InputStream throws an {@code IOException}, or if its data does not
    *     appear to be a BloomFilter serialized using the {@linkplain #writeTo(OutputStream)} method.
    */
-  public static <T> BloomFilter<T> readFrom(InputStream in, Funnel<? super T> funnel)
-      throws IOException {
+  public static <T extends @Nullable Object> BloomFilter<T> readFrom(
+      InputStream in, Funnel<? super T> funnel) throws IOException {
     checkNotNull(in, "InputStream");
     checkNotNull(funnel, "Funnel");
     int strategyOrdinal = -1;
diff --git a/android/guava/src/com/google/common/hash/BloomFilterStrategies.java b/android/guava/src/com/google/common/hash/BloomFilterStrategies.java
index ade2940..3a012f3 100644
--- a/android/guava/src/com/google/common/hash/BloomFilterStrategies.java
+++ b/android/guava/src/com/google/common/hash/BloomFilterStrategies.java
@@ -22,7 +22,8 @@
 import java.math.RoundingMode;
 import java.util.Arrays;
 import java.util.concurrent.atomic.AtomicLongArray;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Collections of strategies of generating the k * log(M) bits required for an element to be mapped
@@ -36,6 +37,7 @@
  * @author Dimitris Andreou
  * @author Kurt Alfred Kluever
  */
+@ElementTypesAreNonnullByDefault
 enum BloomFilterStrategies implements BloomFilter.Strategy {
   /**
    * See "Less Hashing, Same Performance: Building a Better Bloom Filter" by Adam Kirsch and Michael
@@ -44,8 +46,11 @@
    */
   MURMUR128_MITZ_32() {
     @Override
-    public <T> boolean put(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits) {
+    public <T extends @Nullable Object> boolean put(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits) {
       long bitSize = bits.bitSize();
       long hash64 = Hashing.murmur3_128().hashObject(object, funnel).asLong();
       int hash1 = (int) hash64;
@@ -64,8 +69,11 @@
     }
 
     @Override
-    public <T> boolean mightContain(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits) {
+    public <T extends @Nullable Object> boolean mightContain(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits) {
       long bitSize = bits.bitSize();
       long hash64 = Hashing.murmur3_128().hashObject(object, funnel).asLong();
       int hash1 = (int) hash64;
@@ -92,8 +100,11 @@
    */
   MURMUR128_MITZ_64() {
     @Override
-    public <T> boolean put(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits) {
+    public <T extends @Nullable Object> boolean put(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits) {
       long bitSize = bits.bitSize();
       byte[] bytes = Hashing.murmur3_128().hashObject(object, funnel).getBytesInternal();
       long hash1 = lowerEight(bytes);
@@ -110,8 +121,11 @@
     }
 
     @Override
-    public <T> boolean mightContain(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits) {
+    public <T extends @Nullable Object> boolean mightContain(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits) {
       long bitSize = bits.bitSize();
       byte[] bytes = Hashing.murmur3_128().hashObject(object, funnel).getBytesInternal();
       long hash1 = lowerEight(bytes);
@@ -271,7 +285,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof LockFreeBitArray) {
         LockFreeBitArray lockFreeBitArray = (LockFreeBitArray) o;
         // TODO(lowasser): avoid allocation here
diff --git a/android/guava/src/com/google/common/hash/ChecksumHashFunction.java b/android/guava/src/com/google/common/hash/ChecksumHashFunction.java
index 380c3a3..159adbb 100644
--- a/android/guava/src/com/google/common/hash/ChecksumHashFunction.java
+++ b/android/guava/src/com/google/common/hash/ChecksumHashFunction.java
@@ -27,6 +27,7 @@
  * @author Colin Decker
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class ChecksumHashFunction extends AbstractHashFunction implements Serializable {
   private final ImmutableSupplier<? extends Checksum> checksumSupplier;
   private final int bits;
diff --git a/android/guava/src/com/google/common/hash/Crc32cHashFunction.java b/android/guava/src/com/google/common/hash/Crc32cHashFunction.java
index 02db525..8e17e65 100644
--- a/android/guava/src/com/google/common/hash/Crc32cHashFunction.java
+++ b/android/guava/src/com/google/common/hash/Crc32cHashFunction.java
@@ -15,6 +15,7 @@
 package com.google.common.hash;
 
 import com.google.errorprone.annotations.Immutable;
+import java.nio.ByteBuffer;
 
 /**
  * This class generates a CRC32C checksum, defined by RFC 3720, Section 12.1. The generator
@@ -23,6 +24,7 @@
  * @author Kurt Alfred Kluever
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class Crc32cHashFunction extends AbstractHashFunction {
   static final HashFunction CRC_32_C = new Crc32cHashFunction();
 
@@ -41,88 +43,332 @@
     return "Hashing.crc32c()";
   }
 
-  static final class Crc32cHasher extends AbstractByteHasher {
+  static final class Crc32cHasher extends AbstractStreamingHasher {
 
-    // The CRC table, generated from the polynomial 0x11EDC6F41.
-    static final int[] CRC_TABLE = {
-      0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4,
-      0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb,
-      0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b,
-      0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24,
-      0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b,
-      0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,
-      0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54,
-      0x5d1d08bf, 0xaf768bbc, 0xbc267848, 0x4e4dfb4b,
-      0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,
-      0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35,
-      0xaa64d611, 0x580f5512, 0x4b5fa6e6, 0xb93425e5,
-      0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,
-      0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45,
-      0xf779deae, 0x05125dad, 0x1642ae59, 0xe4292d5a,
-      0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a,
-      0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595,
-      0x417b1dbc, 0xb3109ebf, 0xa0406d4b, 0x522bee48,
-      0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957,
-      0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687,
-      0x0c38d26c, 0xfe53516f, 0xed03a29b, 0x1f682198,
-      0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,
-      0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38,
-      0xdbfc821c, 0x2997011f, 0x3ac7f2eb, 0xc8ac71e8,
-      0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,
-      0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096,
-      0xa65c047d, 0x5437877e, 0x4767748a, 0xb50cf789,
-      0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859,
-      0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46,
-      0x7198540d, 0x83f3d70e, 0x90a324fa, 0x62c8a7f9,
-      0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6,
-      0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36,
-      0x3cdb9bdd, 0xceb018de, 0xdde0eb2a, 0x2f8b6829,
-      0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c,
-      0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93,
-      0x082f63b7, 0xfa44e0b4, 0xe9141340, 0x1b7f9043,
-      0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,
-      0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3,
-      0x55326b08, 0xa759e80b, 0xb4091bff, 0x466298fc,
-      0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,
-      0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033,
-      0xa24bb5a6, 0x502036a5, 0x4370c551, 0xb11b4652,
-      0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d,
-      0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d,
-      0xef087a76, 0x1d63f975, 0x0e330a81, 0xfc588982,
-      0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d,
-      0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622,
-      0x38cc2a06, 0xcaa7a905, 0xd9f75af1, 0x2b9cd9f2,
-      0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,
-      0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530,
-      0x0417b1db, 0xf67c32d8, 0xe52cc12c, 0x1747422f,
-      0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,
-      0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0,
-      0xd3d3e1ab, 0x21b862a8, 0x32e8915c, 0xc083125f,
-      0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,
-      0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90,
-      0x9e902e7b, 0x6cfbad78, 0x7fab5e8c, 0x8dc0dd8f,
-      0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee,
-      0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1,
-      0x69e9f0d5, 0x9b8273d6, 0x88d28022, 0x7ab90321,
-      0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e,
-      0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81,
-      0x34f4f86a, 0xc69f7b69, 0xd5cf889d, 0x27a40b9e,
-      0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,
+    /*
+     * The striding algorithm works roughly as follows: it is universally the case that
+     * CRC(x ^ y) == CRC(x) ^ CRC(y).  The approach we take is to break the message as follows,
+     * with each letter representing a 4-byte word: ABCDABCDABCDABCD... and to calculate
+     * CRC(A000A000A000...), CRC(0B000B000B...), CRC(00C000C000C...), CRC(000D000D000D...)
+     * and then to XOR them together.  The STRIDE_TABLE enables us to hash an int followed by 12
+     * zero bytes (3 ints), while the BYTE_TABLE is for advancing one byte at a time.
+     * This algorithm is due to the paper "Everything we know about CRC but [are] afraid to forget"
+     * by Kadatch and Jenkins, 2010.
+     */
+
+    Crc32cHasher() {
+      super(16);
+    }
+
+    private boolean finished = false;
+
+    /*
+     * This trick allows us to avoid having separate states for "first four ints" and "all other
+     * four int chunks."  The state we want after the first four bytes is
+     *
+     * crc0 = ~int0
+     * crc1 = int1
+     * crc2 = int2
+     * crc3 = int3
+     *
+     * ...so we set crc0 so that computeForWord(crc0) = -1 and xoring it with the first int
+     * gives us the desired result.  computeForWord(0) == 0, so all the others do the right thing.
+     */
+    private int crc0 = INVERSE_COMPUTE_FOR_WORD_OF_ALL_1S;
+    private int crc1 = 0;
+    private int crc2 = 0;
+    private int crc3 = 0;
+
+    @Override
+    protected void process(ByteBuffer bb) {
+      if (finished) {
+        throw new IllegalStateException(
+            "The behavior of calling any method after calling hash() is undefined.");
+      }
+      while (bb.remaining() >= 16) {
+        crc0 = computeForWord(crc0);
+        crc1 = computeForWord(crc1);
+        crc2 = computeForWord(crc2);
+        crc3 = computeForWord(crc3);
+        crc0 ^= bb.getInt();
+        crc1 ^= bb.getInt();
+        crc2 ^= bb.getInt();
+        crc3 ^= bb.getInt();
+      }
+    }
+
+    @Override
+    protected void processRemaining(ByteBuffer bb) {
+      if (finished) {
+        return;
+      }
+      crc0 = combine(0, crc0);
+      crc0 = combine(crc0, crc1);
+      crc0 = combine(crc0, crc2);
+      crc0 = combine(crc0, crc3);
+      while (bb.hasRemaining()) {
+        crc0 = (crc0 >>> 8) ^ BYTE_TABLE[(bb.get() ^ crc0) & 0xFF];
+      }
+      finished = true;
+    }
+
+    @Override
+    protected HashCode makeHash() {
+      if (!finished) {
+        // processRemaining does teardown we always want to do -- the folding together of the four
+        // rolling CRCs.  So we call it on an empty ByteBuffer if we didn't already.
+        processRemaining(EMPTY);
+      }
+      return HashCode.fromInt(~crc0);
+    }
+
+    static final int[] BYTE_TABLE = {
+      0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4, 0xc79a971f, 0x35f1141c,
+      0x26a1e7e8, 0xd4ca64eb, 0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b,
+      0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24, 0x105ec76f, 0xe235446c,
+      0xf165b798, 0x030e349b, 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,
+      0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54, 0x5d1d08bf, 0xaf768bbc,
+      0xbc267848, 0x4e4dfb4b, 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,
+      0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35, 0xaa64d611, 0x580f5512,
+      0x4b5fa6e6, 0xb93425e5, 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,
+      0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45, 0xf779deae, 0x05125dad,
+      0x1642ae59, 0xe4292d5a, 0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a,
+      0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595, 0x417b1dbc, 0xb3109ebf,
+      0xa0406d4b, 0x522bee48, 0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957,
+      0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687, 0x0c38d26c, 0xfe53516f,
+      0xed03a29b, 0x1f682198, 0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,
+      0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38, 0xdbfc821c, 0x2997011f,
+      0x3ac7f2eb, 0xc8ac71e8, 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,
+      0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096, 0xa65c047d, 0x5437877e,
+      0x4767748a, 0xb50cf789, 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859,
+      0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46, 0x7198540d, 0x83f3d70e,
+      0x90a324fa, 0x62c8a7f9, 0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6,
+      0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36, 0x3cdb9bdd, 0xceb018de,
+      0xdde0eb2a, 0x2f8b6829, 0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c,
+      0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93, 0x082f63b7, 0xfa44e0b4,
+      0xe9141340, 0x1b7f9043, 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,
+      0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3, 0x55326b08, 0xa759e80b,
+      0xb4091bff, 0x466298fc, 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,
+      0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033, 0xa24bb5a6, 0x502036a5,
+      0x4370c551, 0xb11b4652, 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d,
+      0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d, 0xef087a76, 0x1d63f975,
+      0x0e330a81, 0xfc588982, 0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d,
+      0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622, 0x38cc2a06, 0xcaa7a905,
+      0xd9f75af1, 0x2b9cd9f2, 0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,
+      0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530, 0x0417b1db, 0xf67c32d8,
+      0xe52cc12c, 0x1747422f, 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,
+      0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0, 0xd3d3e1ab, 0x21b862a8,
+      0x32e8915c, 0xc083125f, 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,
+      0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90, 0x9e902e7b, 0x6cfbad78,
+      0x7fab5e8c, 0x8dc0dd8f, 0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee,
+      0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1, 0x69e9f0d5, 0x9b8273d6,
+      0x88d28022, 0x7ab90321, 0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e,
+      0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81, 0x34f4f86a, 0xc69f7b69,
+      0xd5cf889d, 0x27a40b9e, 0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,
       0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351
     };
 
-    private int crc = 0;
+    static final int[][] STRIDE_TABLE = {
+      {
+        0x00000000, 0x30d23865, 0x61a470ca, 0x517648af, 0xc348e194, 0xf39ad9f1,
+        0xa2ec915e, 0x923ea93b, 0x837db5d9, 0xb3af8dbc, 0xe2d9c513, 0xd20bfd76,
+        0x4035544d, 0x70e76c28, 0x21912487, 0x11431ce2, 0x03171d43, 0x33c52526,
+        0x62b36d89, 0x526155ec, 0xc05ffcd7, 0xf08dc4b2, 0xa1fb8c1d, 0x9129b478,
+        0x806aa89a, 0xb0b890ff, 0xe1ced850, 0xd11ce035, 0x4322490e, 0x73f0716b,
+        0x228639c4, 0x125401a1, 0x062e3a86, 0x36fc02e3, 0x678a4a4c, 0x57587229,
+        0xc566db12, 0xf5b4e377, 0xa4c2abd8, 0x941093bd, 0x85538f5f, 0xb581b73a,
+        0xe4f7ff95, 0xd425c7f0, 0x461b6ecb, 0x76c956ae, 0x27bf1e01, 0x176d2664,
+        0x053927c5, 0x35eb1fa0, 0x649d570f, 0x544f6f6a, 0xc671c651, 0xf6a3fe34,
+        0xa7d5b69b, 0x97078efe, 0x8644921c, 0xb696aa79, 0xe7e0e2d6, 0xd732dab3,
+        0x450c7388, 0x75de4bed, 0x24a80342, 0x147a3b27, 0x0c5c750c, 0x3c8e4d69,
+        0x6df805c6, 0x5d2a3da3, 0xcf149498, 0xffc6acfd, 0xaeb0e452, 0x9e62dc37,
+        0x8f21c0d5, 0xbff3f8b0, 0xee85b01f, 0xde57887a, 0x4c692141, 0x7cbb1924,
+        0x2dcd518b, 0x1d1f69ee, 0x0f4b684f, 0x3f99502a, 0x6eef1885, 0x5e3d20e0,
+        0xcc0389db, 0xfcd1b1be, 0xada7f911, 0x9d75c174, 0x8c36dd96, 0xbce4e5f3,
+        0xed92ad5c, 0xdd409539, 0x4f7e3c02, 0x7fac0467, 0x2eda4cc8, 0x1e0874ad,
+        0x0a724f8a, 0x3aa077ef, 0x6bd63f40, 0x5b040725, 0xc93aae1e, 0xf9e8967b,
+        0xa89eded4, 0x984ce6b1, 0x890ffa53, 0xb9ddc236, 0xe8ab8a99, 0xd879b2fc,
+        0x4a471bc7, 0x7a9523a2, 0x2be36b0d, 0x1b315368, 0x096552c9, 0x39b76aac,
+        0x68c12203, 0x58131a66, 0xca2db35d, 0xfaff8b38, 0xab89c397, 0x9b5bfbf2,
+        0x8a18e710, 0xbacadf75, 0xebbc97da, 0xdb6eafbf, 0x49500684, 0x79823ee1,
+        0x28f4764e, 0x18264e2b, 0x18b8ea18, 0x286ad27d, 0x791c9ad2, 0x49cea2b7,
+        0xdbf00b8c, 0xeb2233e9, 0xba547b46, 0x8a864323, 0x9bc55fc1, 0xab1767a4,
+        0xfa612f0b, 0xcab3176e, 0x588dbe55, 0x685f8630, 0x3929ce9f, 0x09fbf6fa,
+        0x1baff75b, 0x2b7dcf3e, 0x7a0b8791, 0x4ad9bff4, 0xd8e716cf, 0xe8352eaa,
+        0xb9436605, 0x89915e60, 0x98d24282, 0xa8007ae7, 0xf9763248, 0xc9a40a2d,
+        0x5b9aa316, 0x6b489b73, 0x3a3ed3dc, 0x0aecebb9, 0x1e96d09e, 0x2e44e8fb,
+        0x7f32a054, 0x4fe09831, 0xddde310a, 0xed0c096f, 0xbc7a41c0, 0x8ca879a5,
+        0x9deb6547, 0xad395d22, 0xfc4f158d, 0xcc9d2de8, 0x5ea384d3, 0x6e71bcb6,
+        0x3f07f419, 0x0fd5cc7c, 0x1d81cddd, 0x2d53f5b8, 0x7c25bd17, 0x4cf78572,
+        0xdec92c49, 0xee1b142c, 0xbf6d5c83, 0x8fbf64e6, 0x9efc7804, 0xae2e4061,
+        0xff5808ce, 0xcf8a30ab, 0x5db49990, 0x6d66a1f5, 0x3c10e95a, 0x0cc2d13f,
+        0x14e49f14, 0x2436a771, 0x7540efde, 0x4592d7bb, 0xd7ac7e80, 0xe77e46e5,
+        0xb6080e4a, 0x86da362f, 0x97992acd, 0xa74b12a8, 0xf63d5a07, 0xc6ef6262,
+        0x54d1cb59, 0x6403f33c, 0x3575bb93, 0x05a783f6, 0x17f38257, 0x2721ba32,
+        0x7657f29d, 0x4685caf8, 0xd4bb63c3, 0xe4695ba6, 0xb51f1309, 0x85cd2b6c,
+        0x948e378e, 0xa45c0feb, 0xf52a4744, 0xc5f87f21, 0x57c6d61a, 0x6714ee7f,
+        0x3662a6d0, 0x06b09eb5, 0x12caa592, 0x22189df7, 0x736ed558, 0x43bced3d,
+        0xd1824406, 0xe1507c63, 0xb02634cc, 0x80f40ca9, 0x91b7104b, 0xa165282e,
+        0xf0136081, 0xc0c158e4, 0x52fff1df, 0x622dc9ba, 0x335b8115, 0x0389b970,
+        0x11ddb8d1, 0x210f80b4, 0x7079c81b, 0x40abf07e, 0xd2955945, 0xe2476120,
+        0xb331298f, 0x83e311ea, 0x92a00d08, 0xa272356d, 0xf3047dc2, 0xc3d645a7,
+        0x51e8ec9c, 0x613ad4f9, 0x304c9c56, 0x009ea433,
+      },
+      {
+        0x00000000, 0x54075546, 0xa80eaa8c, 0xfc09ffca, 0x55f123e9, 0x01f676af,
+        0xfdff8965, 0xa9f8dc23, 0xabe247d2, 0xffe51294, 0x03eced5e, 0x57ebb818,
+        0xfe13643b, 0xaa14317d, 0x561dceb7, 0x021a9bf1, 0x5228f955, 0x062fac13,
+        0xfa2653d9, 0xae21069f, 0x07d9dabc, 0x53de8ffa, 0xafd77030, 0xfbd02576,
+        0xf9cabe87, 0xadcdebc1, 0x51c4140b, 0x05c3414d, 0xac3b9d6e, 0xf83cc828,
+        0x043537e2, 0x503262a4, 0xa451f2aa, 0xf056a7ec, 0x0c5f5826, 0x58580d60,
+        0xf1a0d143, 0xa5a78405, 0x59ae7bcf, 0x0da92e89, 0x0fb3b578, 0x5bb4e03e,
+        0xa7bd1ff4, 0xf3ba4ab2, 0x5a429691, 0x0e45c3d7, 0xf24c3c1d, 0xa64b695b,
+        0xf6790bff, 0xa27e5eb9, 0x5e77a173, 0x0a70f435, 0xa3882816, 0xf78f7d50,
+        0x0b86829a, 0x5f81d7dc, 0x5d9b4c2d, 0x099c196b, 0xf595e6a1, 0xa192b3e7,
+        0x086a6fc4, 0x5c6d3a82, 0xa064c548, 0xf463900e, 0x4d4f93a5, 0x1948c6e3,
+        0xe5413929, 0xb1466c6f, 0x18beb04c, 0x4cb9e50a, 0xb0b01ac0, 0xe4b74f86,
+        0xe6add477, 0xb2aa8131, 0x4ea37efb, 0x1aa42bbd, 0xb35cf79e, 0xe75ba2d8,
+        0x1b525d12, 0x4f550854, 0x1f676af0, 0x4b603fb6, 0xb769c07c, 0xe36e953a,
+        0x4a964919, 0x1e911c5f, 0xe298e395, 0xb69fb6d3, 0xb4852d22, 0xe0827864,
+        0x1c8b87ae, 0x488cd2e8, 0xe1740ecb, 0xb5735b8d, 0x497aa447, 0x1d7df101,
+        0xe91e610f, 0xbd193449, 0x4110cb83, 0x15179ec5, 0xbcef42e6, 0xe8e817a0,
+        0x14e1e86a, 0x40e6bd2c, 0x42fc26dd, 0x16fb739b, 0xeaf28c51, 0xbef5d917,
+        0x170d0534, 0x430a5072, 0xbf03afb8, 0xeb04fafe, 0xbb36985a, 0xef31cd1c,
+        0x133832d6, 0x473f6790, 0xeec7bbb3, 0xbac0eef5, 0x46c9113f, 0x12ce4479,
+        0x10d4df88, 0x44d38ace, 0xb8da7504, 0xecdd2042, 0x4525fc61, 0x1122a927,
+        0xed2b56ed, 0xb92c03ab, 0x9a9f274a, 0xce98720c, 0x32918dc6, 0x6696d880,
+        0xcf6e04a3, 0x9b6951e5, 0x6760ae2f, 0x3367fb69, 0x317d6098, 0x657a35de,
+        0x9973ca14, 0xcd749f52, 0x648c4371, 0x308b1637, 0xcc82e9fd, 0x9885bcbb,
+        0xc8b7de1f, 0x9cb08b59, 0x60b97493, 0x34be21d5, 0x9d46fdf6, 0xc941a8b0,
+        0x3548577a, 0x614f023c, 0x635599cd, 0x3752cc8b, 0xcb5b3341, 0x9f5c6607,
+        0x36a4ba24, 0x62a3ef62, 0x9eaa10a8, 0xcaad45ee, 0x3eced5e0, 0x6ac980a6,
+        0x96c07f6c, 0xc2c72a2a, 0x6b3ff609, 0x3f38a34f, 0xc3315c85, 0x973609c3,
+        0x952c9232, 0xc12bc774, 0x3d2238be, 0x69256df8, 0xc0ddb1db, 0x94dae49d,
+        0x68d31b57, 0x3cd44e11, 0x6ce62cb5, 0x38e179f3, 0xc4e88639, 0x90efd37f,
+        0x39170f5c, 0x6d105a1a, 0x9119a5d0, 0xc51ef096, 0xc7046b67, 0x93033e21,
+        0x6f0ac1eb, 0x3b0d94ad, 0x92f5488e, 0xc6f21dc8, 0x3afbe202, 0x6efcb744,
+        0xd7d0b4ef, 0x83d7e1a9, 0x7fde1e63, 0x2bd94b25, 0x82219706, 0xd626c240,
+        0x2a2f3d8a, 0x7e2868cc, 0x7c32f33d, 0x2835a67b, 0xd43c59b1, 0x803b0cf7,
+        0x29c3d0d4, 0x7dc48592, 0x81cd7a58, 0xd5ca2f1e, 0x85f84dba, 0xd1ff18fc,
+        0x2df6e736, 0x79f1b270, 0xd0096e53, 0x840e3b15, 0x7807c4df, 0x2c009199,
+        0x2e1a0a68, 0x7a1d5f2e, 0x8614a0e4, 0xd213f5a2, 0x7beb2981, 0x2fec7cc7,
+        0xd3e5830d, 0x87e2d64b, 0x73814645, 0x27861303, 0xdb8fecc9, 0x8f88b98f,
+        0x267065ac, 0x727730ea, 0x8e7ecf20, 0xda799a66, 0xd8630197, 0x8c6454d1,
+        0x706dab1b, 0x246afe5d, 0x8d92227e, 0xd9957738, 0x259c88f2, 0x719bddb4,
+        0x21a9bf10, 0x75aeea56, 0x89a7159c, 0xdda040da, 0x74589cf9, 0x205fc9bf,
+        0xdc563675, 0x88516333, 0x8a4bf8c2, 0xde4cad84, 0x2245524e, 0x76420708,
+        0xdfbadb2b, 0x8bbd8e6d, 0x77b471a7, 0x23b324e1,
+      },
+      {
+        0x00000000, 0x678efd01, 0xcf1dfa02, 0xa8930703, 0x9bd782f5, 0xfc597ff4,
+        0x54ca78f7, 0x334485f6, 0x3243731b, 0x55cd8e1a, 0xfd5e8919, 0x9ad07418,
+        0xa994f1ee, 0xce1a0cef, 0x66890bec, 0x0107f6ed, 0x6486e636, 0x03081b37,
+        0xab9b1c34, 0xcc15e135, 0xff5164c3, 0x98df99c2, 0x304c9ec1, 0x57c263c0,
+        0x56c5952d, 0x314b682c, 0x99d86f2f, 0xfe56922e, 0xcd1217d8, 0xaa9cead9,
+        0x020fedda, 0x658110db, 0xc90dcc6c, 0xae83316d, 0x0610366e, 0x619ecb6f,
+        0x52da4e99, 0x3554b398, 0x9dc7b49b, 0xfa49499a, 0xfb4ebf77, 0x9cc04276,
+        0x34534575, 0x53ddb874, 0x60993d82, 0x0717c083, 0xaf84c780, 0xc80a3a81,
+        0xad8b2a5a, 0xca05d75b, 0x6296d058, 0x05182d59, 0x365ca8af, 0x51d255ae,
+        0xf94152ad, 0x9ecfafac, 0x9fc85941, 0xf846a440, 0x50d5a343, 0x375b5e42,
+        0x041fdbb4, 0x639126b5, 0xcb0221b6, 0xac8cdcb7, 0x97f7ee29, 0xf0791328,
+        0x58ea142b, 0x3f64e92a, 0x0c206cdc, 0x6bae91dd, 0xc33d96de, 0xa4b36bdf,
+        0xa5b49d32, 0xc23a6033, 0x6aa96730, 0x0d279a31, 0x3e631fc7, 0x59ede2c6,
+        0xf17ee5c5, 0x96f018c4, 0xf371081f, 0x94fff51e, 0x3c6cf21d, 0x5be20f1c,
+        0x68a68aea, 0x0f2877eb, 0xa7bb70e8, 0xc0358de9, 0xc1327b04, 0xa6bc8605,
+        0x0e2f8106, 0x69a17c07, 0x5ae5f9f1, 0x3d6b04f0, 0x95f803f3, 0xf276fef2,
+        0x5efa2245, 0x3974df44, 0x91e7d847, 0xf6692546, 0xc52da0b0, 0xa2a35db1,
+        0x0a305ab2, 0x6dbea7b3, 0x6cb9515e, 0x0b37ac5f, 0xa3a4ab5c, 0xc42a565d,
+        0xf76ed3ab, 0x90e02eaa, 0x387329a9, 0x5ffdd4a8, 0x3a7cc473, 0x5df23972,
+        0xf5613e71, 0x92efc370, 0xa1ab4686, 0xc625bb87, 0x6eb6bc84, 0x09384185,
+        0x083fb768, 0x6fb14a69, 0xc7224d6a, 0xa0acb06b, 0x93e8359d, 0xf466c89c,
+        0x5cf5cf9f, 0x3b7b329e, 0x2a03aaa3, 0x4d8d57a2, 0xe51e50a1, 0x8290ada0,
+        0xb1d42856, 0xd65ad557, 0x7ec9d254, 0x19472f55, 0x1840d9b8, 0x7fce24b9,
+        0xd75d23ba, 0xb0d3debb, 0x83975b4d, 0xe419a64c, 0x4c8aa14f, 0x2b045c4e,
+        0x4e854c95, 0x290bb194, 0x8198b697, 0xe6164b96, 0xd552ce60, 0xb2dc3361,
+        0x1a4f3462, 0x7dc1c963, 0x7cc63f8e, 0x1b48c28f, 0xb3dbc58c, 0xd455388d,
+        0xe711bd7b, 0x809f407a, 0x280c4779, 0x4f82ba78, 0xe30e66cf, 0x84809bce,
+        0x2c139ccd, 0x4b9d61cc, 0x78d9e43a, 0x1f57193b, 0xb7c41e38, 0xd04ae339,
+        0xd14d15d4, 0xb6c3e8d5, 0x1e50efd6, 0x79de12d7, 0x4a9a9721, 0x2d146a20,
+        0x85876d23, 0xe2099022, 0x878880f9, 0xe0067df8, 0x48957afb, 0x2f1b87fa,
+        0x1c5f020c, 0x7bd1ff0d, 0xd342f80e, 0xb4cc050f, 0xb5cbf3e2, 0xd2450ee3,
+        0x7ad609e0, 0x1d58f4e1, 0x2e1c7117, 0x49928c16, 0xe1018b15, 0x868f7614,
+        0xbdf4448a, 0xda7ab98b, 0x72e9be88, 0x15674389, 0x2623c67f, 0x41ad3b7e,
+        0xe93e3c7d, 0x8eb0c17c, 0x8fb73791, 0xe839ca90, 0x40aacd93, 0x27243092,
+        0x1460b564, 0x73ee4865, 0xdb7d4f66, 0xbcf3b267, 0xd972a2bc, 0xbefc5fbd,
+        0x166f58be, 0x71e1a5bf, 0x42a52049, 0x252bdd48, 0x8db8da4b, 0xea36274a,
+        0xeb31d1a7, 0x8cbf2ca6, 0x242c2ba5, 0x43a2d6a4, 0x70e65352, 0x1768ae53,
+        0xbffba950, 0xd8755451, 0x74f988e6, 0x137775e7, 0xbbe472e4, 0xdc6a8fe5,
+        0xef2e0a13, 0x88a0f712, 0x2033f011, 0x47bd0d10, 0x46bafbfd, 0x213406fc,
+        0x89a701ff, 0xee29fcfe, 0xdd6d7908, 0xbae38409, 0x1270830a, 0x75fe7e0b,
+        0x107f6ed0, 0x77f193d1, 0xdf6294d2, 0xb8ec69d3, 0x8ba8ec25, 0xec261124,
+        0x44b51627, 0x233beb26, 0x223c1dcb, 0x45b2e0ca, 0xed21e7c9, 0x8aaf1ac8,
+        0xb9eb9f3e, 0xde65623f, 0x76f6653c, 0x1178983d,
+      },
+      {
+        0x00000000, 0xf20c0dfe, 0xe1f46d0d, 0x13f860f3, 0xc604aceb, 0x3408a115,
+        0x27f0c1e6, 0xd5fccc18, 0x89e52f27, 0x7be922d9, 0x6811422a, 0x9a1d4fd4,
+        0x4fe183cc, 0xbded8e32, 0xae15eec1, 0x5c19e33f, 0x162628bf, 0xe42a2541,
+        0xf7d245b2, 0x05de484c, 0xd0228454, 0x222e89aa, 0x31d6e959, 0xc3dae4a7,
+        0x9fc30798, 0x6dcf0a66, 0x7e376a95, 0x8c3b676b, 0x59c7ab73, 0xabcba68d,
+        0xb833c67e, 0x4a3fcb80, 0x2c4c517e, 0xde405c80, 0xcdb83c73, 0x3fb4318d,
+        0xea48fd95, 0x1844f06b, 0x0bbc9098, 0xf9b09d66, 0xa5a97e59, 0x57a573a7,
+        0x445d1354, 0xb6511eaa, 0x63add2b2, 0x91a1df4c, 0x8259bfbf, 0x7055b241,
+        0x3a6a79c1, 0xc866743f, 0xdb9e14cc, 0x29921932, 0xfc6ed52a, 0x0e62d8d4,
+        0x1d9ab827, 0xef96b5d9, 0xb38f56e6, 0x41835b18, 0x527b3beb, 0xa0773615,
+        0x758bfa0d, 0x8787f7f3, 0x947f9700, 0x66739afe, 0x5898a2fc, 0xaa94af02,
+        0xb96ccff1, 0x4b60c20f, 0x9e9c0e17, 0x6c9003e9, 0x7f68631a, 0x8d646ee4,
+        0xd17d8ddb, 0x23718025, 0x3089e0d6, 0xc285ed28, 0x17792130, 0xe5752cce,
+        0xf68d4c3d, 0x048141c3, 0x4ebe8a43, 0xbcb287bd, 0xaf4ae74e, 0x5d46eab0,
+        0x88ba26a8, 0x7ab62b56, 0x694e4ba5, 0x9b42465b, 0xc75ba564, 0x3557a89a,
+        0x26afc869, 0xd4a3c597, 0x015f098f, 0xf3530471, 0xe0ab6482, 0x12a7697c,
+        0x74d4f382, 0x86d8fe7c, 0x95209e8f, 0x672c9371, 0xb2d05f69, 0x40dc5297,
+        0x53243264, 0xa1283f9a, 0xfd31dca5, 0x0f3dd15b, 0x1cc5b1a8, 0xeec9bc56,
+        0x3b35704e, 0xc9397db0, 0xdac11d43, 0x28cd10bd, 0x62f2db3d, 0x90fed6c3,
+        0x8306b630, 0x710abbce, 0xa4f677d6, 0x56fa7a28, 0x45021adb, 0xb70e1725,
+        0xeb17f41a, 0x191bf9e4, 0x0ae39917, 0xf8ef94e9, 0x2d1358f1, 0xdf1f550f,
+        0xcce735fc, 0x3eeb3802, 0xb13145f8, 0x433d4806, 0x50c528f5, 0xa2c9250b,
+        0x7735e913, 0x8539e4ed, 0x96c1841e, 0x64cd89e0, 0x38d46adf, 0xcad86721,
+        0xd92007d2, 0x2b2c0a2c, 0xfed0c634, 0x0cdccbca, 0x1f24ab39, 0xed28a6c7,
+        0xa7176d47, 0x551b60b9, 0x46e3004a, 0xb4ef0db4, 0x6113c1ac, 0x931fcc52,
+        0x80e7aca1, 0x72eba15f, 0x2ef24260, 0xdcfe4f9e, 0xcf062f6d, 0x3d0a2293,
+        0xe8f6ee8b, 0x1afae375, 0x09028386, 0xfb0e8e78, 0x9d7d1486, 0x6f711978,
+        0x7c89798b, 0x8e857475, 0x5b79b86d, 0xa975b593, 0xba8dd560, 0x4881d89e,
+        0x14983ba1, 0xe694365f, 0xf56c56ac, 0x07605b52, 0xd29c974a, 0x20909ab4,
+        0x3368fa47, 0xc164f7b9, 0x8b5b3c39, 0x795731c7, 0x6aaf5134, 0x98a35cca,
+        0x4d5f90d2, 0xbf539d2c, 0xacabfddf, 0x5ea7f021, 0x02be131e, 0xf0b21ee0,
+        0xe34a7e13, 0x114673ed, 0xc4babff5, 0x36b6b20b, 0x254ed2f8, 0xd742df06,
+        0xe9a9e704, 0x1ba5eafa, 0x085d8a09, 0xfa5187f7, 0x2fad4bef, 0xdda14611,
+        0xce5926e2, 0x3c552b1c, 0x604cc823, 0x9240c5dd, 0x81b8a52e, 0x73b4a8d0,
+        0xa64864c8, 0x54446936, 0x47bc09c5, 0xb5b0043b, 0xff8fcfbb, 0x0d83c245,
+        0x1e7ba2b6, 0xec77af48, 0x398b6350, 0xcb876eae, 0xd87f0e5d, 0x2a7303a3,
+        0x766ae09c, 0x8466ed62, 0x979e8d91, 0x6592806f, 0xb06e4c77, 0x42624189,
+        0x519a217a, 0xa3962c84, 0xc5e5b67a, 0x37e9bb84, 0x2411db77, 0xd61dd689,
+        0x03e11a91, 0xf1ed176f, 0xe215779c, 0x10197a62, 0x4c00995d, 0xbe0c94a3,
+        0xadf4f450, 0x5ff8f9ae, 0x8a0435b6, 0x78083848, 0x6bf058bb, 0x99fc5545,
+        0xd3c39ec5, 0x21cf933b, 0x3237f3c8, 0xc03bfe36, 0x15c7322e, 0xe7cb3fd0,
+        0xf4335f23, 0x063f52dd, 0x5a26b1e2, 0xa82abc1c, 0xbbd2dcef, 0x49ded111,
+        0x9c221d09, 0x6e2e10f7, 0x7dd67004, 0x8fda7dfa,
+      },
+    };
 
-    @Override
-    public void update(byte b) {
-      crc ^= 0xFFFFFFFF;
-      // See Hacker's Delight 2nd Edition, Figure 14-7.
-      crc = ~((crc >>> 8) ^ CRC_TABLE[(crc ^ b) & 0xFF]);
+    // Value x picked so computeForWord(x) == ~0, found by exhaustive search.
+    static final int INVERSE_COMPUTE_FOR_WORD_OF_ALL_1S = 0xeee3ddcd;
+
+    static int computeForWord(int word) {
+      return STRIDE_TABLE[3][word & 0xFF]
+          ^ STRIDE_TABLE[2][(word >>> 8) & 0xFF]
+          ^ STRIDE_TABLE[1][(word >>> 16) & 0xFF]
+          ^ STRIDE_TABLE[0][word >>> 24];
     }
 
-    @Override
-    public HashCode hash() {
-      return HashCode.fromInt(crc);
+    static int combine(int csum, int crc) {
+      csum ^= crc;
+      for (int i = 0; i < 4; i++) {
+        csum = (csum >>> 8) ^ BYTE_TABLE[csum & 0xFF];
+      }
+      return csum;
     }
+
+    private static final ByteBuffer EMPTY = ByteBuffer.allocate(0);
   }
 }
diff --git a/android/guava/src/com/google/common/hash/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/hash/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..a2382b3
--- /dev/null
+++ b/android/guava/src/com/google/common/hash/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.hash;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/hash/FarmHashFingerprint64.java b/android/guava/src/com/google/common/hash/FarmHashFingerprint64.java
index 30eab5f..7d6a398 100644
--- a/android/guava/src/com/google/common/hash/FarmHashFingerprint64.java
+++ b/android/guava/src/com/google/common/hash/FarmHashFingerprint64.java
@@ -38,6 +38,7 @@
  * @author Kyle Maddison
  * @author Geoff Pike
  */
+@ElementTypesAreNonnullByDefault
 final class FarmHashFingerprint64 extends AbstractNonStreamingHashFunction {
   static final HashFunction FARMHASH_FINGERPRINT_64 = new FarmHashFingerprint64();
 
diff --git a/android/guava/src/com/google/common/hash/Funnel.java b/android/guava/src/com/google/common/hash/Funnel.java
index 2c6a7b9..9d80dab 100644
--- a/android/guava/src/com/google/common/hash/Funnel.java
+++ b/android/guava/src/com/google/common/hash/Funnel.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An object which can send data from an object of type {@code T} into a {@code PrimitiveSink}.
@@ -43,7 +44,8 @@
  */
 @Beta
 @DoNotMock("Implement with a lambda")
-public interface Funnel<T> extends Serializable {
+@ElementTypesAreNonnullByDefault
+public interface Funnel<T extends @Nullable Object> extends Serializable {
 
   /**
    * Sends a stream of data from the {@code from} object into the sink {@code into}. There is no
@@ -51,5 +53,5 @@
    *
    * @since 12.0 (in Guava 11.0, {@code PrimitiveSink} was named {@code Sink})
    */
-  void funnel(T from, PrimitiveSink into);
+  void funnel(@ParametricNullness T from, PrimitiveSink into);
 }
diff --git a/android/guava/src/com/google/common/hash/Funnels.java b/android/guava/src/com/google/common/hash/Funnels.java
index afe60c1..6673836 100644
--- a/android/guava/src/com/google/common/hash/Funnels.java
+++ b/android/guava/src/com/google/common/hash/Funnels.java
@@ -19,7 +19,8 @@
 import java.io.OutputStream;
 import java.io.Serializable;
 import java.nio.charset.Charset;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Funnels for common types. All implementations are serializable.
@@ -28,6 +29,7 @@
  * @since 11.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class Funnels {
   private Funnels() {}
 
@@ -103,7 +105,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof StringCharsetFunnel) {
         StringCharsetFunnel funnel = (StringCharsetFunnel) o;
         return this.charset.equals(funnel.charset);
@@ -164,11 +166,13 @@
    *
    * @since 15.0
    */
-  public static <E> Funnel<Iterable<? extends E>> sequentialFunnel(Funnel<E> elementFunnel) {
+  public static <E extends @Nullable Object> Funnel<Iterable<? extends E>> sequentialFunnel(
+      Funnel<E> elementFunnel) {
     return new SequentialFunnel<E>(elementFunnel);
   }
 
-  private static class SequentialFunnel<E> implements Funnel<Iterable<? extends E>>, Serializable {
+  private static class SequentialFunnel<E extends @Nullable Object>
+      implements Funnel<Iterable<? extends E>>, Serializable {
     private final Funnel<E> elementFunnel;
 
     SequentialFunnel(Funnel<E> elementFunnel) {
@@ -188,7 +192,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof SequentialFunnel) {
         SequentialFunnel<?> funnel = (SequentialFunnel<?>) o;
         return elementFunnel.equals(funnel.elementFunnel);
diff --git a/android/guava/src/com/google/common/hash/HashCode.java b/android/guava/src/com/google/common/hash/HashCode.java
index 560e41a..fde2a86 100644
--- a/android/guava/src/com/google/common/hash/HashCode.java
+++ b/android/guava/src/com/google/common/hash/HashCode.java
@@ -18,13 +18,12 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
 import com.google.common.primitives.Ints;
 import com.google.common.primitives.UnsignedInts;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable hash code of arbitrary bit length.
@@ -33,7 +32,7 @@
  * @author Kurt Alfred Kluever
  * @since 11.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public abstract class HashCode {
   HashCode() {}
 
@@ -369,7 +368,7 @@
    * to protect against <a href="http://en.wikipedia.org/wiki/Timing_attack">timing attacks</a>.
    */
   @Override
-  public final boolean equals(@NullableDecl Object object) {
+  public final boolean equals(@CheckForNull Object object) {
     if (object instanceof HashCode) {
       HashCode that = (HashCode) object;
       return bits() == that.bits() && equalsSameBits(that);
@@ -402,10 +401,10 @@
    * Returns a string containing each byte of {@link #asBytes}, in order, as a two-digit unsigned
    * hexadecimal number in lower case.
    *
-   * <p>Note that if the output is considered to be a single hexadecimal number, this hash code's
-   * bytes are the <i>big-endian</i> representation of that number. This may be surprising since
-   * everything else in the hashing API uniformly treats multibyte values as little-endian. But this
-   * format conveniently matches that of utilities such as the UNIX {@code md5sum} command.
+   * <p>Note that if the output is considered to be a single hexadecimal number, whether this string
+   * is big-endian or little-endian depends on the byte order of {@link #asBytes}. This may be
+   * surprising for implementations of {@code HashCode} that represent the number in big-endian
+   * since everything else in the hashing API uniformly treats multibyte values as little-endian.
    *
    * <p>To create a {@code HashCode} from its string representation, see {@link #fromString}.
    */
diff --git a/android/guava/src/com/google/common/hash/HashFunction.java b/android/guava/src/com/google/common/hash/HashFunction.java
index 7884259..d4b7f8a 100644
--- a/android/guava/src/com/google/common/hash/HashFunction.java
+++ b/android/guava/src/com/google/common/hash/HashFunction.java
@@ -14,11 +14,11 @@
 
 package com.google.common.hash;
 
-import com.google.common.annotations.Beta;
 import com.google.common.primitives.Ints;
 import com.google.errorprone.annotations.Immutable;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A hash function is a collision-averse pure function that maps an arbitrary block of data to a
@@ -115,8 +115,8 @@
  * @author Kevin Bourrillion
  * @since 11.0
  */
-@Beta
 @Immutable
+@ElementTypesAreNonnullByDefault
 public interface HashFunction {
   /**
    * Begins a new hash code computation by returning an initialized, stateful {@code Hasher}
@@ -211,7 +211,8 @@
    *
    * @since 14.0
    */
-  <T> HashCode hashObject(T instance, Funnel<? super T> funnel);
+  <T extends @Nullable Object> HashCode hashObject(
+      @ParametricNullness T instance, Funnel<? super T> funnel);
 
   /**
    * Returns the number of bits (a multiple of 32) that each hash code produced by this hash
diff --git a/android/guava/src/com/google/common/hash/Hasher.java b/android/guava/src/com/google/common/hash/Hasher.java
index ae9ae5f..b3f24fa 100644
--- a/android/guava/src/com/google/common/hash/Hasher.java
+++ b/android/guava/src/com/google/common/hash/Hasher.java
@@ -18,6 +18,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link PrimitiveSink} that can compute a hash code after reading the input. Each hasher should
@@ -54,6 +55,7 @@
  */
 @Beta
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 public interface Hasher extends PrimitiveSink {
   @Override
   Hasher putByte(byte b);
@@ -119,7 +121,8 @@
   Hasher putString(CharSequence charSequence, Charset charset);
 
   /** A simple convenience for {@code funnel.funnel(object, this)}. */
-  <T> Hasher putObject(T instance, Funnel<? super T> funnel);
+  <T extends @Nullable Object> Hasher putObject(
+      @ParametricNullness T instance, Funnel<? super T> funnel);
 
   /**
    * Computes a hash code based on the data that have been provided to this hasher. The result is
diff --git a/android/guava/src/com/google/common/hash/Hashing.java b/android/guava/src/com/google/common/hash/Hashing.java
index 01480a2..dd65367 100644
--- a/android/guava/src/com/google/common/hash/Hashing.java
+++ b/android/guava/src/com/google/common/hash/Hashing.java
@@ -27,8 +27,8 @@
 import java.util.zip.Adler32;
 import java.util.zip.CRC32;
 import java.util.zip.Checksum;
+import javax.annotation.CheckForNull;
 import javax.crypto.spec.SecretKeySpec;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * Static methods to obtain {@link HashFunction} instances, and other static hashing-related
@@ -43,6 +43,7 @@
  * @since 11.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class Hashing {
   /**
    * Returns a general-purpose, <b>temporary-use</b>, non-cryptographic hash function. The algorithm
@@ -93,12 +94,53 @@
   /**
    * Returns a hash function implementing the <a
    * href="https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp">32-bit murmur3
+   * algorithm, x86 variant</a> (little-endian variant), using the given seed value, <b>with a known
+   * bug</b> as described in the deprecation text.
+   *
+   * <p>The C++ equivalent is the MurmurHash3_x86_32 function (Murmur3A), which however does not
+   * have the bug.
+   *
+   * @deprecated This implementation produces incorrect hash values from the {@link
+   *     HashFunction#hashString} method if the string contains non-BMP characters. Use {@link
+   *     #murmur3_32_fixed(int)} instead.
+   */
+  @Deprecated
+  public static HashFunction murmur3_32(int seed) {
+    return new Murmur3_32HashFunction(seed, /* supplementaryPlaneFix= */ false);
+  }
+
+  /**
+   * Returns a hash function implementing the <a
+   * href="https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp">32-bit murmur3
+   * algorithm, x86 variant</a> (little-endian variant), using the given seed value, <b>with a known
+   * bug</b> as described in the deprecation text.
+   *
+   * <p>The C++ equivalent is the MurmurHash3_x86_32 function (Murmur3A), which however does not
+   * have the bug.
+   *
+   * @deprecated This implementation produces incorrect hash values from the {@link
+   *     HashFunction#hashString} method if the string contains non-BMP characters. Use {@link
+   *     #murmur3_32_fixed()} instead.
+   */
+  @Deprecated
+  public static HashFunction murmur3_32() {
+    return Murmur3_32HashFunction.MURMUR3_32;
+  }
+
+  /**
+   * Returns a hash function implementing the <a
+   * href="https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp">32-bit murmur3
    * algorithm, x86 variant</a> (little-endian variant), using the given seed value.
    *
    * <p>The exact C++ equivalent is the MurmurHash3_x86_32 function (Murmur3A).
+   *
+   * <p>This method is called {@code murmur3_32_fixed} because it fixes a bug in the {@code
+   * HashFunction} returned by the original {@code murmur3_32} method.
+   *
+   * @since 31.0
    */
-  public static HashFunction murmur3_32(int seed) {
-    return new Murmur3_32HashFunction(seed);
+  public static HashFunction murmur3_32_fixed(int seed) {
+    return new Murmur3_32HashFunction(seed, /* supplementaryPlaneFix= */ true);
   }
 
   /**
@@ -107,9 +149,14 @@
    * algorithm, x86 variant</a> (little-endian variant), using a seed value of zero.
    *
    * <p>The exact C++ equivalent is the MurmurHash3_x86_32 function (Murmur3A).
+   *
+   * <p>This method is called {@code murmur3_32_fixed} because it fixes a bug in the {@code
+   * HashFunction} returned by the original {@code murmur3_32} method.
+   *
+   * @since 31.0
    */
-  public static HashFunction murmur3_32() {
-    return Murmur3_32HashFunction.MURMUR3_32;
+  public static HashFunction murmur3_32_fixed() {
+    return Murmur3_32HashFunction.MURMUR3_32_FIXED;
   }
 
   /**
@@ -234,7 +281,6 @@
    * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
    * MD5 (128 hash bits) hash function and the given secret key.
    *
-   *
    * @param key the secret key
    * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
    * @since 20.0
@@ -248,7 +294,6 @@
    * MD5 (128 hash bits) hash function and a {@link SecretKeySpec} created from the given byte array
    * and the MD5 algorithm.
    *
-   *
    * @param key the key material of the secret key
    * @since 20.0
    */
@@ -260,7 +305,6 @@
    * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
    * SHA-1 (160 hash bits) hash function and the given secret key.
    *
-   *
    * @param key the secret key
    * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
    * @since 20.0
@@ -274,7 +318,6 @@
    * SHA-1 (160 hash bits) hash function and a {@link SecretKeySpec} created from the given byte
    * array and the SHA-1 algorithm.
    *
-   *
    * @param key the key material of the secret key
    * @since 20.0
    */
@@ -286,7 +329,6 @@
    * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
    * SHA-256 (256 hash bits) hash function and the given secret key.
    *
-   *
    * @param key the secret key
    * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
    * @since 20.0
@@ -300,7 +342,6 @@
    * SHA-256 (256 hash bits) hash function and a {@link SecretKeySpec} created from the given byte
    * array and the SHA-256 algorithm.
    *
-   *
    * @param key the key material of the secret key
    * @since 20.0
    */
@@ -312,7 +353,6 @@
    * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
    * SHA-512 (512 hash bits) hash function and the given secret key.
    *
-   *
    * @param key the secret key
    * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
    * @since 20.0
@@ -326,7 +366,6 @@
    * SHA-512 (512 hash bits) hash function and a {@link SecretKeySpec} created from the given byte
    * array and the SHA-512 algorithm.
    *
-   *
    * @param key the key material of the secret key
    * @since 20.0
    */
@@ -457,7 +496,6 @@
    *       traffic to {@code charlie}, rather than letting {@code bravo} keep its traffic.
    * </ul>
    *
-   *
    * <p>See the <a href="http://en.wikipedia.org/wiki/Consistent_hashing">Wikipedia article on
    * consistent hashing</a> for more information.
    */
@@ -492,7 +530,6 @@
    *       traffic to {@code charlie}, rather than letting {@code bravo} keep its traffic.
    * </ul>
    *
-   *
    * <p>See the <a href="http://en.wikipedia.org/wiki/Consistent_hashing">Wikipedia article on
    * consistent hashing</a> for more information.
    */
@@ -643,7 +680,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof ConcatenatedHashFunction) {
         ConcatenatedHashFunction other = (ConcatenatedHashFunction) object;
         return Arrays.equals(functions, other.functions);
diff --git a/android/guava/src/com/google/common/hash/HashingInputStream.java b/android/guava/src/com/google/common/hash/HashingInputStream.java
index f49dfd6..bf9464c 100644
--- a/android/guava/src/com/google/common/hash/HashingInputStream.java
+++ b/android/guava/src/com/google/common/hash/HashingInputStream.java
@@ -29,6 +29,7 @@
  * @since 16.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class HashingInputStream extends FilterInputStream {
   private final Hasher hasher;
 
diff --git a/android/guava/src/com/google/common/hash/HashingOutputStream.java b/android/guava/src/com/google/common/hash/HashingOutputStream.java
index 7a1c8d8..f138bba 100644
--- a/android/guava/src/com/google/common/hash/HashingOutputStream.java
+++ b/android/guava/src/com/google/common/hash/HashingOutputStream.java
@@ -28,6 +28,7 @@
  * @since 16.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class HashingOutputStream extends FilterOutputStream {
   private final Hasher hasher;
 
diff --git a/android/guava/src/com/google/common/hash/ImmutableSupplier.java b/android/guava/src/com/google/common/hash/ImmutableSupplier.java
index f90352a..24f711a 100644
--- a/android/guava/src/com/google/common/hash/ImmutableSupplier.java
+++ b/android/guava/src/com/google/common/hash/ImmutableSupplier.java
@@ -21,5 +21,7 @@
  * Explicitly named subinterface of {@link Supplier} that can be marked {@literal @}{@link
  * Immutable}.
  */
+// TODO(cpovirk): Should we just use ChecksumType directly instead of defining this type?
 @Immutable
+@ElementTypesAreNonnullByDefault
 interface ImmutableSupplier<T> extends Supplier<T> {}
diff --git a/android/guava/src/com/google/common/hash/Java8Compatibility.java b/android/guava/src/com/google/common/hash/Java8Compatibility.java
index 52f71e7..c15f2b3 100644
--- a/android/guava/src/com/google/common/hash/Java8Compatibility.java
+++ b/android/guava/src/com/google/common/hash/Java8Compatibility.java
@@ -22,6 +22,7 @@
  * https://github.com/google/guava/issues/3990
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class Java8Compatibility {
   static void clear(Buffer b) {
     b.clear();
diff --git a/android/guava/src/com/google/common/hash/LittleEndianByteArray.java b/android/guava/src/com/google/common/hash/LittleEndianByteArray.java
index 22ef4f0..15d8b2c 100644
--- a/android/guava/src/com/google/common/hash/LittleEndianByteArray.java
+++ b/android/guava/src/com/google/common/hash/LittleEndianByteArray.java
@@ -24,6 +24,7 @@
  * @author Kevin Damm
  * @author Kyle Maddison
  */
+@ElementTypesAreNonnullByDefault
 final class LittleEndianByteArray {
 
   /** The instance that actually does the work; delegates to Unsafe or a pure-Java fallback. */
diff --git a/android/guava/src/com/google/common/hash/LongAddable.java b/android/guava/src/com/google/common/hash/LongAddable.java
index a95eece..5c6a7f0 100644
--- a/android/guava/src/com/google/common/hash/LongAddable.java
+++ b/android/guava/src/com/google/common/hash/LongAddable.java
@@ -14,11 +14,13 @@
 
 package com.google.common.hash;
 
+
 /**
  * Abstract interface for objects that can concurrently add longs.
  *
  * @author Louis Wasserman
  */
+@ElementTypesAreNonnullByDefault
 interface LongAddable {
   void increment();
 
diff --git a/android/guava/src/com/google/common/hash/LongAddables.java b/android/guava/src/com/google/common/hash/LongAddables.java
index d2768bc..370030d 100644
--- a/android/guava/src/com/google/common/hash/LongAddables.java
+++ b/android/guava/src/com/google/common/hash/LongAddables.java
@@ -22,6 +22,7 @@
  *
  * @author Louis Wasserman
  */
+@ElementTypesAreNonnullByDefault
 final class LongAddables {
   private static final Supplier<LongAddable> SUPPLIER;
 
diff --git a/android/guava/src/com/google/common/hash/LongAdder.java b/android/guava/src/com/google/common/hash/LongAdder.java
index bd08428..dc864aa 100644
--- a/android/guava/src/com/google/common/hash/LongAdder.java
+++ b/android/guava/src/com/google/common/hash/LongAdder.java
@@ -38,6 +38,7 @@
  * @since 1.8
  * @author Doug Lea
  */
+@ElementTypesAreNonnullByDefault
 final class LongAdder extends Striped64 implements Serializable, LongAddable {
   private static final long serialVersionUID = 7249069246863182397L;
 
diff --git a/android/guava/src/com/google/common/hash/MacHashFunction.java b/android/guava/src/com/google/common/hash/MacHashFunction.java
index ed1841c..031b1c0 100644
--- a/android/guava/src/com/google/common/hash/MacHashFunction.java
+++ b/android/guava/src/com/google/common/hash/MacHashFunction.java
@@ -30,6 +30,7 @@
  * @author Kurt Alfred Kluever
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class MacHashFunction extends AbstractHashFunction {
 
   @SuppressWarnings("Immutable") // cloned before each use
diff --git a/android/guava/src/com/google/common/hash/MessageDigestHashFunction.java b/android/guava/src/com/google/common/hash/MessageDigestHashFunction.java
index 5c48c7d..48b47b0 100644
--- a/android/guava/src/com/google/common/hash/MessageDigestHashFunction.java
+++ b/android/guava/src/com/google/common/hash/MessageDigestHashFunction.java
@@ -32,6 +32,7 @@
  * @author Dimitris Andreou
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class MessageDigestHashFunction extends AbstractHashFunction implements Serializable {
 
   @SuppressWarnings("Immutable") // cloned before each use
diff --git a/android/guava/src/com/google/common/hash/Murmur3_128HashFunction.java b/android/guava/src/com/google/common/hash/Murmur3_128HashFunction.java
index 4403b20..d1304f8 100644
--- a/android/guava/src/com/google/common/hash/Murmur3_128HashFunction.java
+++ b/android/guava/src/com/google/common/hash/Murmur3_128HashFunction.java
@@ -31,7 +31,7 @@
 import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * See MurmurHash3_x64_128 in <a href="http://smhasher.googlecode.com/svn/trunk/MurmurHash3.cpp">the
@@ -41,6 +41,7 @@
  * @author Dimitris Andreou
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class Murmur3_128HashFunction extends AbstractHashFunction implements Serializable {
   static final HashFunction MURMUR3_128 = new Murmur3_128HashFunction(0);
 
@@ -70,7 +71,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Murmur3_128HashFunction) {
       Murmur3_128HashFunction other = (Murmur3_128HashFunction) object;
       return seed == other.seed;
diff --git a/android/guava/src/com/google/common/hash/Murmur3_32HashFunction.java b/android/guava/src/com/google/common/hash/Murmur3_32HashFunction.java
index 373117e..a47184b 100644
--- a/android/guava/src/com/google/common/hash/Murmur3_32HashFunction.java
+++ b/android/guava/src/com/google/common/hash/Murmur3_32HashFunction.java
@@ -39,7 +39,7 @@
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.charset.Charset;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * See MurmurHash3_x86_32 in <a
@@ -51,11 +51,17 @@
  * @author Kurt Alfred Kluever
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class Murmur3_32HashFunction extends AbstractHashFunction implements Serializable {
-  static final HashFunction MURMUR3_32 = new Murmur3_32HashFunction(0);
+  static final HashFunction MURMUR3_32 =
+      new Murmur3_32HashFunction(0, /* supplementaryPlaneFix= */ false);
+  static final HashFunction MURMUR3_32_FIXED =
+      new Murmur3_32HashFunction(0, /* supplementaryPlaneFix= */ true);
 
+  // We can include the non-BMP fix here because Hashing.goodFastHash stresses that the hash is a
+  // temporary-use one. Therefore it shouldn't be persisted.
   static final HashFunction GOOD_FAST_HASH_32 =
-      new Murmur3_32HashFunction(Hashing.GOOD_FAST_HASH_SEED);
+      new Murmur3_32HashFunction(Hashing.GOOD_FAST_HASH_SEED, /* supplementaryPlaneFix= */ true);
 
   private static final int CHUNK_SIZE = 4;
 
@@ -63,9 +69,11 @@
   private static final int C2 = 0x1b873593;
 
   private final int seed;
+  private final boolean supplementaryPlaneFix;
 
-  Murmur3_32HashFunction(int seed) {
+  Murmur3_32HashFunction(int seed, boolean supplementaryPlaneFix) {
     this.seed = seed;
+    this.supplementaryPlaneFix = supplementaryPlaneFix;
   }
 
   @Override
@@ -84,10 +92,10 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Murmur3_32HashFunction) {
       Murmur3_32HashFunction other = (Murmur3_32HashFunction) object;
-      return seed == other.seed;
+      return seed == other.seed && supplementaryPlaneFix == other.supplementaryPlaneFix;
     }
     return false;
   }
@@ -190,6 +198,9 @@
           }
           i++;
           buffer |= codePointToFourUtf8Bytes(codePoint) << shift;
+          if (supplementaryPlaneFix) { // bug compatibility: earlier versions did not have this add
+            shift += 32;
+          }
           len += 4;
         }
 
@@ -391,20 +402,22 @@
   }
 
   private static long codePointToFourUtf8Bytes(int codePoint) {
-    return (((0xFL << 4) | (codePoint >>> 18)) & 0xFF)
+    // codePoint has at most 21 bits
+    return ((0xFL << 4) | (codePoint >>> 18))
         | ((0x80L | (0x3F & (codePoint >>> 12))) << 8)
         | ((0x80L | (0x3F & (codePoint >>> 6))) << 16)
         | ((0x80L | (0x3F & codePoint)) << 24);
   }
 
   private static long charToThreeUtf8Bytes(char c) {
-    return (((0xF << 5) | (c >>> 12)) & 0xFF)
+    return ((0x7L << 5) | (c >>> 12))
         | ((0x80 | (0x3F & (c >>> 6))) << 8)
         | ((0x80 | (0x3F & c)) << 16);
   }
 
   private static long charToTwoUtf8Bytes(char c) {
-    return (((0xF << 6) | (c >>> 6)) & 0xFF) | ((0x80 | (0x3F & c)) << 8);
+    // c has at most 11 bits
+    return ((0x3L << 6) | (c >>> 6)) | ((0x80 | (0x3F & c)) << 8);
   }
 
   private static final long serialVersionUID = 0L;
diff --git a/android/guava/src/com/google/common/hash/ParametricNullness.java b/android/guava/src/com/google/common/hash/ParametricNullness.java
new file mode 100644
index 0000000..2ae8d42
--- /dev/null
+++ b/android/guava/src/com/google/common/hash/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.hash;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/hash/PrimitiveSink.java b/android/guava/src/com/google/common/hash/PrimitiveSink.java
index ffeb8fd..a29ba4e 100644
--- a/android/guava/src/com/google/common/hash/PrimitiveSink.java
+++ b/android/guava/src/com/google/common/hash/PrimitiveSink.java
@@ -27,6 +27,7 @@
  */
 @Beta
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 public interface PrimitiveSink {
   /**
    * Puts a byte into this sink.
diff --git a/android/guava/src/com/google/common/hash/SipHashFunction.java b/android/guava/src/com/google/common/hash/SipHashFunction.java
index 546fae2..a226b61 100644
--- a/android/guava/src/com/google/common/hash/SipHashFunction.java
+++ b/android/guava/src/com/google/common/hash/SipHashFunction.java
@@ -24,7 +24,7 @@
 import com.google.errorprone.annotations.Immutable;
 import java.io.Serializable;
 import java.nio.ByteBuffer;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * {@link HashFunction} implementation of SipHash-c-d.
@@ -34,6 +34,7 @@
  * @author Daniel J. Bernstein
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class SipHashFunction extends AbstractHashFunction implements Serializable {
   static final HashFunction SIP_HASH_24 =
       new SipHashFunction(2, 4, 0x0706050403020100L, 0x0f0e0d0c0b0a0908L);
@@ -81,7 +82,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof SipHashFunction) {
       SipHashFunction other = (SipHashFunction) object;
       return (c == other.c) && (d == other.d) && (k0 == other.k0) && (k1 == other.k1);
diff --git a/android/guava/src/com/google/common/hash/Striped64.java b/android/guava/src/com/google/common/hash/Striped64.java
index 9542bef..1a0671c 100644
--- a/android/guava/src/com/google/common/hash/Striped64.java
+++ b/android/guava/src/com/google/common/hash/Striped64.java
@@ -13,7 +13,8 @@
 
 import com.google.common.annotations.GwtIncompatible;
 import java.util.Random;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A package-local class holding common representation and mechanics for classes supporting dynamic
@@ -21,6 +22,7 @@
  * so.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class Striped64 extends Number {
   /*
    * This class maintains a lazily-initialized table of atomically
@@ -125,7 +127,7 @@
    * class, we use a suboptimal int[] representation to avoid introducing a new type that can impede
    * class-unloading when ThreadLocals are not removed.
    */
-  static final ThreadLocal<int[]> threadHashCode = new ThreadLocal<>();
+  static final ThreadLocal<int @Nullable []> threadHashCode = new ThreadLocal<>();
 
   /** Generator of new random hash codes */
   static final Random rng = new Random();
@@ -134,7 +136,7 @@
   static final int NCPU = Runtime.getRuntime().availableProcessors();
 
   /** Table of cells. When non-null, size is a power of 2. */
-  @NullableDecl transient volatile Cell[] cells;
+  @CheckForNull transient volatile Cell[] cells;
 
   /**
    * Base value, used mainly when there is no contention, but also as a fallback during table
@@ -177,7 +179,7 @@
    * @param hc the hash code holder
    * @param wasUncontended false if CAS failed before call
    */
-  final void retryUpdate(long x, @NullableDecl int[] hc, boolean wasUncontended) {
+  final void retryUpdate(long x, @CheckForNull int[] hc, boolean wasUncontended) {
     int h;
     if (hc == null) {
       threadHashCode.set(hc = new int[1]); // Initialize randomly
diff --git a/android/guava/src/com/google/common/html/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/html/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..a28b716
--- /dev/null
+++ b/android/guava/src/com/google/common/html/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.html;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/html/HtmlEscapers.java b/android/guava/src/com/google/common/html/HtmlEscapers.java
old mode 100755
new mode 100644
index 29eebe8..c426388
--- a/android/guava/src/com/google/common/html/HtmlEscapers.java
+++ b/android/guava/src/com/google/common/html/HtmlEscapers.java
@@ -35,6 +35,7 @@
  * @since 15.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class HtmlEscapers {
   /**
    * Returns an {@link Escaper} instance that escapes HTML metacharacters as specified by <a
diff --git a/android/guava/src/com/google/common/html/ParametricNullness.java b/android/guava/src/com/google/common/html/ParametricNullness.java
new file mode 100644
index 0000000..9a62c35
--- /dev/null
+++ b/android/guava/src/com/google/common/html/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.html;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/html/package-info.java b/android/guava/src/com/google/common/html/package-info.java
old mode 100755
new mode 100644
diff --git a/android/guava/src/com/google/common/io/AppendableWriter.java b/android/guava/src/com/google/common/io/AppendableWriter.java
index 6090bd3..d9aab34 100644
--- a/android/guava/src/com/google/common/io/AppendableWriter.java
+++ b/android/guava/src/com/google/common/io/AppendableWriter.java
@@ -21,7 +21,7 @@
 import java.io.Flushable;
 import java.io.IOException;
 import java.io.Writer;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Writer that places all output on an {@link Appendable} target. If the target is {@link Flushable}
@@ -32,6 +32,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 class AppendableWriter extends Writer {
   private final Appendable target;
   private boolean closed;
@@ -68,13 +69,15 @@
   }
 
   @Override
-  public void write(@NullableDecl String str) throws IOException {
+  public void write(String str) throws IOException {
+    checkNotNull(str);
     checkNotClosed();
     target.append(str);
   }
 
   @Override
-  public void write(@NullableDecl String str, int off, int len) throws IOException {
+  public void write(String str, int off, int len) throws IOException {
+    checkNotNull(str);
     checkNotClosed();
     // tricky: append takes start, end pair...
     target.append(str, off, off + len);
@@ -104,14 +107,14 @@
   }
 
   @Override
-  public Writer append(@NullableDecl CharSequence charSeq) throws IOException {
+  public Writer append(@CheckForNull CharSequence charSeq) throws IOException {
     checkNotClosed();
     target.append(charSeq);
     return this;
   }
 
   @Override
-  public Writer append(@NullableDecl CharSequence charSeq, int start, int end) throws IOException {
+  public Writer append(@CheckForNull CharSequence charSeq, int start, int end) throws IOException {
     checkNotClosed();
     target.append(charSeq, start, end);
     return this;
diff --git a/android/guava/src/com/google/common/io/BaseEncoding.java b/android/guava/src/com/google/common/io/BaseEncoding.java
index f926c17..f42857c 100644
--- a/android/guava/src/com/google/common/io/BaseEncoding.java
+++ b/android/guava/src/com/google/common/io/BaseEncoding.java
@@ -35,7 +35,7 @@
 import java.io.Reader;
 import java.io.Writer;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A binary encoding scheme for reversibly translating between byte sequences and printable ASCII
@@ -122,6 +122,7 @@
  * @since 14.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public abstract class BaseEncoding {
   // TODO(lowasser): consider making encodeTo(Appendable, byte[], int, int) public.
 
@@ -190,11 +191,10 @@
   private static byte[] extract(byte[] result, int length) {
     if (length == result.length) {
       return result;
-    } else {
-      byte[] trunc = new byte[length];
-      System.arraycopy(result, 0, trunc, 0, length);
-      return trunc;
     }
+    byte[] trunc = new byte[length];
+    System.arraycopy(result, 0, trunc, 0, length);
+    return trunc;
   }
 
   /**
@@ -226,7 +226,8 @@
    *
    * @throws DecodingException if the input is not a valid encoded string according to this
    *     encoding.
-   */ final byte[] decodeChecked(CharSequence chars)
+   */
+  final byte[] decodeChecked(CharSequence chars)
       throws DecodingException {
     chars = trimTrailingPadding(chars);
     byte[] tmp = new byte[maxDecodedSize(chars.length())];
@@ -516,27 +517,25 @@
     Alphabet upperCase() {
       if (!hasLowerCase()) {
         return this;
-      } else {
-        checkState(!hasUpperCase(), "Cannot call upperCase() on a mixed-case alphabet");
-        char[] upperCased = new char[chars.length];
-        for (int i = 0; i < chars.length; i++) {
-          upperCased[i] = Ascii.toUpperCase(chars[i]);
-        }
-        return new Alphabet(name + ".upperCase()", upperCased);
       }
+      checkState(!hasUpperCase(), "Cannot call upperCase() on a mixed-case alphabet");
+      char[] upperCased = new char[chars.length];
+      for (int i = 0; i < chars.length; i++) {
+        upperCased[i] = Ascii.toUpperCase(chars[i]);
+      }
+      return new Alphabet(name + ".upperCase()", upperCased);
     }
 
     Alphabet lowerCase() {
       if (!hasUpperCase()) {
         return this;
-      } else {
-        checkState(!hasLowerCase(), "Cannot call lowerCase() on a mixed-case alphabet");
-        char[] lowerCased = new char[chars.length];
-        for (int i = 0; i < chars.length; i++) {
-          lowerCased[i] = Ascii.toLowerCase(chars[i]);
-        }
-        return new Alphabet(name + ".lowerCase()", lowerCased);
       }
+      checkState(!hasLowerCase(), "Cannot call lowerCase() on a mixed-case alphabet");
+      char[] lowerCased = new char[chars.length];
+      for (int i = 0; i < chars.length; i++) {
+        lowerCased[i] = Ascii.toLowerCase(chars[i]);
+      }
+      return new Alphabet(name + ".lowerCase()", lowerCased);
     }
 
     public boolean matches(char c) {
@@ -549,7 +548,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object other) {
+    public boolean equals(@CheckForNull Object other) {
       if (other instanceof Alphabet) {
         Alphabet that = (Alphabet) other;
         return Arrays.equals(this.chars, that.chars);
@@ -567,13 +566,13 @@
     // TODO(lowasser): provide a useful toString
     final Alphabet alphabet;
 
-    @NullableDecl final Character paddingChar;
+    @CheckForNull final Character paddingChar;
 
-    StandardBaseEncoding(String name, String alphabetChars, @NullableDecl Character paddingChar) {
+    StandardBaseEncoding(String name, String alphabetChars, @CheckForNull Character paddingChar) {
       this(new Alphabet(name, alphabetChars.toCharArray()), paddingChar);
     }
 
-    StandardBaseEncoding(Alphabet alphabet, @NullableDecl Character paddingChar) {
+    StandardBaseEncoding(Alphabet alphabet, @CheckForNull Character paddingChar) {
       this.alphabet = checkNotNull(alphabet);
       checkArgument(
           paddingChar == null || !alphabet.matches(paddingChar),
@@ -831,8 +830,8 @@
       return new SeparatedBaseEncoding(this, separator, afterEveryChars);
     }
 
-    @LazyInit @NullableDecl private transient BaseEncoding upperCase;
-    @LazyInit @NullableDecl private transient BaseEncoding lowerCase;
+    @LazyInit @CheckForNull private transient BaseEncoding upperCase;
+    @LazyInit @CheckForNull private transient BaseEncoding lowerCase;
 
     @Override
     public BaseEncoding upperCase() {
@@ -854,7 +853,7 @@
       return result;
     }
 
-    BaseEncoding newInstance(Alphabet alphabet, @NullableDecl Character paddingChar) {
+    BaseEncoding newInstance(Alphabet alphabet, @CheckForNull Character paddingChar) {
       return new StandardBaseEncoding(alphabet, paddingChar);
     }
 
@@ -873,7 +872,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object other) {
+    public boolean equals(@CheckForNull Object other) {
       if (other instanceof StandardBaseEncoding) {
         StandardBaseEncoding that = (StandardBaseEncoding) other;
         return this.alphabet.equals(that.alphabet)
@@ -930,17 +929,17 @@
     }
 
     @Override
-    BaseEncoding newInstance(Alphabet alphabet, @NullableDecl Character paddingChar) {
+    BaseEncoding newInstance(Alphabet alphabet, @CheckForNull Character paddingChar) {
       return new Base16Encoding(alphabet);
     }
   }
 
   static final class Base64Encoding extends StandardBaseEncoding {
-    Base64Encoding(String name, String alphabetChars, @NullableDecl Character paddingChar) {
+    Base64Encoding(String name, String alphabetChars, @CheckForNull Character paddingChar) {
       this(new Alphabet(name, alphabetChars.toCharArray()), paddingChar);
     }
 
-    private Base64Encoding(Alphabet alphabet, @NullableDecl Character paddingChar) {
+    private Base64Encoding(Alphabet alphabet, @CheckForNull Character paddingChar) {
       super(alphabet, paddingChar);
       checkArgument(alphabet.chars.length == 64);
     }
@@ -987,7 +986,7 @@
     }
 
     @Override
-    BaseEncoding newInstance(Alphabet alphabet, @NullableDecl Character paddingChar) {
+    BaseEncoding newInstance(Alphabet alphabet, @CheckForNull Character paddingChar) {
       return new Base64Encoding(alphabet, paddingChar);
     }
   }
@@ -1038,13 +1037,12 @@
       }
 
       @Override
-      public Appendable append(@NullableDecl CharSequence chars, int off, int len)
-          throws IOException {
+      public Appendable append(@CheckForNull CharSequence chars, int off, int len) {
         throw new UnsupportedOperationException();
       }
 
       @Override
-      public Appendable append(@NullableDecl CharSequence chars) throws IOException {
+      public Appendable append(@CheckForNull CharSequence chars) {
         throw new UnsupportedOperationException();
       }
     };
diff --git a/android/guava/src/com/google/common/io/ByteArrayDataInput.java b/android/guava/src/com/google/common/io/ByteArrayDataInput.java
index bef1431..cf84fcc 100644
--- a/android/guava/src/com/google/common/io/ByteArrayDataInput.java
+++ b/android/guava/src/com/google/common/io/ByteArrayDataInput.java
@@ -18,6 +18,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.DataInput;
 import java.io.IOException;
+import javax.annotation.CheckForNull;
 
 /**
  * An extension of {@code DataInput} for reading from in-memory byte arrays; its methods offer
@@ -32,6 +33,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface ByteArrayDataInput extends DataInput {
   @Override
   void readFully(byte b[]);
@@ -86,6 +88,7 @@
 
   @CanIgnoreReturnValue // to skip a line
   @Override
+  @CheckForNull
   String readLine();
 
   @CanIgnoreReturnValue // to skip a field
diff --git a/android/guava/src/com/google/common/io/ByteArrayDataOutput.java b/android/guava/src/com/google/common/io/ByteArrayDataOutput.java
index e1ad6ab..3739073 100644
--- a/android/guava/src/com/google/common/io/ByteArrayDataOutput.java
+++ b/android/guava/src/com/google/common/io/ByteArrayDataOutput.java
@@ -26,6 +26,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface ByteArrayDataOutput extends DataOutput {
   @Override
   void write(int b);
diff --git a/android/guava/src/com/google/common/io/ByteProcessor.java b/android/guava/src/com/google/common/io/ByteProcessor.java
index 115c735..98ea3ff 100644
--- a/android/guava/src/com/google/common/io/ByteProcessor.java
+++ b/android/guava/src/com/google/common/io/ByteProcessor.java
@@ -19,6 +19,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.DoNotMock;
 import java.io.IOException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A callback interface to process bytes from a stream.
@@ -32,7 +33,8 @@
 @Beta
 @DoNotMock("Implement it normally")
 @GwtIncompatible
-public interface ByteProcessor<T> {
+@ElementTypesAreNonnullByDefault
+public interface ByteProcessor<T extends @Nullable Object> {
   /**
    * This method will be called for each chunk of bytes in an input stream. The implementation
    * should process the bytes from {@code buf[off]} through {@code buf[off + len - 1]} (inclusive).
@@ -46,5 +48,6 @@
   boolean processBytes(byte[] buf, int off, int len) throws IOException;
 
   /** Return the result of processing all the bytes. */
+  @ParametricNullness
   T getResult();
 }
diff --git a/android/guava/src/com/google/common/io/ByteSink.java b/android/guava/src/com/google/common/io/ByteSink.java
index ffba6e0..7a6af6f 100644
--- a/android/guava/src/com/google/common/io/ByteSink.java
+++ b/android/guava/src/com/google/common/io/ByteSink.java
@@ -46,6 +46,7 @@
  * @author Colin Decker
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ByteSink {
 
   /** Constructor for use by subclasses. */
diff --git a/android/guava/src/com/google/common/io/ByteSource.java b/android/guava/src/com/google/common/io/ByteSource.java
index 19f3a43..c8da967 100644
--- a/android/guava/src/com/google/common/io/ByteSource.java
+++ b/android/guava/src/com/google/common/io/ByteSource.java
@@ -40,6 +40,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A readable source of bytes, such as a file. Unlike an {@link InputStream}, a {@code ByteSource}
@@ -57,10 +58,23 @@
  *       doing something and finally closing the stream that was opened.
  * </ul>
  *
+ * <p><b>Note:</b> In general, {@code ByteSource} is intended to be used for "file-like" sources
+ * that provide streams that are:
+ *
+ * <ul>
+ *   <li><b>Finite:</b> Many operations, such as {@link #size()} and {@link #read()}, will either
+ *       block indefinitely or fail if the source creates an infinite stream.
+ *   <li><b>Non-destructive:</b> A <i>destructive</i> stream will consume or otherwise alter the
+ *       bytes of the source as they are read from it. A source that provides such streams will not
+ *       be reusable, and operations that read from the stream (including {@link #size()}, in some
+ *       implementations) will prevent further operations from completing as expected.
+ * </ul>
+ *
  * @since 14.0
  * @author Colin Decker
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ByteSource {
 
   /** Constructor for use by subclasses. */
@@ -302,7 +316,7 @@
    */
   @Beta
   @CanIgnoreReturnValue // some processors won't return a useful result
-  public <T> T read(ByteProcessor<T> processor) throws IOException {
+  public <T extends @Nullable Object> T read(ByteProcessor<T> processor) throws IOException {
     checkNotNull(processor);
 
     Closer closer = Closer.create();
@@ -416,7 +430,7 @@
    * Returns a view of the given byte array as a {@link ByteSource}. To view only a specific range
    * in the array, use {@code ByteSource.wrap(b).slice(offset, length)}.
    *
-   * <p>Note that the given byte array may be be passed directly to methods on, for example, {@code
+   * <p>Note that the given byte array may be passed directly to methods on, for example, {@code
    * OutputStream} (when {@code copyTo(OutputStream)} is called on the resulting {@code
    * ByteSource}). This could allow a malicious {@code OutputStream} implementation to modify the
    * contents of the array, but provides better performance in the normal case.
@@ -606,7 +620,8 @@
 
     @SuppressWarnings("CheckReturnValue") // it doesn't matter what processBytes returns here
     @Override
-    public <T> T read(ByteProcessor<T> processor) throws IOException {
+    @ParametricNullness
+    public <T extends @Nullable Object> T read(ByteProcessor<T> processor) throws IOException {
       processor.processBytes(bytes, offset, length);
       return processor.getResult();
     }
diff --git a/android/guava/src/com/google/common/io/ByteStreams.java b/android/guava/src/com/google/common/io/ByteStreams.java
index bdb24db..2f1f669 100644
--- a/android/guava/src/com/google/common/io/ByteStreams.java
+++ b/android/guava/src/com/google/common/io/ByteStreams.java
@@ -41,6 +41,8 @@
 import java.util.ArrayDeque;
 import java.util.Arrays;
 import java.util.Queue;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides utility methods for working with byte arrays and I/O streams.
@@ -50,6 +52,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ByteStreams {
 
   private static final int BUFFER_SIZE = 8192;
@@ -438,6 +441,7 @@
     }
 
     @Override
+    @CheckForNull
     public String readLine() {
       try {
         return input.readLine();
@@ -869,7 +873,9 @@
    */
   @Beta
   @CanIgnoreReturnValue // some processors won't return a useful result
-  public static <T> T readBytes(InputStream input, ByteProcessor<T> processor) throws IOException {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T readBytes(
+      InputStream input, ByteProcessor<T> processor) throws IOException {
     checkNotNull(input);
     checkNotNull(processor);
 
diff --git a/android/guava/src/com/google/common/io/CharSequenceReader.java b/android/guava/src/com/google/common/io/CharSequenceReader.java
index 4cbeda1..790e266 100644
--- a/android/guava/src/com/google/common/io/CharSequenceReader.java
+++ b/android/guava/src/com/google/common/io/CharSequenceReader.java
@@ -17,11 +17,13 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtIncompatible;
 import java.io.IOException;
 import java.io.Reader;
 import java.nio.CharBuffer;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link Reader} that reads the characters in a {@link CharSequence}. Like {@code StringReader},
@@ -31,9 +33,10 @@
  */
 // TODO(cgdecker): make this public? as a type, or a method in CharStreams?
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class CharSequenceReader extends Reader {
 
-  private CharSequence seq;
+  @CheckForNull private CharSequence seq;
   private int pos;
   private int mark;
 
@@ -53,13 +56,27 @@
   }
 
   private int remaining() {
+    requireNonNull(seq); // safe as long as we call this only after checkOpen
     return seq.length() - pos;
   }
 
+  /*
+   * To avoid the need to call requireNonNull so much, we could consider more clever approaches,
+   * such as:
+   *
+   * - Make checkOpen return the non-null `seq`. Then callers can assign that to a local variable or
+   *   even back to `this.seq`. However, that may suggest that we're defending against concurrent
+   *   mutation, which is not an actual risk because we use `synchronized`.
+   * - Make `remaining` require a non-null `seq` argument. But this is a bit weird because the
+   *   method, while it would avoid the instance field `seq` would still access the instance field
+   *   `pos`.
+   */
+
   @Override
   public synchronized int read(CharBuffer target) throws IOException {
     checkNotNull(target);
     checkOpen();
+    requireNonNull(seq); // safe because of checkOpen
     if (!hasRemaining()) {
       return -1;
     }
@@ -73,6 +90,7 @@
   @Override
   public synchronized int read() throws IOException {
     checkOpen();
+    requireNonNull(seq); // safe because of checkOpen
     return hasRemaining() ? seq.charAt(pos++) : -1;
   }
 
@@ -80,6 +98,7 @@
   public synchronized int read(char[] cbuf, int off, int len) throws IOException {
     checkPositionIndexes(off, off + len, cbuf.length);
     checkOpen();
+    requireNonNull(seq); // safe because of checkOpen
     if (!hasRemaining()) {
       return -1;
     }
diff --git a/android/guava/src/com/google/common/io/CharSink.java b/android/guava/src/com/google/common/io/CharSink.java
index e615662..bdf5f38 100644
--- a/android/guava/src/com/google/common/io/CharSink.java
+++ b/android/guava/src/com/google/common/io/CharSink.java
@@ -48,6 +48,7 @@
  * @author Colin Decker
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class CharSink {
 
   /** Constructor for use by subclasses. */
diff --git a/android/guava/src/com/google/common/io/CharSource.java b/android/guava/src/com/google/common/io/CharSource.java
index 82110da..b7623ff 100644
--- a/android/guava/src/com/google/common/io/CharSource.java
+++ b/android/guava/src/com/google/common/io/CharSource.java
@@ -34,7 +34,8 @@
 import java.nio.charset.Charset;
 import java.util.Iterator;
 import java.util.List;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A readable source of characters, such as a text file. Unlike a {@link Reader}, a {@code
@@ -60,10 +61,23 @@
  * <p>Any {@link ByteSource} containing text encoded with a specific {@linkplain Charset character
  * encoding} may be viewed as a {@code CharSource} using {@link ByteSource#asCharSource(Charset)}.
  *
+ * <p><b>Note:</b> In general, {@code CharSource} is intended to be used for "file-like" sources
+ * that provide readers that are:
+ *
+ * <ul>
+ *   <li><b>Finite:</b> Many operations, such as {@link #length()} and {@link #read()}, will either
+ *       block indefinitely or fail if the source creates an infinite reader.
+ *   <li><b>Non-destructive:</b> A <i>destructive</i> reader will consume or otherwise alter the
+ *       source as they are read from it. A source that provides such readers will not be reusable,
+ *       and operations that read from the stream (including {@link #length()}, in some
+ *       implementations) will prevent further operations from completing as expected.
+ * </ul>
+ *
  * @since 14.0
  * @author Colin Decker
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class CharSource {
 
   /** Constructor for use by subclasses. */
@@ -248,7 +262,7 @@
    *
    * @throws IOException if an I/O error occurs while reading from this source
    */
-  @NullableDecl
+  @CheckForNull
   public String readFirstLine() throws IOException {
     Closer closer = Closer.create();
     try {
@@ -305,7 +319,8 @@
    */
   @Beta
   @CanIgnoreReturnValue // some processors won't return a useful result
-  public <T> T readLines(LineProcessor<T> processor) throws IOException {
+  @ParametricNullness
+  public <T extends @Nullable Object> T readLines(LineProcessor<T> processor) throws IOException {
     checkNotNull(processor);
 
     Closer closer = Closer.create();
@@ -494,6 +509,7 @@
         Iterator<String> lines = LINE_SPLITTER.split(seq).iterator();
 
         @Override
+        @CheckForNull
         protected String computeNext() {
           if (lines.hasNext()) {
             String next = lines.next();
@@ -508,6 +524,7 @@
     }
 
     @Override
+    @CheckForNull
     public String readFirstLine() {
       Iterator<String> lines = linesIterator();
       return lines.hasNext() ? lines.next() : null;
@@ -519,7 +536,8 @@
     }
 
     @Override
-    public <T> T readLines(LineProcessor<T> processor) throws IOException {
+    @ParametricNullness
+    public <T extends @Nullable Object> T readLines(LineProcessor<T> processor) throws IOException {
       Iterator<String> lines = linesIterator();
       while (lines.hasNext()) {
         if (!processor.processLine(lines.next())) {
diff --git a/android/guava/src/com/google/common/io/CharStreams.java b/android/guava/src/com/google/common/io/CharStreams.java
index e54284e..c414194 100644
--- a/android/guava/src/com/google/common/io/CharStreams.java
+++ b/android/guava/src/com/google/common/io/CharStreams.java
@@ -28,7 +28,8 @@
 import java.nio.CharBuffer;
 import java.util.ArrayList;
 import java.util.List;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides utility methods for working with character streams.
@@ -45,6 +46,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class CharStreams {
 
   // 2K chars (4K bytes)
@@ -77,19 +79,19 @@
       } else {
         return copyReaderToWriter((Reader) from, asWriter(to));
       }
-    } else {
-      checkNotNull(from);
-      checkNotNull(to);
-      long total = 0;
-      CharBuffer buf = createBuffer();
-      while (from.read(buf) != -1) {
-        Java8Compatibility.flip(buf);
-        to.append(buf);
-        total += buf.remaining();
-        Java8Compatibility.clear(buf);
-      }
-      return total;
     }
+
+    checkNotNull(from);
+    checkNotNull(to);
+    long total = 0;
+    CharBuffer buf = createBuffer();
+    while (from.read(buf) != -1) {
+      Java8Compatibility.flip(buf);
+      to.append(buf);
+      total += buf.remaining();
+      Java8Compatibility.clear(buf);
+    }
+    return total;
   }
 
   // TODO(lukes): consider allowing callers to pass in a buffer to use, some callers would be able
@@ -215,7 +217,9 @@
    */
   @Beta
   @CanIgnoreReturnValue // some processors won't return a useful result
-  public static <T> T readLines(Readable readable, LineProcessor<T> processor) throws IOException {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T readLines(
+      Readable readable, LineProcessor<T> processor) throws IOException {
     checkNotNull(readable);
     checkNotNull(processor);
 
@@ -307,12 +311,12 @@
     }
 
     @Override
-    public Writer append(@NullableDecl CharSequence csq) {
+    public Writer append(@CheckForNull CharSequence csq) {
       return this;
     }
 
     @Override
-    public Writer append(@NullableDecl CharSequence csq, int start, int end) {
+    public Writer append(@CheckForNull CharSequence csq, int start, int end) {
       checkPositionIndexes(start, end, csq == null ? "null".length() : csq.length());
       return this;
     }
diff --git a/android/guava/src/com/google/common/io/Closeables.java b/android/guava/src/com/google/common/io/Closeables.java
index e7489a7..b45f5f0 100644
--- a/android/guava/src/com/google/common/io/Closeables.java
+++ b/android/guava/src/com/google/common/io/Closeables.java
@@ -23,7 +23,7 @@
 import java.io.Reader;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Utility methods for working with {@link Closeable} objects.
@@ -33,6 +33,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Closeables {
   @VisibleForTesting static final Logger logger = Logger.getLogger(Closeables.class.getName());
 
@@ -69,7 +70,7 @@
    * @throws IOException if {@code swallowIOException} is false and {@code close} throws an {@code
    *     IOException}.
    */
-  public static void close(@NullableDecl Closeable closeable, boolean swallowIOException)
+  public static void close(@CheckForNull Closeable closeable, boolean swallowIOException)
       throws IOException {
     if (closeable == null) {
       return;
@@ -99,7 +100,7 @@
    *     does nothing
    * @since 17.0
    */
-  public static void closeQuietly(@NullableDecl InputStream inputStream) {
+  public static void closeQuietly(@CheckForNull InputStream inputStream) {
     try {
       close(inputStream, true);
     } catch (IOException impossible) {
@@ -120,7 +121,7 @@
    * @param reader the reader to be closed, or {@code null} in which case this method does nothing
    * @since 17.0
    */
-  public static void closeQuietly(@NullableDecl Reader reader) {
+  public static void closeQuietly(@CheckForNull Reader reader) {
     try {
       close(reader, true);
     } catch (IOException impossible) {
diff --git a/android/guava/src/com/google/common/io/Closer.java b/android/guava/src/com/google/common/io/Closer.java
index ff5db89..12998ef 100644
--- a/android/guava/src/com/google/common/io/Closer.java
+++ b/android/guava/src/com/google/common/io/Closer.java
@@ -27,7 +27,8 @@
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.logging.Level;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Closeable} that collects {@code Closeable} resources and closes them all when it is
@@ -88,13 +89,16 @@
 // Coffee's for {@link Closer closers} only.
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Closer implements Closeable {
 
   /** The suppressor implementation to use for the current Java version. */
-  private static final Suppressor SUPPRESSOR =
-      SuppressingSuppressor.isAvailable()
-          ? SuppressingSuppressor.INSTANCE
-          : LoggingSuppressor.INSTANCE;
+  private static final Suppressor SUPPRESSOR;
+
+  static {
+    SuppressingSuppressor suppressingSuppressor = SuppressingSuppressor.tryCreate();
+    SUPPRESSOR = suppressingSuppressor == null ? LoggingSuppressor.INSTANCE : suppressingSuppressor;
+  }
 
   /** Creates a new {@link Closer}. */
   public static Closer create() {
@@ -105,7 +109,7 @@
 
   // only need space for 2 elements in most cases, so try to use the smallest array possible
   private final Deque<Closeable> stack = new ArrayDeque<>(4);
-  @NullableDecl private Throwable thrown;
+  @CheckForNull private Throwable thrown;
 
   @VisibleForTesting
   Closer(Suppressor suppressor) {
@@ -120,7 +124,8 @@
    */
   // close. this word no longer has any meaning to me.
   @CanIgnoreReturnValue
-  public <C extends Closeable> C register(@NullableDecl C closeable) {
+  @ParametricNullness
+  public <C extends @Nullable Closeable> C register(@ParametricNullness C closeable) {
     if (closeable != null) {
       stack.addFirst(closeable);
     }
@@ -257,21 +262,21 @@
    */
   @VisibleForTesting
   static final class SuppressingSuppressor implements Suppressor {
-
-    static final SuppressingSuppressor INSTANCE = new SuppressingSuppressor();
-
-    static boolean isAvailable() {
-      return addSuppressed != null;
-    }
-
-    static final Method addSuppressed = addSuppressedMethodOrNull();
-
-    private static Method addSuppressedMethodOrNull() {
+    @CheckForNull
+    static SuppressingSuppressor tryCreate() {
+      Method addSuppressed;
       try {
-        return Throwable.class.getMethod("addSuppressed", Throwable.class);
+        addSuppressed = Throwable.class.getMethod("addSuppressed", Throwable.class);
       } catch (Throwable e) {
         return null;
       }
+      return new SuppressingSuppressor(addSuppressed);
+    }
+
+    private final Method addSuppressed;
+
+    private SuppressingSuppressor(Method addSuppressed) {
+      this.addSuppressed = addSuppressed;
     }
 
     @Override
diff --git a/android/guava/src/com/google/common/io/CountingInputStream.java b/android/guava/src/com/google/common/io/CountingInputStream.java
index b015aca..a37807a 100644
--- a/android/guava/src/com/google/common/io/CountingInputStream.java
+++ b/android/guava/src/com/google/common/io/CountingInputStream.java
@@ -30,6 +30,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class CountingInputStream extends FilterInputStream {
 
   private long count;
diff --git a/android/guava/src/com/google/common/io/CountingOutputStream.java b/android/guava/src/com/google/common/io/CountingOutputStream.java
index 8a3d170..cf62b9c 100644
--- a/android/guava/src/com/google/common/io/CountingOutputStream.java
+++ b/android/guava/src/com/google/common/io/CountingOutputStream.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import java.io.FilterOutputStream;
 import java.io.IOException;
@@ -28,8 +27,8 @@
  * @author Chris Nokleberg
  * @since 1.0
  */
-@Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class CountingOutputStream extends FilterOutputStream {
 
   private long count;
diff --git a/android/guava/src/com/google/common/io/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/io/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..48bc10f
--- /dev/null
+++ b/android/guava/src/com/google/common/io/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.io;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/io/FileBackedOutputStream.java b/android/guava/src/com/google/common/io/FileBackedOutputStream.java
index b72c40e..9912e2f 100644
--- a/android/guava/src/com/google/common/io/FileBackedOutputStream.java
+++ b/android/guava/src/com/google/common/io/FileBackedOutputStream.java
@@ -14,6 +14,8 @@
 
 package com.google.common.io;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -26,7 +28,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An {@link OutputStream} that starts buffering to a byte array, but switches to file buffering
@@ -50,20 +52,22 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class FileBackedOutputStream extends OutputStream {
   private final int fileThreshold;
   private final boolean resetOnFinalize;
   private final ByteSource source;
-  @NullableDecl private final File parentDirectory;
+  @CheckForNull private final File parentDirectory;
 
   @GuardedBy("this")
   private OutputStream out;
 
   @GuardedBy("this")
+  @CheckForNull
   private MemoryOutput memory;
 
   @GuardedBy("this")
-  @NullableDecl
+  @CheckForNull
   private File file;
 
   /** ByteArrayOutputStream that exposes its internals. */
@@ -79,6 +83,7 @@
 
   /** Returns the file holding the data (possibly null). */
   @VisibleForTesting
+  @CheckForNull
   synchronized File getFile() {
     return file;
   }
@@ -106,7 +111,7 @@
   }
 
   private FileBackedOutputStream(
-      int fileThreshold, boolean resetOnFinalize, @NullableDecl File parentDirectory) {
+      int fileThreshold, boolean resetOnFinalize, @CheckForNull File parentDirectory) {
     this.fileThreshold = fileThreshold;
     this.resetOnFinalize = resetOnFinalize;
     this.parentDirectory = parentDirectory;
@@ -154,6 +159,8 @@
     if (file != null) {
       return new FileInputStream(file);
     } else {
+      // requireNonNull is safe because we always have either `file` or `memory`.
+      requireNonNull(memory);
       return new ByteArrayInputStream(memory.getBuffer(), 0, memory.getCount());
     }
   }
@@ -217,19 +224,24 @@
    */
   @GuardedBy("this")
   private void update(int len) throws IOException {
-    if (file == null && (memory.getCount() + len > fileThreshold)) {
+    if (memory != null && (memory.getCount() + len > fileThreshold)) {
       File temp = File.createTempFile("FileBackedOutputStream", null, parentDirectory);
       if (resetOnFinalize) {
         // Finalizers are not guaranteed to be called on system shutdown;
         // this is insurance.
         temp.deleteOnExit();
       }
-      FileOutputStream transfer = new FileOutputStream(temp);
-      transfer.write(memory.getBuffer(), 0, memory.getCount());
-      transfer.flush();
+      try {
+        FileOutputStream transfer = new FileOutputStream(temp);
+        transfer.write(memory.getBuffer(), 0, memory.getCount());
+        transfer.flush();
+        // We've successfully transferred the data; switch to writing to file
+        out = transfer;
+      } catch (IOException e) {
+        temp.delete();
+        throw e;
+      }
 
-      // We've successfully transferred the data; switch to writing to file
-      out = transfer;
       file = temp;
       memory = null;
     }
diff --git a/android/guava/src/com/google/common/io/FileWriteMode.java b/android/guava/src/com/google/common/io/FileWriteMode.java
index 2c69a2e..86872d1 100644
--- a/android/guava/src/com/google/common/io/FileWriteMode.java
+++ b/android/guava/src/com/google/common/io/FileWriteMode.java
@@ -23,6 +23,7 @@
  * @author Colin Decker
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public enum FileWriteMode {
   /** Specifies that writes to the opened file should append to the end of the file. */
   APPEND
diff --git a/android/guava/src/com/google/common/io/Files.java b/android/guava/src/com/google/common/io/Files.java
index 73eb656..bf6289e 100644
--- a/android/guava/src/com/google/common/io/Files.java
+++ b/android/guava/src/com/google/common/io/Files.java
@@ -52,6 +52,8 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides utility methods for working with {@linkplain File files}.
@@ -64,6 +66,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Files {
 
   /** Maximum loop count when creating temp directories. */
@@ -529,6 +532,7 @@
    */
   @Beta
   @Deprecated
+  @CheckForNull
   public
   static String readFirstLine(File file, Charset charset) throws IOException {
     return asCharSource(file, charset).readFirstLine();
@@ -588,8 +592,10 @@
   @Beta
   @Deprecated
   @CanIgnoreReturnValue // some processors won't return a useful result
+  @ParametricNullness
   public
-  static <T> T readLines(File file, Charset charset, LineProcessor<T> callback) throws IOException {
+  static <T extends @Nullable Object> T readLines(
+      File file, Charset charset, LineProcessor<T> callback) throws IOException {
     return asCharSource(file, charset).readLines(callback);
   }
 
@@ -608,8 +614,10 @@
   @Beta
   @Deprecated
   @CanIgnoreReturnValue // some processors won't return a useful result
+  @ParametricNullness
   public
-  static <T> T readBytes(File file, ByteProcessor<T> processor) throws IOException {
+  static <T extends @Nullable Object> T readBytes(File file, ByteProcessor<T> processor)
+      throws IOException {
     return asByteSource(file).read(processor);
   }
 
diff --git a/android/guava/src/com/google/common/io/Flushables.java b/android/guava/src/com/google/common/io/Flushables.java
index 9b1d6a0..1f795a2 100644
--- a/android/guava/src/com/google/common/io/Flushables.java
+++ b/android/guava/src/com/google/common/io/Flushables.java
@@ -29,6 +29,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Flushables {
   private static final Logger logger = Logger.getLogger(Flushables.class.getName());
 
diff --git a/android/guava/src/com/google/common/io/Java8Compatibility.java b/android/guava/src/com/google/common/io/Java8Compatibility.java
index 62b5c2e..705d97b 100644
--- a/android/guava/src/com/google/common/io/Java8Compatibility.java
+++ b/android/guava/src/com/google/common/io/Java8Compatibility.java
@@ -22,6 +22,7 @@
  * https://github.com/google/guava/issues/3990
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class Java8Compatibility {
   static void clear(Buffer b) {
     b.clear();
@@ -35,9 +36,17 @@
     b.limit(limit);
   }
 
+  static void mark(Buffer b) {
+    b.mark();
+  }
+
   static void position(Buffer b, int position) {
     b.position(position);
   }
 
+  static void reset(Buffer b) {
+    b.reset();
+  }
+
   private Java8Compatibility() {}
 }
diff --git a/android/guava/src/com/google/common/io/LineBuffer.java b/android/guava/src/com/google/common/io/LineBuffer.java
index a8e775c..f944abc 100644
--- a/android/guava/src/com/google/common/io/LineBuffer.java
+++ b/android/guava/src/com/google/common/io/LineBuffer.java
@@ -30,6 +30,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class LineBuffer {
   /** Holds partial line contents. */
   private StringBuilder line = new StringBuilder();
diff --git a/android/guava/src/com/google/common/io/LineProcessor.java b/android/guava/src/com/google/common/io/LineProcessor.java
index 65ded53..e28bebc 100644
--- a/android/guava/src/com/google/common/io/LineProcessor.java
+++ b/android/guava/src/com/google/common/io/LineProcessor.java
@@ -18,6 +18,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.IOException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A callback to be used with the streaming {@code readLines} methods.
@@ -30,7 +31,8 @@
  */
 @Beta
 @GwtIncompatible
-public interface LineProcessor<T> {
+@ElementTypesAreNonnullByDefault
+public interface LineProcessor<T extends @Nullable Object> {
 
   /**
    * This method will be called once for each line.
@@ -42,5 +44,6 @@
   boolean processLine(String line) throws IOException;
 
   /** Return the result of processing all the lines. */
+  @ParametricNullness
   T getResult();
 }
diff --git a/android/guava/src/com/google/common/io/LineReader.java b/android/guava/src/com/google/common/io/LineReader.java
index 1c8cef0..2c57ac4 100644
--- a/android/guava/src/com/google/common/io/LineReader.java
+++ b/android/guava/src/com/google/common/io/LineReader.java
@@ -23,9 +23,9 @@
 import java.io.IOException;
 import java.io.Reader;
 import java.nio.CharBuffer;
-import java.util.LinkedList;
+import java.util.ArrayDeque;
 import java.util.Queue;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A class for reading lines of text. Provides the same functionality as {@link
@@ -37,13 +37,14 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class LineReader {
   private final Readable readable;
-  @NullableDecl private final Reader reader;
+  @CheckForNull private final Reader reader;
   private final CharBuffer cbuf = createBuffer();
   private final char[] buf = cbuf.array();
 
-  private final Queue<String> lines = new LinkedList<>();
+  private final Queue<String> lines = new ArrayDeque<>();
   private final LineBuffer lineBuf =
       new LineBuffer() {
         @Override
@@ -68,6 +69,7 @@
    * @throws IOException if an I/O error occurs
    */
   @CanIgnoreReturnValue // to skip a line
+  @CheckForNull
   public String readLine() throws IOException {
     while (lines.peek() == null) {
       Java8Compatibility.clear(cbuf);
diff --git a/android/guava/src/com/google/common/io/LittleEndianDataInputStream.java b/android/guava/src/com/google/common/io/LittleEndianDataInputStream.java
index 7d9c88b..88c8e27 100644
--- a/android/guava/src/com/google/common/io/LittleEndianDataInputStream.java
+++ b/android/guava/src/com/google/common/io/LittleEndianDataInputStream.java
@@ -20,6 +20,7 @@
 import com.google.common.primitives.Ints;
 import com.google.common.primitives.Longs;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import java.io.DataInput;
 import java.io.DataInputStream;
 import java.io.EOFException;
@@ -40,6 +41,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class LittleEndianDataInputStream extends FilterInputStream implements DataInput {
 
   /**
@@ -54,6 +56,7 @@
   /** This method will throw an {@link UnsupportedOperationException}. */
   @CanIgnoreReturnValue // to skip a line
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public String readLine() {
     throw new UnsupportedOperationException("readLine is not supported");
   }
diff --git a/android/guava/src/com/google/common/io/LittleEndianDataOutputStream.java b/android/guava/src/com/google/common/io/LittleEndianDataOutputStream.java
index e5e398f..6e51aff 100644
--- a/android/guava/src/com/google/common/io/LittleEndianDataOutputStream.java
+++ b/android/guava/src/com/google/common/io/LittleEndianDataOutputStream.java
@@ -37,6 +37,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class LittleEndianDataOutputStream extends FilterOutputStream implements DataOutput {
 
   /**
diff --git a/android/guava/src/com/google/common/io/MultiInputStream.java b/android/guava/src/com/google/common/io/MultiInputStream.java
index bae8e39..9a7e0fd 100644
--- a/android/guava/src/com/google/common/io/MultiInputStream.java
+++ b/android/guava/src/com/google/common/io/MultiInputStream.java
@@ -20,7 +20,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An {@link InputStream} that concatenates multiple substreams. At most one stream will be open at
@@ -30,10 +30,11 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class MultiInputStream extends InputStream {
 
   private Iterator<? extends ByteSource> it;
-  @NullableDecl private InputStream in;
+  @CheckForNull private InputStream in;
 
   /**
    * Creates a new instance.
@@ -90,7 +91,8 @@
   }
 
   @Override
-  public int read(@NullableDecl byte[] b, int off, int len) throws IOException {
+  public int read(byte[] b, int off, int len) throws IOException {
+    checkNotNull(b);
     while (in != null) {
       int result = in.read(b, off, len);
       if (result != -1) {
diff --git a/android/guava/src/com/google/common/io/MultiReader.java b/android/guava/src/com/google/common/io/MultiReader.java
index d075727..cc36e52 100644
--- a/android/guava/src/com/google/common/io/MultiReader.java
+++ b/android/guava/src/com/google/common/io/MultiReader.java
@@ -14,12 +14,14 @@
 
 package com.google.common.io;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Preconditions;
 import java.io.IOException;
 import java.io.Reader;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link Reader} that concatenates multiple readers.
@@ -28,9 +30,10 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 class MultiReader extends Reader {
   private final Iterator<? extends CharSource> it;
-  @NullableDecl private Reader current;
+  @CheckForNull private Reader current;
 
   MultiReader(Iterator<? extends CharSource> readers) throws IOException {
     this.it = readers;
@@ -46,7 +49,8 @@
   }
 
   @Override
-  public int read(@NullableDecl char[] cbuf, int off, int len) throws IOException {
+  public int read(char[] cbuf, int off, int len) throws IOException {
+    checkNotNull(cbuf);
     if (current == null) {
       return -1;
     }
diff --git a/android/guava/src/com/google/common/io/ParametricNullness.java b/android/guava/src/com/google/common/io/ParametricNullness.java
new file mode 100644
index 0000000..afa0db1
--- /dev/null
+++ b/android/guava/src/com/google/common/io/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.io;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/io/PatternFilenameFilter.java b/android/guava/src/com/google/common/io/PatternFilenameFilter.java
index 43e4f30..3cb2371 100644
--- a/android/guava/src/com/google/common/io/PatternFilenameFilter.java
+++ b/android/guava/src/com/google/common/io/PatternFilenameFilter.java
@@ -21,7 +21,6 @@
 import java.io.FilenameFilter;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * File name filter that only accepts files matching a regular expression. This class is thread-safe
@@ -32,6 +31,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class PatternFilenameFilter implements FilenameFilter {
 
   private final Pattern pattern;
@@ -55,8 +55,21 @@
     this.pattern = Preconditions.checkNotNull(pattern);
   }
 
+  /*
+   * Our implementation works fine with a null `dir`. However, there's nothing in the documentation
+   * of the supertype that suggests that implementations are expected to tolerate null. That said, I
+   * see calls in Google code that pass a null `dir` to a FilenameFilter.... So let's declare the
+   * parameter as non-nullable (since passing null to a FilenameFilter is unsafe in general), but if
+   * someone still manages to pass null, let's continue to have the method work.
+   *
+   * (PatternFilenameFilter is of course one of those classes that shouldn't be a publicly visible
+   * class to begin with but rather something returned from a static factory method whose declared
+   * return type is plain FilenameFilter. If we made such a change, then the annotation we choose
+   * here would have no significance to end users, who would be forced to conform to the signature
+   * used in FilenameFilter.)
+   */
   @Override
-  public boolean accept(@NullableDecl File dir, String fileName) {
+  public boolean accept(File dir, String fileName) {
     return pattern.matcher(fileName).matches();
   }
 }
diff --git a/android/guava/src/com/google/common/io/ReaderInputStream.java b/android/guava/src/com/google/common/io/ReaderInputStream.java
index eeb64e4..75f8a3e 100644
--- a/android/guava/src/com/google/common/io/ReaderInputStream.java
+++ b/android/guava/src/com/google/common/io/ReaderInputStream.java
@@ -44,6 +44,7 @@
  * @author Chris Nokleberg
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class ReaderInputStream extends InputStream {
   private final Reader reader;
   private final CharsetEncoder encoder;
diff --git a/android/guava/src/com/google/common/io/Resources.java b/android/guava/src/com/google/common/io/Resources.java
index d64bf3d..cc595fc 100644
--- a/android/guava/src/com/google/common/io/Resources.java
+++ b/android/guava/src/com/google/common/io/Resources.java
@@ -29,6 +29,7 @@
 import java.net.URL;
 import java.nio.charset.Charset;
 import java.util.List;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides utility methods for working with resources in the classpath. Note that even though these
@@ -44,6 +45,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Resources {
   private Resources() {}
 
@@ -121,8 +123,9 @@
    * @throws IOException if an I/O error occurs
    */
   @CanIgnoreReturnValue // some processors won't return a useful result
-  public static <T> T readLines(URL url, Charset charset, LineProcessor<T> callback)
-      throws IOException {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T readLines(
+      URL url, Charset charset, LineProcessor<T> callback) throws IOException {
     return asCharSource(url, charset).readLines(callback);
   }
 
diff --git a/android/guava/src/com/google/common/math/BigDecimalMath.java b/android/guava/src/com/google/common/math/BigDecimalMath.java
index b5c23f8..33a55d3 100644
--- a/android/guava/src/com/google/common/math/BigDecimalMath.java
+++ b/android/guava/src/com/google/common/math/BigDecimalMath.java
@@ -25,6 +25,7 @@
  * @since 30.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public class BigDecimalMath {
   private BigDecimalMath() {}
 
diff --git a/android/guava/src/com/google/common/math/BigIntegerMath.java b/android/guava/src/com/google/common/math/BigIntegerMath.java
index bf443e9..6ef1e81 100644
--- a/android/guava/src/com/google/common/math/BigIntegerMath.java
+++ b/android/guava/src/com/google/common/math/BigIntegerMath.java
@@ -48,6 +48,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class BigIntegerMath {
   /**
    * Returns the smallest power of two greater than or equal to {@code x}. This is equivalent to
diff --git a/android/guava/src/com/google/common/math/DoubleMath.java b/android/guava/src/com/google/common/math/DoubleMath.java
index 8745e41..cdd0a4b 100644
--- a/android/guava/src/com/google/common/math/DoubleMath.java
+++ b/android/guava/src/com/google/common/math/DoubleMath.java
@@ -46,6 +46,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class DoubleMath {
   /*
    * This method returns a value y such that rounding y DOWN (towards zero) gives the same result as
@@ -432,7 +433,7 @@
   @Deprecated
   public static double mean(int... values) {
     checkArgument(values.length > 0, "Cannot take mean of 0 values");
-    // The upper bound on the the length of an array and the bounds on the int values mean that, in
+    // The upper bound on the length of an array and the bounds on the int values mean that, in
     // this case only, we can compute the sum as a long without risking overflow or loss of
     // precision. So we do that, as it's slightly quicker than the Knuth algorithm.
     long sum = 0;
diff --git a/android/guava/src/com/google/common/math/DoubleUtils.java b/android/guava/src/com/google/common/math/DoubleUtils.java
index 4183195..d4a07e9 100644
--- a/android/guava/src/com/google/common/math/DoubleUtils.java
+++ b/android/guava/src/com/google/common/math/DoubleUtils.java
@@ -33,6 +33,7 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class DoubleUtils {
   private DoubleUtils() {}
 
diff --git a/android/guava/src/com/google/common/math/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/math/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..84999ea
--- /dev/null
+++ b/android/guava/src/com/google/common/math/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.math;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/math/IntMath.java b/android/guava/src/com/google/common/math/IntMath.java
index 78aedda..17a18c6 100644
--- a/android/guava/src/com/google/common/math/IntMath.java
+++ b/android/guava/src/com/google/common/math/IntMath.java
@@ -48,6 +48,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class IntMath {
   // NOTE: Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
 
diff --git a/android/guava/src/com/google/common/math/LinearTransformation.java b/android/guava/src/com/google/common/math/LinearTransformation.java
index 485b046..4cc1eb8 100644
--- a/android/guava/src/com/google/common/math/LinearTransformation.java
+++ b/android/guava/src/com/google/common/math/LinearTransformation.java
@@ -21,6 +21,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.concurrent.LazyInit;
+import javax.annotation.CheckForNull;
 
 /**
  * The representation of a linear transformation between real numbers {@code x} and {@code y}.
@@ -35,6 +36,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class LinearTransformation {
 
   /**
@@ -161,7 +163,7 @@
     final double slope;
     final double yIntercept;
 
-    @LazyInit LinearTransformation inverse;
+    @CheckForNull @LazyInit LinearTransformation inverse;
 
     RegularLinearTransformation(double slope, double yIntercept) {
       this.slope = slope;
@@ -219,7 +221,7 @@
 
     final double x;
 
-    @LazyInit LinearTransformation inverse;
+    @CheckForNull @LazyInit LinearTransformation inverse;
 
     VerticalLinearTransformation(double x) {
       this.x = x;
diff --git a/android/guava/src/com/google/common/math/LongMath.java b/android/guava/src/com/google/common/math/LongMath.java
index 420b48a..1e67812 100644
--- a/android/guava/src/com/google/common/math/LongMath.java
+++ b/android/guava/src/com/google/common/math/LongMath.java
@@ -49,6 +49,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class LongMath {
   // NOTE: Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
 
diff --git a/android/guava/src/com/google/common/math/MathPreconditions.java b/android/guava/src/com/google/common/math/MathPreconditions.java
index 5f925d3..37d608a 100644
--- a/android/guava/src/com/google/common/math/MathPreconditions.java
+++ b/android/guava/src/com/google/common/math/MathPreconditions.java
@@ -18,7 +18,6 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.math.BigInteger;
 import java.math.RoundingMode;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
 
 /**
  * A collection of preconditions for math functions.
@@ -27,50 +26,51 @@
  */
 @GwtCompatible
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 final class MathPreconditions {
-  static int checkPositive(@NullableDecl String role, int x) {
+  static int checkPositive(String role, int x) {
     if (x <= 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be > 0");
     }
     return x;
   }
 
-  static long checkPositive(@NullableDecl String role, long x) {
+  static long checkPositive(String role, long x) {
     if (x <= 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be > 0");
     }
     return x;
   }
 
-  static BigInteger checkPositive(@NullableDecl String role, BigInteger x) {
+  static BigInteger checkPositive(String role, BigInteger x) {
     if (x.signum() <= 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be > 0");
     }
     return x;
   }
 
-  static int checkNonNegative(@NullableDecl String role, int x) {
+  static int checkNonNegative(String role, int x) {
     if (x < 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be >= 0");
     }
     return x;
   }
 
-  static long checkNonNegative(@NullableDecl String role, long x) {
+  static long checkNonNegative(String role, long x) {
     if (x < 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be >= 0");
     }
     return x;
   }
 
-  static BigInteger checkNonNegative(@NullableDecl String role, BigInteger x) {
+  static BigInteger checkNonNegative(String role, BigInteger x) {
     if (x.signum() < 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be >= 0");
     }
     return x;
   }
 
-  static double checkNonNegative(@NullableDecl String role, double x) {
+  static double checkNonNegative(String role, double x) {
     if (!(x >= 0)) { // not x < 0, to work with NaN.
       throw new IllegalArgumentException(role + " (" + x + ") must be >= 0");
     }
diff --git a/android/guava/src/com/google/common/math/PairedStats.java b/android/guava/src/com/google/common/math/PairedStats.java
index a636e51..31ab9b7 100644
--- a/android/guava/src/com/google/common/math/PairedStats.java
+++ b/android/guava/src/com/google/common/math/PairedStats.java
@@ -28,7 +28,7 @@
 import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable value object capturing some basic statistics about a collection of paired double
@@ -39,6 +39,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class PairedStats implements Serializable {
 
   private final Stats xStats;
@@ -213,7 +214,7 @@
    * guarantees {@code strictfp}-like semantics.)
    */
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == null) {
       return false;
     }
diff --git a/android/guava/src/com/google/common/math/PairedStatsAccumulator.java b/android/guava/src/com/google/common/math/PairedStatsAccumulator.java
index a988495..072ef13 100644
--- a/android/guava/src/com/google/common/math/PairedStatsAccumulator.java
+++ b/android/guava/src/com/google/common/math/PairedStatsAccumulator.java
@@ -32,6 +32,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class PairedStatsAccumulator {
 
   // These fields must satisfy the requirements of PairedStats' constructor as well as those of the
diff --git a/android/guava/src/com/google/common/math/ParametricNullness.java b/android/guava/src/com/google/common/math/ParametricNullness.java
new file mode 100644
index 0000000..c079b97
--- /dev/null
+++ b/android/guava/src/com/google/common/math/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.math;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/math/Quantiles.java b/android/guava/src/com/google/common/math/Quantiles.java
index 7aac58f..6ddea9b 100644
--- a/android/guava/src/com/google/common/math/Quantiles.java
+++ b/android/guava/src/com/google/common/math/Quantiles.java
@@ -128,6 +128,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Quantiles {
 
   /** Specifies the computation of a median (i.e. the 1st 2-quantile). */
diff --git a/android/guava/src/com/google/common/math/Stats.java b/android/guava/src/com/google/common/math/Stats.java
index 9493938..c083749 100644
--- a/android/guava/src/com/google/common/math/Stats.java
+++ b/android/guava/src/com/google/common/math/Stats.java
@@ -32,7 +32,7 @@
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A bundle of statistical summary values -- sum, count, mean/average, min and max, and several
@@ -60,6 +60,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Stats implements Serializable {
 
   private final long count;
@@ -340,7 +341,7 @@
    * {@code strictfp}-like semantics.)
    */
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == null) {
       return false;
     }
diff --git a/android/guava/src/com/google/common/math/StatsAccumulator.java b/android/guava/src/com/google/common/math/StatsAccumulator.java
index 54468cf..f7d7a62 100644
--- a/android/guava/src/com/google/common/math/StatsAccumulator.java
+++ b/android/guava/src/com/google/common/math/StatsAccumulator.java
@@ -34,6 +34,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class StatsAccumulator {
 
   // These fields must satisfy the requirements of Stats' constructor as well as those of the stat
diff --git a/android/guava/src/com/google/common/math/ToDoubleRounder.java b/android/guava/src/com/google/common/math/ToDoubleRounder.java
index 7525e3f..2e7e7fa 100644
--- a/android/guava/src/com/google/common/math/ToDoubleRounder.java
+++ b/android/guava/src/com/google/common/math/ToDoubleRounder.java
@@ -25,6 +25,7 @@
  * a {@link RoundingMode}.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class ToDoubleRounder<X extends Number & Comparable<X>> {
   /**
    * Returns x rounded to either the greatest double less than or equal to the precise value of x,
diff --git a/android/guava/src/com/google/common/net/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/net/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..d8cfd73
--- /dev/null
+++ b/android/guava/src/com/google/common/net/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.net;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/net/HostAndPort.java b/android/guava/src/com/google/common/net/HostAndPort.java
index df8ded4..19e6b67 100644
--- a/android/guava/src/com/google/common/net/HostAndPort.java
+++ b/android/guava/src/com/google/common/net/HostAndPort.java
@@ -20,11 +20,12 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.base.CharMatcher;
 import com.google.common.base.Objects;
 import com.google.common.base.Strings;
 import com.google.errorprone.annotations.Immutable;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable representation of a host and port.
@@ -62,6 +63,7 @@
 @Beta
 @Immutable
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class HostAndPort implements Serializable {
   /** Magic value indicating the absence of a port number. */
   private static final int NO_PORT = -1;
@@ -189,7 +191,10 @@
     if (!Strings.isNullOrEmpty(portString)) {
       // Try to parse the whole port string as a number.
       // JDK7 accepts leading plus signs. We don't want to.
-      checkArgument(!portString.startsWith("+"), "Unparseable port number: %s", hostPortString);
+      checkArgument(
+          !portString.startsWith("+") && CharMatcher.ascii().matchesAllOf(portString),
+          "Unparseable port number: %s",
+          hostPortString);
       try {
         port = Integer.parseInt(portString);
       } catch (NumberFormatException e) {
@@ -209,14 +214,12 @@
    * @throws IllegalArgumentException if parsing the bracketed host-port string fails.
    */
   private static String[] getHostAndPortFromBracketedHost(String hostPortString) {
-    int colonIndex = 0;
-    int closeBracketIndex = 0;
     checkArgument(
         hostPortString.charAt(0) == '[',
         "Bracketed host-port string must start with a bracket: %s",
         hostPortString);
-    colonIndex = hostPortString.indexOf(':');
-    closeBracketIndex = hostPortString.lastIndexOf(']');
+    int colonIndex = hostPortString.indexOf(':');
+    int closeBracketIndex = hostPortString.lastIndexOf(']');
     checkArgument(
         colonIndex > -1 && closeBracketIndex > colonIndex,
         "Invalid bracketed host/port: %s",
@@ -277,7 +280,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object other) {
+  public boolean equals(@CheckForNull Object other) {
     if (this == other) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/net/HostSpecifier.java b/android/guava/src/com/google/common/net/HostSpecifier.java
index 3f6f569..7448944 100644
--- a/android/guava/src/com/google/common/net/HostSpecifier.java
+++ b/android/guava/src/com/google/common/net/HostSpecifier.java
@@ -19,7 +19,7 @@
 import com.google.common.base.Preconditions;
 import java.net.InetAddress;
 import java.text.ParseException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A syntactically valid host specifier, suitable for use in a URI. This may be either a numeric IP
@@ -43,6 +43,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class HostSpecifier {
 
   private final String canonicalForm;
@@ -137,7 +138,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object other) {
+  public boolean equals(@CheckForNull Object other) {
     if (this == other) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/net/HttpHeaders.java b/android/guava/src/com/google/common/net/HttpHeaders.java
index 11a5b50..f318da1 100644
--- a/android/guava/src/com/google/common/net/HttpHeaders.java
+++ b/android/guava/src/com/google/common/net/HttpHeaders.java
@@ -28,11 +28,11 @@
  *   <li><a href="http://www.ietf.org/rfc/rfc5988.txt">RFC 5988</a>
  * </ul>
  *
- *
  * @author Kurt Alfred Kluever
  * @since 11.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class HttpHeaders {
   private HttpHeaders() {}
 
@@ -129,6 +129,13 @@
   public static final String MAX_FORWARDS = "Max-Forwards";
   /** The HTTP {@code Origin} header field name. */
   public static final String ORIGIN = "Origin";
+  /**
+   * The HTTP <a href="https://github.com/WICG/origin-isolation">{@code Origin-Isolation}</a> header
+   * field name.
+   *
+   * @since 30.1
+   */
+  public static final String ORIGIN_ISOLATION = "Origin-Isolation";
   /** The HTTP {@code Proxy-Authorization} header field name. */
   public static final String PROXY_AUTHORIZATION = "Proxy-Authorization";
   /** The HTTP {@code Range} header field name. */
@@ -298,6 +305,12 @@
   /** The HTTP {@code Location} header field name. */
   public static final String LOCATION = "Location";
   /**
+   * The HTTP {@code Keep-Alive} header field name.
+   *
+   * @since 31.0
+   */
+  public static final String KEEP_ALIVE = "Keep-Alive";
+  /**
    * The HTTP <a href="https://googlechrome.github.io/OriginTrials/#header">{@code Origin-Trial}</a>
    * header field name.
    *
@@ -375,6 +388,45 @@
   public static final String DNT = "DNT";
   /** The HTTP {@code X-Content-Type-Options} header field name. */
   public static final String X_CONTENT_TYPE_OPTIONS = "X-Content-Type-Options";
+  /**
+   * The HTTP <a
+   * href="https://iabtechlab.com/wp-content/uploads/2019/06/VAST_4.2_final_june26.pdf">{@code
+   * X-Device-IP}</a> header field name. Header used for VAST requests to provide the IP address of
+   * the device on whose behalf the request is being made.
+   *
+   * @since 31.0
+   */
+  public static final String X_DEVICE_IP = "X-Device-IP";
+  /**
+   * The HTTP <a
+   * href="https://iabtechlab.com/wp-content/uploads/2019/06/VAST_4.2_final_june26.pdf">{@code
+   * X-Device-Referer}</a> header field name. Header used for VAST requests to provide the {@link
+   * #REFERER} header value that the on-behalf-of client would have used when making a request
+   * itself.
+   *
+   * @since 31.0
+   */
+  public static final String X_DEVICE_REFERER = "X-Device-Referer";
+  /**
+   * The HTTP <a
+   * href="https://iabtechlab.com/wp-content/uploads/2019/06/VAST_4.2_final_june26.pdf">{@code
+   * X-Device-Accept-Language}</a> header field name. Header used for VAST requests to provide the
+   * {@link #ACCEPT_LANGUAGE} header value that the on-behalf-of client would have used when making
+   * a request itself.
+   *
+   * @since 31.0
+   */
+  public static final String X_DEVICE_ACCEPT_LANGUAGE = "X-Device-Accept-Language";
+  /**
+   * The HTTP <a
+   * href="https://iabtechlab.com/wp-content/uploads/2019/06/VAST_4.2_final_june26.pdf">{@code
+   * X-Device-Requested-With}</a> header field name. Header used for VAST requests to provide the
+   * {@link #X_REQUESTED_WITH} header value that the on-behalf-of client would have used when making
+   * a request itself.
+   *
+   * @since 31.0
+   */
+  public static final String X_DEVICE_REQUESTED_WITH = "X-Device-Requested-With";
   /** The HTTP {@code X-Do-Not-Track} header field name. */
   public static final String X_DO_NOT_TRACK = "X-Do-Not-Track";
   /** The HTTP {@code X-Forwarded-For} header field name (superseded by {@code Forwarded}). */
@@ -411,6 +463,12 @@
    * @since 15.0
    */
   @Beta public static final String PUBLIC_KEY_PINS_REPORT_ONLY = "Public-Key-Pins-Report-Only";
+  /**
+   * The HTTP {@code X-Request-ID} header field name.
+   *
+   * @since 30.1
+   */
+  public static final String X_REQUEST_ID = "X-Request-ID";
   /** The HTTP {@code X-Requested-With} header field name. */
   public static final String X_REQUESTED_WITH = "X-Requested-With";
   /** The HTTP {@code X-User-IP} header field name. */
@@ -475,6 +533,100 @@
   public static final String X_MOZ = "X-Moz";
 
   /**
+   * The HTTP <a
+   * href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Device-Memory">{@code
+   * Device-Memory}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String DEVICE_MEMORY = "Device-Memory";
+
+  /**
+   * The HTTP <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Downlink">{@code
+   * Downlink}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String DOWNLINK = "Downlink";
+
+  /**
+   * The HTTP <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ECT">{@code
+   * ECT}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String ECT = "ECT";
+
+  /**
+   * The HTTP <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/RTT">{@code
+   * RTT}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String RTT = "RTT";
+
+  /**
+   * The HTTP <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Save-Data">{@code
+   * Save-Data}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String SAVE_DATA = "Save-Data";
+
+  /**
+   * The HTTP <a
+   * href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Viewport-Width">{@code
+   * Viewport-Width}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String VIEWPORT_WIDTH = "Viewport-Width";
+
+  /**
+   * The HTTP <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Width">{@code
+   * Width}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String WIDTH = "Width";
+
+  /**
+   * The HTTP <a href="https://www.w3.org/TR/permissions-policy-1/">{@code Permissions-Policy}</a>
+   * header field name.
+   *
+   * @since 31.0
+   */
+  public static final String PERMISSIONS_POLICY = "Permissions-Policy";
+
+  /**
+   * The HTTP <a
+   * href="https://wicg.github.io/user-preference-media-features-headers/#sec-ch-prefers-color-scheme">{@code
+   * Sec-CH-Prefers-Color-Scheme}</a> header field name.
+   *
+   * <p>This header is experimental.
+   *
+   * @since 31.0
+   */
+  public static final String SEC_CH_PREFERS_COLOR_SCHEME = "Sec-CH-Prefers-Color-Scheme";
+
+  /**
+   * The HTTP <a
+   * href="https://www.rfc-editor.org/rfc/rfc8942#name-the-accept-ch-response-head">{@code
+   * Accept-CH}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String ACCEPT_CH = "Accept-CH";
+  /**
+   * The HTTP <a
+   * href="https://datatracker.ietf.org/doc/html/draft-davidben-http-client-hint-reliability-03.txt#section-3">{@code
+   * Critical-CH}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String CRITICAL_CH = "Critical-CH";
+
+  /**
    * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua">{@code Sec-CH-UA}</a>
    * header field name.
    *
@@ -482,47 +634,54 @@
    */
   public static final String SEC_CH_UA = "Sec-CH-UA";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-arch">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-arch">{@code
    * Sec-CH-UA-Arch}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_ARCH = "Sec-CH-UA-Arch";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-model">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-model">{@code
    * Sec-CH-UA-Model}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_MODEL = "Sec-CH-UA-Model";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-platform">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-platform">{@code
    * Sec-CH-UA-Platform}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_PLATFORM = "Sec-CH-UA-Platform";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-platform-version">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-platform-version">{@code
    * Sec-CH-UA-Platform-Version}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_PLATFORM_VERSION = "Sec-CH-UA-Platform-Version";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-full-version">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-full-version">{@code
    * Sec-CH-UA-Full-Version}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_FULL_VERSION = "Sec-CH-UA-Full-Version";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-mobile">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-mobile">{@code
    * Sec-CH-UA-Mobile}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_MOBILE = "Sec-CH-UA-Mobile";
+  /**
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-bitness">{@code
+   * Sec-CH-UA-Bitness}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String SEC_CH_UA_BITNESS = "Sec-CH-UA-Bitness";
 
   /**
    * The HTTP <a href="https://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Fetch-Dest}</a>
diff --git a/android/guava/src/com/google/common/net/InetAddresses.java b/android/guava/src/com/google/common/net/InetAddresses.java
index a4a16e2..4e2aa69 100644
--- a/android/guava/src/com/google/common/net/InetAddresses.java
+++ b/android/guava/src/com/google/common/net/InetAddresses.java
@@ -32,7 +32,7 @@
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.Locale;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@link InetAddress} instances.
@@ -97,6 +97,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class InetAddresses {
   private static final int IPV4_PART_COUNT = 4;
   private static final int IPV6_PART_COUNT = 8;
@@ -133,6 +134,11 @@
    *
    * <p>Anything after a {@code %} in an IPv6 address is ignored (assumed to be a Scope ID).
    *
+   * <p>This method accepts non-ASCII digits, for example {@code "192.168.0.1"} (those are fullwidth
+   * characters). That is consistent with {@link InetAddress}, but not with various RFCs. If you
+   * want to accept ASCII digits only, you can use something like {@code
+   * CharMatcher.ascii().matchesAllOf(ipString)}.
+   *
    * @param ipString {@code String} containing an IPv4 or IPv6 string literal, e.g. {@code
    *     "192.168.0.1"} or {@code "2001:db8::1"}
    * @return {@link InetAddress} representing the argument
@@ -153,6 +159,11 @@
    * Returns {@code true} if the supplied string is a valid IP string literal, {@code false}
    * otherwise.
    *
+   * <p>This method accepts non-ASCII digits, for example {@code "192.168.0.1"} (those are fullwidth
+   * characters). That is consistent with {@link InetAddress}, but not with various RFCs. If you
+   * want to accept ASCII digits only, you can use something like {@code
+   * CharMatcher.ascii().matchesAllOf(ipString)}.
+   *
    * @param ipString {@code String} to evaluated as an IP string literal
    * @return {@code true} if the argument is a valid IP string literal
    */
@@ -161,8 +172,9 @@
   }
 
   /** Returns {@code null} if unable to parse into a {@code byte[]}. */
-  @NullableDecl
-  private static byte[] ipStringToBytes(String ipString) {
+  @CheckForNull
+  private static byte[] ipStringToBytes(String ipStringParam) {
+    String ipString = ipStringParam;
     // Make a first pass to categorize the characters in this string.
     boolean hasColon = false;
     boolean hasDot = false;
@@ -205,7 +217,7 @@
     return null;
   }
 
-  @NullableDecl
+  @CheckForNull
   private static byte[] textToNumericFormatV4(String ipString) {
     if (IPV4_DELIMITER_MATCHER.countIn(ipString) + 1 != IPV4_PART_COUNT) {
       return null; // Wrong number of parts
@@ -231,7 +243,7 @@
     return bytes;
   }
 
-  @NullableDecl
+  @CheckForNull
   private static byte[] textToNumericFormatV6(String ipString) {
     // An address can have [2..8] colons.
     int delimiterCount = IPV6_DELIMITER_MATCHER.countIn(ipString);
@@ -302,7 +314,7 @@
     return rawBytes.array();
   }
 
-  @NullableDecl
+  @CheckForNull
   private static String convertDottedQuadToHex(String ipString) {
     int lastColon = ipString.lastIndexOf(':');
     String initialPart = ipString.substring(0, lastColon + 1);
@@ -500,10 +512,15 @@
    * Returns an InetAddress representing the literal IPv4 or IPv6 host portion of a URL, encoded in
    * the format specified by RFC 3986 section 3.2.2.
    *
-   * <p>This function is similar to {@link InetAddresses#forString(String)}, however, it requires
-   * that IPv6 addresses are surrounded by square brackets.
+   * <p>This method is similar to {@link InetAddresses#forString(String)}, however, it requires that
+   * IPv6 addresses are surrounded by square brackets.
    *
-   * <p>This function is the inverse of {@link InetAddresses#toUriString(java.net.InetAddress)}.
+   * <p>This method is the inverse of {@link InetAddresses#toUriString(java.net.InetAddress)}.
+   *
+   * <p>This method accepts non-ASCII digits, for example {@code "192.168.0.1"} (those are fullwidth
+   * characters). That is consistent with {@link InetAddress}, but not with various RFCs. If you
+   * want to accept ASCII digits only, you can use something like {@code
+   * CharMatcher.ascii().matchesAllOf(ipString)}.
    *
    * @param hostAddr A RFC 3986 section 3.2.2 encoded IPv4 or IPv6 address
    * @return an InetAddress representing the address in {@code hostAddr}
@@ -519,7 +536,7 @@
     return addr;
   }
 
-  @NullableDecl
+  @CheckForNull
   private static InetAddress forUriStringNoThrow(String hostAddr) {
     checkNotNull(hostAddr);
 
@@ -547,6 +564,11 @@
    * Returns {@code true} if the supplied string is a valid URI IP string literal, {@code false}
    * otherwise.
    *
+   * <p>This method accepts non-ASCII digits, for example {@code "192.168.0.1"} (those are fullwidth
+   * characters). That is consistent with {@link InetAddress}, but not with various RFCs. If you
+   * want to accept ASCII digits only, you can use something like {@code
+   * CharMatcher.ascii().matchesAllOf(ipString)}.
+   *
    * @param ipString {@code String} to evaluated as an IP URI host string literal
    * @return {@code true} if the argument is a valid IP URI host
    */
@@ -663,7 +685,7 @@
      */
     // TODO: why is this public?
     public TeredoInfo(
-        @NullableDecl Inet4Address server, @NullableDecl Inet4Address client, int port, int flags) {
+        @CheckForNull Inet4Address server, @CheckForNull Inet4Address client, int port, int flags) {
       checkArgument(
           (port >= 0) && (port <= 0xffff), "port '%s' is out of range (0 <= port <= 0xffff)", port);
       checkArgument(
@@ -842,6 +864,10 @@
    * obscure {@link Inet6Address} methods, but it would be unwise to depend on such a
    * poorly-documented feature.)
    *
+   * <p>This method accepts non-ASCII digits. That is consistent with {@link InetAddress}, but not
+   * with various RFCs. If you want to accept ASCII digits only, you can use something like {@code
+   * CharMatcher.ascii().matchesAllOf(ipString)}.
+   *
    * @param ipString {@code String} to be examined for embedded IPv4-mapped IPv6 address format
    * @return {@code true} if the argument is a valid "mapped" address
    * @since 10.0
@@ -869,7 +895,7 @@
    *
    * <p>HACK: As long as applications continue to use IPv4 addresses for indexing into tables,
    * accounting, et cetera, it may be necessary to <b>coerce</b> IPv6 addresses into IPv4 addresses.
-   * This function does so by hashing 64 bits of the IPv6 address into {@code 224.0.0.0/3} (64 bits
+   * This method does so by hashing 64 bits of the IPv6 address into {@code 224.0.0.0/3} (64 bits
    * into 29 bits):
    *
    * <ul>
@@ -879,7 +905,7 @@
    *
    * <p>A "coerced" IPv4 address is equivalent to itself.
    *
-   * <p>NOTE: This function is failsafe for security purposes: ALL IPv6 addresses (except localhost
+   * <p>NOTE: This method is failsafe for security purposes: ALL IPv6 addresses (except localhost
    * (::1)) are hashed to avoid the security risk associated with extracting an embedded IPv4
    * address that might permit elevated privileges.
    *
@@ -917,7 +943,7 @@
     }
 
     // Many strategies for hashing are possible. This might suffice for now.
-    int coercedHash = Hashing.murmur3_32().hashLong(addressAsLong).asInt();
+    int coercedHash = Hashing.murmur3_32_fixed().hashLong(addressAsLong).asInt();
 
     // Squash into 224/4 Multicast and 240/4 Reserved space (i.e. 224/3).
     coercedHash |= 0xe0000000;
@@ -1115,8 +1141,8 @@
    */
   public static boolean isMaximum(InetAddress address) {
     byte[] addr = address.getAddress();
-    for (int i = 0; i < addr.length; i++) {
-      if (addr[i] != (byte) 0xff) {
+    for (byte b : addr) {
+      if (b != (byte) 0xff) {
         return false;
       }
     }
diff --git a/android/guava/src/com/google/common/net/InternetDomainName.java b/android/guava/src/com/google/common/net/InternetDomainName.java
index cc7a36d..5873449 100644
--- a/android/guava/src/com/google/common/net/InternetDomainName.java
+++ b/android/guava/src/com/google/common/net/InternetDomainName.java
@@ -30,7 +30,7 @@
 import com.google.thirdparty.publicsuffix.PublicSuffixPatterns;
 import com.google.thirdparty.publicsuffix.PublicSuffixType;
 import java.util.List;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable well-formed internet domain name, such as {@code com} or {@code foo.co.uk}. Only
@@ -74,6 +74,7 @@
 @Beta
 @GwtCompatible(emulated = true)
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class InternetDomainName {
 
   private static final CharMatcher DOTS_MATCHER = CharMatcher.anyOf(".\u3002\uFF0E\uFF61");
@@ -200,7 +201,6 @@
    *       href="https://tools.ietf.org/html/rfc1123#section-2">RFC 1123</a>.
    * </ul>
    *
-   *
    * @param domain A domain name (not IP address)
    * @throws IllegalArgumentException if {@code domain} is not syntactically valid according to
    *     {@link #isValid}
@@ -354,6 +354,7 @@
    *
    * @since 6.0
    */
+  @CheckForNull
   public InternetDomainName publicSuffix() {
     return hasPublicSuffix() ? ancestor(publicSuffixIndex) : null;
   }
@@ -462,6 +463,7 @@
    *
    * @since 23.3
    */
+  @CheckForNull
   public InternetDomainName registrySuffix() {
     return hasRegistrySuffix() ? ancestor(registrySuffixIndex) : null;
   }
@@ -622,7 +624,7 @@
    * version of the same domain name would not be considered equal.
    */
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/net/MediaType.java b/android/guava/src/com/google/common/net/MediaType.java
index a5b710f..ca47161 100644
--- a/android/guava/src/com/google/common/net/MediaType.java
+++ b/android/guava/src/com/google/common/net/MediaType.java
@@ -45,7 +45,7 @@
 import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Represents an <a href="http://en.wikipedia.org/wiki/Internet_media_type">Internet Media Type</a>
@@ -75,6 +75,7 @@
 @Beta
 @GwtCompatible
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class MediaType {
   private static final String CHARSET_ATTRIBUTE = "charset";
   private static final ImmutableListMultimap<String, String> UTF_8_CONSTANT_PARAMETERS =
@@ -763,11 +764,11 @@
   private final String subtype;
   private final ImmutableListMultimap<String, String> parameters;
 
-  @LazyInit private String toString;
+  @LazyInit @CheckForNull private String toString;
 
   @LazyInit private int hashCode;
 
-  @LazyInit private Optional<Charset> parsedCharset;
+  @LazyInit @CheckForNull private Optional<Charset> parsedCharset;
 
   private MediaType(String type, String subtype, ImmutableListMultimap<String, String> parameters) {
     this.type = type;
@@ -1135,7 +1136,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     } else if (obj instanceof MediaType) {
diff --git a/android/guava/src/com/google/common/net/ParametricNullness.java b/android/guava/src/com/google/common/net/ParametricNullness.java
new file mode 100644
index 0000000..acc3eab
--- /dev/null
+++ b/android/guava/src/com/google/common/net/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.net;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/net/PercentEscaper.java b/android/guava/src/com/google/common/net/PercentEscaper.java
index 554d04d..7c7de9b 100644
--- a/android/guava/src/com/google/common/net/PercentEscaper.java
+++ b/android/guava/src/com/google/common/net/PercentEscaper.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.escape.UnicodeEscaper;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@code UnicodeEscaper} that escapes some set of Java characters using a UTF-8 based percent
@@ -51,6 +52,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class PercentEscaper extends UnicodeEscaper {
 
   // In some escapers spaces are escaped to '+'
@@ -155,6 +157,7 @@
 
   /** Escapes the given Unicode code point in UTF-8. */
   @Override
+  @CheckForNull
   protected char[] escape(int cp) {
     // We should never get negative values here but if we do it will throw an
     // IndexOutOfBoundsException, so at least it will get spotted.
diff --git a/android/guava/src/com/google/common/net/UrlEscapers.java b/android/guava/src/com/google/common/net/UrlEscapers.java
index d4b9f94..c7e15ef 100644
--- a/android/guava/src/com/google/common/net/UrlEscapers.java
+++ b/android/guava/src/com/google/common/net/UrlEscapers.java
@@ -24,12 +24,12 @@
  * escaping with {@link com.google.common.html.HtmlEscapers} or {@link
  * com.google.common.xml.XmlEscapers}.
  *
- *
  * @author David Beaumont
  * @author Chris Povirk
  * @since 15.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class UrlEscapers {
   private UrlEscapers() {}
 
diff --git a/android/guava/src/com/google/common/primitives/Booleans.java b/android/guava/src/com/google/common/primitives/Booleans.java
index 787766d..522049b 100644
--- a/android/guava/src/com/google/common/primitives/Booleans.java
+++ b/android/guava/src/com/google/common/primitives/Booleans.java
@@ -29,7 +29,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code boolean} primitives, that are not already found in
@@ -42,6 +42,7 @@
  * @since 1.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Booleans {
   private Booleans() {}
 
@@ -408,14 +409,14 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Boolean)
           && Booleans.indexOf(array, (Boolean) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Boolean) {
         int i = Booleans.indexOf(array, (Boolean) target, start, end);
@@ -427,7 +428,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Boolean) {
         int i = Booleans.lastIndexOf(array, (Boolean) target, start, end);
@@ -458,7 +459,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
diff --git a/android/guava/src/com/google/common/primitives/Bytes.java b/android/guava/src/com/google/common/primitives/Bytes.java
index 1071a0e..62997f3 100644
--- a/android/guava/src/com/google/common/primitives/Bytes.java
+++ b/android/guava/src/com/google/common/primitives/Bytes.java
@@ -27,7 +27,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code byte} primitives, that are not already found in
@@ -44,6 +44,7 @@
 // TODO(kevinb): how to prevent warning on UnsignedBytes when building GWT
 // javadoc?
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Bytes {
   private Bytes() {}
 
@@ -270,13 +271,13 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Byte) && Bytes.indexOf(array, (Byte) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Byte) {
         int i = Bytes.indexOf(array, (Byte) target, start, end);
@@ -288,7 +289,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Byte) {
         int i = Bytes.lastIndexOf(array, (Byte) target, start, end);
@@ -319,7 +320,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
diff --git a/android/guava/src/com/google/common/primitives/Chars.java b/android/guava/src/com/google/common/primitives/Chars.java
index 07fc62f..4a2e3a3 100644
--- a/android/guava/src/com/google/common/primitives/Chars.java
+++ b/android/guava/src/com/google/common/primitives/Chars.java
@@ -30,7 +30,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code char} primitives, that are not already found in
@@ -46,6 +46,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Chars {
   private Chars() {}
 
@@ -540,14 +541,14 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Character)
           && Chars.indexOf(array, (Character) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Character) {
         int i = Chars.indexOf(array, (Character) target, start, end);
@@ -559,7 +560,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Character) {
         int i = Chars.lastIndexOf(array, (Character) target, start, end);
@@ -590,7 +591,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
diff --git a/android/guava/src/com/google/common/primitives/Doubles.java b/android/guava/src/com/google/common/primitives/Doubles.java
index a886fe9..ce5df2e 100644
--- a/android/guava/src/com/google/common/primitives/Doubles.java
+++ b/android/guava/src/com/google/common/primitives/Doubles.java
@@ -34,7 +34,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code double} primitives, that are not already found in
@@ -47,6 +47,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Doubles extends DoublesMethodsForWeb {
   private Doubles() {}
 
@@ -553,14 +554,14 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Double)
           && Doubles.indexOf(array, (Double) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Double) {
         int i = Doubles.indexOf(array, (Double) target, start, end);
@@ -572,7 +573,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Double) {
         int i = Doubles.lastIndexOf(array, (Double) target, start, end);
@@ -603,7 +604,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
@@ -702,7 +703,7 @@
    */
   @Beta
   @GwtIncompatible // regular expressions
-  @NullableDecl
+  @CheckForNull
   public static Double tryParse(String string) {
     if (FLOATING_POINT_PATTERN.matcher(string).matches()) {
       // TODO(lowasser): could be potentially optimized, but only with
diff --git a/android/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java b/android/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java
index 04d9651..949cbe0 100644
--- a/android/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java
+++ b/android/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java
@@ -21,4 +21,5 @@
  * version.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class DoublesMethodsForWeb {}
diff --git a/android/guava/src/com/google/common/primitives/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/primitives/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..44f6869
--- /dev/null
+++ b/android/guava/src/com/google/common/primitives/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.primitives;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/primitives/Floats.java b/android/guava/src/com/google/common/primitives/Floats.java
index e379ebd..b038cb2 100644
--- a/android/guava/src/com/google/common/primitives/Floats.java
+++ b/android/guava/src/com/google/common/primitives/Floats.java
@@ -34,7 +34,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code float} primitives, that are not already found in
@@ -47,6 +47,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Floats extends FloatsMethodsForWeb {
   private Floats() {}
 
@@ -547,13 +548,13 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Float) && Floats.indexOf(array, (Float) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Float) {
         int i = Floats.indexOf(array, (Float) target, start, end);
@@ -565,7 +566,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Float) {
         int i = Floats.lastIndexOf(array, (Float) target, start, end);
@@ -596,7 +597,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
@@ -661,7 +662,7 @@
    */
   @Beta
   @GwtIncompatible // regular expressions
-  @NullableDecl
+  @CheckForNull
   public static Float tryParse(String string) {
     if (Doubles.FLOATING_POINT_PATTERN.matcher(string).matches()) {
       // TODO(lowasser): could be potentially optimized, but only with
diff --git a/android/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java b/android/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java
index acdb42f..801e2f3 100644
--- a/android/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java
+++ b/android/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java
@@ -21,4 +21,5 @@
  * version.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class FloatsMethodsForWeb {}
diff --git a/android/guava/src/com/google/common/primitives/ImmutableDoubleArray.java b/android/guava/src/com/google/common/primitives/ImmutableDoubleArray.java
index 63efc45..1627fab 100644
--- a/android/guava/src/com/google/common/primitives/ImmutableDoubleArray.java
+++ b/android/guava/src/com/google/common/primitives/ImmutableDoubleArray.java
@@ -28,7 +28,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable array of {@code double} values, with an API resembling {@link List}.
@@ -80,6 +80,7 @@
 @Beta
 @GwtCompatible
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class ImmutableDoubleArray implements Serializable {
   private static final ImmutableDoubleArray EMPTY = new ImmutableDoubleArray(new double[0]);
 
@@ -437,17 +438,17 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       return indexOf(target) >= 0;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       return target instanceof Double ? parent.indexOf((Double) target) : -1;
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       return target instanceof Double ? parent.lastIndexOf((Double) target) : -1;
     }
 
@@ -457,7 +458,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof AsList) {
         AsList that = (AsList) object;
         return this.parent.equals(that.parent);
@@ -497,7 +498,7 @@
    * values as this one, in the same order. Values are compared as if by {@link Double#equals}.
    */
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/primitives/ImmutableIntArray.java b/android/guava/src/com/google/common/primitives/ImmutableIntArray.java
index 02d9b50..8f972c4 100644
--- a/android/guava/src/com/google/common/primitives/ImmutableIntArray.java
+++ b/android/guava/src/com/google/common/primitives/ImmutableIntArray.java
@@ -28,7 +28,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable array of {@code int} values, with an API resembling {@link List}.
@@ -80,6 +80,7 @@
 @Beta
 @GwtCompatible
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class ImmutableIntArray implements Serializable {
   private static final ImmutableIntArray EMPTY = new ImmutableIntArray(new int[0]);
 
@@ -432,17 +433,17 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       return indexOf(target) >= 0;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       return target instanceof Integer ? parent.indexOf((Integer) target) : -1;
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       return target instanceof Integer ? parent.lastIndexOf((Integer) target) : -1;
     }
 
@@ -452,7 +453,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof AsList) {
         AsList that = (AsList) object;
         return this.parent.equals(that.parent);
@@ -492,7 +493,7 @@
    * values as this one, in the same order.
    */
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/primitives/ImmutableLongArray.java b/android/guava/src/com/google/common/primitives/ImmutableLongArray.java
index ce0e4b6..4ebf5b4 100644
--- a/android/guava/src/com/google/common/primitives/ImmutableLongArray.java
+++ b/android/guava/src/com/google/common/primitives/ImmutableLongArray.java
@@ -28,7 +28,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable array of {@code long} values, with an API resembling {@link List}.
@@ -80,6 +80,7 @@
 @Beta
 @GwtCompatible
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class ImmutableLongArray implements Serializable {
   private static final ImmutableLongArray EMPTY = new ImmutableLongArray(new long[0]);
 
@@ -434,17 +435,17 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       return indexOf(target) >= 0;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       return target instanceof Long ? parent.indexOf((Long) target) : -1;
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       return target instanceof Long ? parent.lastIndexOf((Long) target) : -1;
     }
 
@@ -454,7 +455,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof AsList) {
         AsList that = (AsList) object;
         return this.parent.equals(that.parent);
@@ -494,7 +495,7 @@
    * values as this one, in the same order.
    */
   @Override
-  public boolean equals(@NullableDecl Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/android/guava/src/com/google/common/primitives/Ints.java b/android/guava/src/com/google/common/primitives/Ints.java
index 93b5ba0..e07bdd8 100644
--- a/android/guava/src/com/google/common/primitives/Ints.java
+++ b/android/guava/src/com/google/common/primitives/Ints.java
@@ -31,7 +31,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code int} primitives, that are not already found in either
@@ -44,6 +44,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Ints extends IntsMethodsForWeb {
   private Ints() {}
 
@@ -593,13 +594,13 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Integer) && Ints.indexOf(array, (Integer) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Integer) {
         int i = Ints.indexOf(array, (Integer) target, start, end);
@@ -611,7 +612,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Integer) {
         int i = Ints.lastIndexOf(array, (Integer) target, start, end);
@@ -642,7 +643,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
@@ -706,7 +707,7 @@
    * @since 11.0
    */
   @Beta
-  @NullableDecl
+  @CheckForNull
   public static Integer tryParse(String string) {
     return tryParse(string, 10);
   }
@@ -732,7 +733,7 @@
    * @since 19.0
    */
   @Beta
-  @NullableDecl
+  @CheckForNull
   public static Integer tryParse(String string, int radix) {
     Long result = Longs.tryParse(string, radix);
     if (result == null || result.longValue() != result.intValue()) {
diff --git a/android/guava/src/com/google/common/primitives/IntsMethodsForWeb.java b/android/guava/src/com/google/common/primitives/IntsMethodsForWeb.java
index cb87bd2..c59c6b0 100644
--- a/android/guava/src/com/google/common/primitives/IntsMethodsForWeb.java
+++ b/android/guava/src/com/google/common/primitives/IntsMethodsForWeb.java
@@ -21,4 +21,5 @@
  * version.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class IntsMethodsForWeb {}
diff --git a/android/guava/src/com/google/common/primitives/Longs.java b/android/guava/src/com/google/common/primitives/Longs.java
index 81838ce..6f60656 100644
--- a/android/guava/src/com/google/common/primitives/Longs.java
+++ b/android/guava/src/com/google/common/primitives/Longs.java
@@ -30,7 +30,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code long} primitives, that are not already found in
@@ -43,6 +43,7 @@
  * @since 1.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Longs {
   private Longs() {}
 
@@ -361,7 +362,7 @@
    * @since 14.0
    */
   @Beta
-  @NullableDecl
+  @CheckForNull
   public static Long tryParse(String string) {
     return tryParse(string, 10);
   }
@@ -387,7 +388,7 @@
    * @since 19.0
    */
   @Beta
-  @NullableDecl
+  @CheckForNull
   public static Long tryParse(String string, int radix) {
     if (checkNotNull(string).isEmpty()) {
       return null;
@@ -689,13 +690,13 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Long) && Longs.indexOf(array, (Long) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Long) {
         int i = Longs.indexOf(array, (Long) target, start, end);
@@ -707,7 +708,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Long) {
         int i = Longs.lastIndexOf(array, (Long) target, start, end);
@@ -738,7 +739,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
diff --git a/android/guava/src/com/google/common/primitives/ParametricNullness.java b/android/guava/src/com/google/common/primitives/ParametricNullness.java
new file mode 100644
index 0000000..17d606c
--- /dev/null
+++ b/android/guava/src/com/google/common/primitives/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.primitives;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/primitives/ParseRequest.java b/android/guava/src/com/google/common/primitives/ParseRequest.java
index 97b0f1b..a102d69 100644
--- a/android/guava/src/com/google/common/primitives/ParseRequest.java
+++ b/android/guava/src/com/google/common/primitives/ParseRequest.java
@@ -18,6 +18,7 @@
 
 /** A string to be parsed as a number and the radix to interpret it in. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class ParseRequest {
   final String rawValue;
   final int radix;
diff --git a/android/guava/src/com/google/common/primitives/Platform.java b/android/guava/src/com/google/common/primitives/Platform.java
index 82b902b..83b2485 100644
--- a/android/guava/src/com/google/common/primitives/Platform.java
+++ b/android/guava/src/com/google/common/primitives/Platform.java
@@ -18,6 +18,7 @@
 
 /** Methods factored out so that they can be emulated differently in GWT. */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class Platform {
   static void checkGwtRpcEnabled() {}
 
diff --git a/android/guava/src/com/google/common/primitives/Primitives.java b/android/guava/src/com/google/common/primitives/Primitives.java
index 1bdc740..7ceed03 100644
--- a/android/guava/src/com/google/common/primitives/Primitives.java
+++ b/android/guava/src/com/google/common/primitives/Primitives.java
@@ -30,6 +30,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Primitives {
   private Primitives() {}
 
diff --git a/android/guava/src/com/google/common/primitives/Shorts.java b/android/guava/src/com/google/common/primitives/Shorts.java
index dc58138..09e0f7c 100644
--- a/android/guava/src/com/google/common/primitives/Shorts.java
+++ b/android/guava/src/com/google/common/primitives/Shorts.java
@@ -31,7 +31,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code short} primitives, that are not already found in
@@ -44,6 +44,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Shorts extends ShortsMethodsForWeb {
   private Shorts() {}
 
@@ -592,13 +593,13 @@
     }
 
     @Override
-    public boolean contains(@NullableDecl Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Short) && Shorts.indexOf(array, (Short) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(@NullableDecl Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Short) {
         int i = Shorts.indexOf(array, (Short) target, start, end);
@@ -610,7 +611,7 @@
     }
 
     @Override
-    public int lastIndexOf(@NullableDecl Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Short) {
         int i = Shorts.lastIndexOf(array, (Short) target, start, end);
@@ -641,7 +642,7 @@
     }
 
     @Override
-    public boolean equals(@NullableDecl Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
diff --git a/android/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java b/android/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java
index c362768..bb0ff10 100644
--- a/android/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java
+++ b/android/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java
@@ -21,4 +21,5 @@
  * version.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ShortsMethodsForWeb {}
diff --git a/android/guava/src/com/google/common/primitives/SignedBytes.java b/android/guava/src/com/google/common/primitives/SignedBytes.java
index e475c41..5fabaab 100644
--- a/android/guava/src/com/google/common/primitives/SignedBytes.java
+++ b/android/guava/src/com/google/common/primitives/SignedBytes.java
@@ -36,6 +36,7 @@
 // TODO(kevinb): how to prevent warning on UnsignedBytes when building GWT
 // javadoc?
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class SignedBytes {
   private SignedBytes() {}
 
diff --git a/android/guava/src/com/google/common/primitives/UnsignedBytes.java b/android/guava/src/com/google/common/primitives/UnsignedBytes.java
index 4275f8a..bf9a306 100644
--- a/android/guava/src/com/google/common/primitives/UnsignedBytes.java
+++ b/android/guava/src/com/google/common/primitives/UnsignedBytes.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -43,6 +44,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class UnsignedBytes {
   private UnsignedBytes() {}
 
@@ -437,9 +439,12 @@
       try {
         Class<?> theClass = Class.forName(UNSAFE_COMPARATOR_NAME);
 
+        // requireNonNull is safe because the class is an enum.
+        Object[] constants = requireNonNull(theClass.getEnumConstants());
+
         // yes, UnsafeComparator does implement Comparator<byte[]>
         @SuppressWarnings("unchecked")
-        Comparator<byte[]> comparator = (Comparator<byte[]>) theClass.getEnumConstants()[0];
+        Comparator<byte[]> comparator = (Comparator<byte[]>) constants[0];
         return comparator;
       } catch (Throwable t) { // ensure we really catch *everything*
         return lexicographicalComparatorJavaImpl();
diff --git a/android/guava/src/com/google/common/primitives/UnsignedInteger.java b/android/guava/src/com/google/common/primitives/UnsignedInteger.java
index 74740e9..0b30cef 100644
--- a/android/guava/src/com/google/common/primitives/UnsignedInteger.java
+++ b/android/guava/src/com/google/common/primitives/UnsignedInteger.java
@@ -23,7 +23,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import java.math.BigInteger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A wrapper class for unsigned {@code int} values, supporting arithmetic operations.
@@ -39,6 +39,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class UnsignedInteger extends Number implements Comparable<UnsignedInteger> {
   public static final UnsignedInteger ZERO = fromIntBits(0);
   public static final UnsignedInteger ONE = fromIntBits(1);
@@ -226,7 +227,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj instanceof UnsignedInteger) {
       UnsignedInteger other = (UnsignedInteger) obj;
       return value == other.value;
diff --git a/android/guava/src/com/google/common/primitives/UnsignedInts.java b/android/guava/src/com/google/common/primitives/UnsignedInts.java
index 9eda969..ec6474e 100644
--- a/android/guava/src/com/google/common/primitives/UnsignedInts.java
+++ b/android/guava/src/com/google/common/primitives/UnsignedInts.java
@@ -47,6 +47,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class UnsignedInts {
   static final long INT_MASK = 0xffffffffL;
 
diff --git a/android/guava/src/com/google/common/primitives/UnsignedLong.java b/android/guava/src/com/google/common/primitives/UnsignedLong.java
index 4485790..d803634 100644
--- a/android/guava/src/com/google/common/primitives/UnsignedLong.java
+++ b/android/guava/src/com/google/common/primitives/UnsignedLong.java
@@ -21,7 +21,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.Serializable;
 import java.math.BigInteger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A wrapper class for unsigned {@code long} values, supporting arithmetic operations.
@@ -38,6 +38,7 @@
  * @since 11.0
  */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 public final class UnsignedLong extends Number implements Comparable<UnsignedLong>, Serializable {
 
   private static final long UNSIGNED_MASK = 0x7fffffffffffffffL;
@@ -195,12 +196,12 @@
    */
   @Override
   public float floatValue() {
-    @SuppressWarnings("cast")
-    float fValue = (float) (value & UNSIGNED_MASK);
-    if (value < 0) {
-      fValue += 0x1.0p63f;
+    if (value >= 0) {
+      return (float) value;
     }
-    return fValue;
+    // The top bit is set, which means that the float value is going to come from the top 24 bits.
+    // So we can ignore the bottom 8, except for rounding. See doubleValue() for more.
+    return (float) ((value >>> 1) | (value & 1)) * 2f;
   }
 
   /**
@@ -209,12 +210,15 @@
    */
   @Override
   public double doubleValue() {
-    @SuppressWarnings("cast")
-    double dValue = (double) (value & UNSIGNED_MASK);
-    if (value < 0) {
-      dValue += 0x1.0p63;
+    if (value >= 0) {
+      return (double) value;
     }
-    return dValue;
+    // The top bit is set, which means that the double value is going to come from the top 53 bits.
+    // So we can ignore the bottom 11, except for rounding. We can unsigned-shift right 1, aka
+    // unsigned-divide by 2, and convert that. Then we'll get exactly half of the desired double
+    // value. But in the specific case where the bottom two bits of the original number are 01, we
+    // want to replace that with 1 in the shifted value for correct rounding.
+    return (double) ((value >>> 1) | (value & 1)) * 2.0;
   }
 
   /** Returns the value of this {@code UnsignedLong} as a {@link BigInteger}. */
@@ -238,7 +242,7 @@
   }
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj instanceof UnsignedLong) {
       UnsignedLong other = (UnsignedLong) obj;
       return value == other.value;
diff --git a/android/guava/src/com/google/common/primitives/UnsignedLongs.java b/android/guava/src/com/google/common/primitives/UnsignedLongs.java
index a1fccc2..31c51cc 100644
--- a/android/guava/src/com/google/common/primitives/UnsignedLongs.java
+++ b/android/guava/src/com/google/common/primitives/UnsignedLongs.java
@@ -50,6 +50,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class UnsignedLongs {
   private UnsignedLongs() {}
 
diff --git a/android/guava/src/com/google/common/reflect/AbstractInvocationHandler.java b/android/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
index 67655da..4666f99 100644
--- a/android/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
+++ b/android/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
@@ -19,7 +19,8 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Abstract implementation of {@link InvocationHandler} that handles {@link Object#equals}, {@link
@@ -39,6 +40,7 @@
  * @since 12.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractInvocationHandler implements InvocationHandler {
 
   private static final Object[] NO_ARGS = {};
@@ -59,7 +61,8 @@
    * </ul>
    */
   @Override
-  public final Object invoke(Object proxy, Method method, @NullableDecl Object[] args)
+  @CheckForNull
+  public final Object invoke(Object proxy, Method method, @CheckForNull @Nullable Object[] args)
       throws Throwable {
     if (args == null) {
       args = NO_ARGS;
@@ -94,7 +97,8 @@
    * <p>Unlike {@link #invoke}, {@code args} will never be null. When the method has no parameter,
    * an empty array is passed in.
    */
-  protected abstract Object handleInvocation(Object proxy, Method method, Object[] args)
+  @CheckForNull
+  protected abstract Object handleInvocation(Object proxy, Method method, @Nullable Object[] args)
       throws Throwable;
 
   /**
@@ -109,7 +113,7 @@
    * <p>Subclasses can override this method to provide custom equality.
    */
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     return super.equals(obj);
   }
 
diff --git a/android/guava/src/com/google/common/reflect/ClassPath.java b/android/guava/src/com/google/common/reflect/ClassPath.java
index 427914c..de693da 100644
--- a/android/guava/src/com/google/common/reflect/ClassPath.java
+++ b/android/guava/src/com/google/common/reflect/ClassPath.java
@@ -30,9 +30,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Sets;
 import com.google.common.io.ByteSource;
 import com.google.common.io.CharSource;
 import com.google.common.io.Resources;
@@ -54,19 +51,40 @@
 import java.util.jar.JarFile;
 import java.util.jar.Manifest;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Scans the source of a {@link ClassLoader} and finds all loadable classes and resources.
  *
- * <p><b>Warning:</b> Current limitations:
+ * <h2>Prefer <a href="https://github.com/classgraph/classgraph/wiki">ClassGraph</a> over {@code
+ * ClassPath}</h2>
+ *
+ * <p>We recommend using <a href="https://github.com/classgraph/classgraph/wiki">ClassGraph</a>
+ * instead of {@code ClassPath}. ClassGraph improves upon {@code ClassPath} in several ways,
+ * including addressing many of its limitations. Limitations of {@code ClassPath} include:
  *
  * <ul>
- *   <li>Looks only for files and JARs in URLs available from {@link URLClassLoader} instances or
- *       the {@linkplain ClassLoader#getSystemClassLoader() system class loader}.
- *   <li>Only understands {@code file:} URLs.
+ *   <li>It looks only for files and JARs in URLs available from {@link URLClassLoader} instances or
+ *       the {@linkplain ClassLoader#getSystemClassLoader() system class loader}. This means it does
+ *       not look for classes in the <i>module path</i>.
+ *   <li>It understands only {@code file:} URLs. This means that it does not understand <a
+ *       href="https://openjdk.java.net/jeps/220">{@code jrt:/} URLs</a>, among <a
+ *       href="https://github.com/classgraph/classgraph/wiki/Classpath-specification-mechanisms">others</a>.
+ *   <li>It does not know how to look for classes when running under an Android VM. (ClassGraph does
+ *       not support this directly, either, but ClassGraph documents how to <a
+ *       href="https://github.com/classgraph/classgraph/wiki/Build-Time-Scanning">perform build-time
+ *       classpath scanning and make the results available to an Android app</a>.)
+ *   <li>Like all of Guava, it is not tested under Windows. We have gotten <a
+ *       href="https://github.com/google/guava/issues/2130">a report of a specific bug under
+ *       Windows</a>.
+ *   <li>It <a href="https://github.com/google/guava/issues/2712">returns only one resource for a
+ *       given path</a>, even if resources with that path appear in multiple jars or directories.
+ *   <li>It assumes that <a href="https://github.com/google/guava/issues/3349">any class with a
+ *       {@code $} in its name is a nested class</a>.
  * </ul>
  *
+ * <h2>{@code ClassPath} and symlinks</h2>
+ *
  * <p>In the case of directory classloaders, symlinks are supported but cycles are not traversed.
  * This guarantees discovery of each <em>unique</em> loadable resource. However, not all possible
  * aliases for resources on cyclic paths will be listed.
@@ -75,17 +93,10 @@
  * @since 14.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class ClassPath {
   private static final Logger logger = Logger.getLogger(ClassPath.class.getName());
 
-  private static final Predicate<ClassInfo> IS_TOP_LEVEL =
-      new Predicate<ClassInfo>() {
-        @Override
-        public boolean apply(ClassInfo info) {
-          return info.className.indexOf('$') == -1;
-        }
-      };
-
   /** Separator for the Class-Path manifest attribute value in jar files. */
   private static final Splitter CLASS_PATH_ATTRIBUTE_SEPARATOR =
       Splitter.on(" ").omitEmptyStrings();
@@ -115,9 +126,21 @@
    *     failed.
    */
   public static ClassPath from(ClassLoader classloader) throws IOException {
-    DefaultScanner scanner = new DefaultScanner();
-    scanner.scan(classloader);
-    return new ClassPath(scanner.getResources());
+    ImmutableSet<LocationInfo> locations = locationsFrom(classloader);
+
+    // Add all locations to the scanned set so that in a classpath [jar1, jar2], where jar1 has a
+    // manifest with Class-Path pointing to jar2, we won't scan jar2 twice.
+    Set<File> scanned = new HashSet<>();
+    for (LocationInfo location : locations) {
+      scanned.add(location.file());
+    }
+
+    // Scan all locations
+    ImmutableSet.Builder<ResourceInfo> builder = ImmutableSet.builder();
+    for (LocationInfo location : locations) {
+      builder.addAll(location.scanResources(scanned));
+    }
+    return new ClassPath(builder.build());
   }
 
   /**
@@ -137,9 +160,21 @@
     return FluentIterable.from(resources).filter(ClassInfo.class).toSet();
   }
 
-  /** Returns all top level classes loadable from the current class path. */
+  /**
+   * Returns all top level classes loadable from the current class path. Note that "top-level-ness"
+   * is determined heuristically by class name (see {@link ClassInfo#isTopLevel}).
+   */
   public ImmutableSet<ClassInfo> getTopLevelClasses() {
-    return FluentIterable.from(resources).filter(ClassInfo.class).filter(IS_TOP_LEVEL).toSet();
+    return FluentIterable.from(resources)
+        .filter(ClassInfo.class)
+        .filter(
+            new Predicate<ClassInfo>() {
+              @Override
+              public boolean apply(ClassInfo info) {
+                return info.isTopLevel();
+              }
+            })
+        .toSet();
   }
 
   /** Returns all top level classes whose package name is {@code packageName}. */
@@ -252,7 +287,7 @@
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof ResourceInfo) {
         ResourceInfo that = (ResourceInfo) obj;
         return resourceName.equals(that.resourceName) && loader == that.loader;
@@ -284,8 +319,13 @@
     /**
      * Returns the package name of the class, without attempting to load the class.
      *
-     * <p>Behaves identically to {@link Package#getName()} but does not require the class (or
-     * package) to be loaded.
+     * <p>Behaves similarly to {@code class.getPackage().}{@link Package#getName() getName()} but
+     * does not require the class (or package) to be loaded.
+     *
+     * <p>But note that this method may behave differently for a class in the default package: For
+     * such classes, this method always returns an empty string. But under some version of Java,
+     * {@code class.getPackage().getName()} produces a {@code NullPointerException} because {@code
+     * class.getPackage()} returns {@code null}.
      */
     public String getPackageName() {
       return Reflection.getPackageName(className);
@@ -294,8 +334,11 @@
     /**
      * Returns the simple name of the underlying class as given in the source code.
      *
-     * <p>Behaves identically to {@link Class#getSimpleName()} but does not require the class to be
+     * <p>Behaves similarly to {@link Class#getSimpleName()} but does not require the class to be
      * loaded.
+     *
+     * <p>But note that this class uses heuristics to identify the simple name. See a related
+     * discussion in <a href="https://github.com/google/guava/issues/3349">issue 3349</a>.
      */
     public String getSimpleName() {
       int lastDollarSign = className.lastIndexOf('$');
@@ -325,6 +368,18 @@
     }
 
     /**
+     * Returns true if the class name "looks to be" top level (not nested), that is, it includes no
+     * '$' in the name. This method may return false for a top-level class that's intentionally
+     * named with the '$' character. If this is a concern, you could use {@link #load} and then
+     * check on the loaded {@link Class} object instead.
+     *
+     * @since 30.1
+     */
+    public boolean isTopLevel() {
+      return className.indexOf('$') == -1;
+    }
+
+    /**
      * Loads (but doesn't link or initialize) the class.
      *
      * @throws LinkageError when there were errors in loading classes that this class depends on.
@@ -346,36 +401,64 @@
   }
 
   /**
-   * Abstract class that scans through the class path represented by a {@link ClassLoader} and calls
-   * {@link #scanDirectory} and {@link #scanJarFile} for directories and jar files on the class path
-   * respectively.
+   * Returns all locations that {@code classloader} and parent loaders load classes and resources
+   * from. Callers can {@linkplain LocationInfo#scanResources scan} individual locations selectively
+   * or even in parallel.
    */
-  abstract static class Scanner {
+  static ImmutableSet<LocationInfo> locationsFrom(ClassLoader classloader) {
+    ImmutableSet.Builder<LocationInfo> builder = ImmutableSet.builder();
+    for (Map.Entry<File, ClassLoader> entry : getClassPathEntries(classloader).entrySet()) {
+      builder.add(new LocationInfo(entry.getKey(), entry.getValue()));
+    }
+    return builder.build();
+  }
 
-    // We only scan each file once independent of the classloader that resource might be associated
-    // with. Use concurrent set so that subclasses can be thread-safe.
-    private final Set<File> scannedUris = Sets.newConcurrentHashSet();
+  /**
+   * Represents a single location (a directory or a jar file) in the class path and is responsible
+   * for scanning resources from this location.
+   */
+  static final class LocationInfo {
+    final File home;
+    private final ClassLoader classloader;
 
-    public final void scan(ClassLoader classloader) throws IOException {
-      for (Map.Entry<File, ClassLoader> entry : getClassPathEntries(classloader).entrySet()) {
-        scan(entry.getKey(), entry.getValue());
-      }
+    LocationInfo(File home, ClassLoader classloader) {
+      this.home = checkNotNull(home);
+      this.classloader = checkNotNull(classloader);
     }
 
-    @VisibleForTesting
-    final void scan(File file, ClassLoader classloader) throws IOException {
-      if (scannedUris.add(file.getCanonicalFile())) {
-        scanFrom(file, classloader);
-      }
+    /** Returns the file this location is from. */
+    public final File file() {
+      return home;
+    }
+
+    /** Scans this location and returns all scanned resources. */
+    public ImmutableSet<ResourceInfo> scanResources() throws IOException {
+      return scanResources(new HashSet<File>());
     }
 
     /**
-     * Called each time a resource (uniqueness not guaranteed if the class path includes redundant
-     * entries)
+     * Scans this location and returns all scanned resources.
+     *
+     * <p>This file and jar files from "Class-Path" entry in the scanned manifest files will be
+     * added to {@code scannedFiles}.
+     *
+     * <p>A file will be scanned at most once even if specified multiple times by one or multiple
+     * jar files' "Class-Path" manifest entries. Particularly, if a jar file from the "Class-Path"
+     * manifest entry is already in {@code scannedFiles}, either because it was scanned earlier, or
+     * it was intentionally added to the set by the caller, it will not be scanned again.
+     *
+     * <p>Note that when you call {@code location.scanResources(scannedFiles)}, the location will
+     * always be scanned even if {@code scannedFiles} already contains it.
      */
-    protected abstract void scanResource(ResourceInfo resource) throws IOException;
+    public ImmutableSet<ResourceInfo> scanResources(Set<File> scannedFiles) throws IOException {
+      ImmutableSet.Builder<ResourceInfo> builder = ImmutableSet.builder();
+      scannedFiles.add(home);
+      scan(home, scannedFiles, builder);
+      return builder.build();
+    }
 
-    protected void scanFrom(File file, ClassLoader classloader) throws IOException {
+    private void scan(File file, Set<File> scannedUris, ImmutableSet.Builder<ResourceInfo> builder)
+        throws IOException {
       try {
         if (!file.exists()) {
           return;
@@ -386,13 +469,15 @@
         return;
       }
       if (file.isDirectory()) {
-        scanDirectory(classloader, file);
+        scanDirectory(file, builder);
       } else {
-        scanJar(file, classloader);
+        scanJar(file, scannedUris, builder);
       }
     }
 
-    private void scanJar(File file, ClassLoader classloader) throws IOException {
+    private void scanJar(
+        File file, Set<File> scannedUris, ImmutableSet.Builder<ResourceInfo> builder)
+        throws IOException {
       JarFile jarFile;
       try {
         jarFile = new JarFile(file);
@@ -402,128 +487,37 @@
       }
       try {
         for (File path : getClassPathFromManifest(file, jarFile.getManifest())) {
-          scan(path, classloader);
+          // We only scan each file once independent of the classloader that file might be
+          // associated with.
+          if (scannedUris.add(path.getCanonicalFile())) {
+            scan(path, scannedUris, builder);
+          }
         }
-        scanJarFile(classloader, jarFile);
+        scanJarFile(jarFile, builder);
       } finally {
         try {
           jarFile.close();
-        } catch (IOException ignored) {
+        } catch (IOException ignored) { // similar to try-with-resources, but don't fail scanning
         }
       }
     }
 
-    /**
-     * Returns the class path URIs specified by the {@code Class-Path} manifest attribute, according
-     * to <a
-     * href="http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Main_Attributes">JAR
-     * File Specification</a>. If {@code manifest} is null, it means the jar file has no manifest,
-     * and an empty set will be returned.
-     */
-    @VisibleForTesting
-    static ImmutableSet<File> getClassPathFromManifest(
-        File jarFile, @NullableDecl Manifest manifest) {
-      if (manifest == null) {
-        return ImmutableSet.of();
-      }
-      ImmutableSet.Builder<File> builder = ImmutableSet.builder();
-      String classpathAttribute =
-          manifest.getMainAttributes().getValue(Attributes.Name.CLASS_PATH.toString());
-      if (classpathAttribute != null) {
-        for (String path : CLASS_PATH_ATTRIBUTE_SEPARATOR.split(classpathAttribute)) {
-          URL url;
-          try {
-            url = getClassPathEntry(jarFile, path);
-          } catch (MalformedURLException e) {
-            // Ignore bad entry
-            logger.warning("Invalid Class-Path entry: " + path);
-            continue;
-          }
-          if (url.getProtocol().equals("file")) {
-            builder.add(toFile(url));
-          }
-        }
-      }
-      return builder.build();
-    }
-
-    @VisibleForTesting
-    static ImmutableMap<File, ClassLoader> getClassPathEntries(ClassLoader classloader) {
-      LinkedHashMap<File, ClassLoader> entries = Maps.newLinkedHashMap();
-      // Search parent first, since it's the order ClassLoader#loadClass() uses.
-      ClassLoader parent = classloader.getParent();
-      if (parent != null) {
-        entries.putAll(getClassPathEntries(parent));
-      }
-      for (URL url : getClassLoaderUrls(classloader)) {
-        if (url.getProtocol().equals("file")) {
-          File file = toFile(url);
-          if (!entries.containsKey(file)) {
-            entries.put(file, classloader);
-          }
-        }
-      }
-      return ImmutableMap.copyOf(entries);
-    }
-
-    private static ImmutableList<URL> getClassLoaderUrls(ClassLoader classloader) {
-      if (classloader instanceof URLClassLoader) {
-        return ImmutableList.copyOf(((URLClassLoader) classloader).getURLs());
-      }
-      if (classloader.equals(ClassLoader.getSystemClassLoader())) {
-        return parseJavaClassPath();
-      }
-      return ImmutableList.of();
-    }
-
-    /**
-     * Returns the URLs in the class path specified by the {@code java.class.path} {@linkplain
-     * System#getProperty system property}.
-     */
-    @VisibleForTesting // TODO(b/65488446): Make this a public API.
-    static ImmutableList<URL> parseJavaClassPath() {
-      ImmutableList.Builder<URL> urls = ImmutableList.builder();
-      for (String entry : Splitter.on(PATH_SEPARATOR.value()).split(JAVA_CLASS_PATH.value())) {
-        try {
-          try {
-            urls.add(new File(entry).toURI().toURL());
-          } catch (SecurityException e) { // File.toURI checks to see if the file is a directory
-            urls.add(new URL("file", null, new File(entry).getAbsolutePath()));
-          }
-        } catch (MalformedURLException e) {
-          logger.log(WARNING, "malformed classpath entry: " + entry, e);
-        }
-      }
-      return urls.build();
-    }
-
-    /**
-     * Returns the absolute uri of the Class-Path entry value as specified in <a
-     * href="http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Main_Attributes">JAR
-     * File Specification</a>. Even though the specification only talks about relative urls,
-     * absolute urls are actually supported too (for example, in Maven surefire plugin).
-     */
-    @VisibleForTesting
-    static URL getClassPathEntry(File jarFile, String path) throws MalformedURLException {
-      return new URL(jarFile.toURI().toURL(), path);
-    }
-
-    @VisibleForTesting
-    void scanJarFile(ClassLoader classloader, JarFile file) throws IOException {
+    private void scanJarFile(JarFile file, ImmutableSet.Builder<ResourceInfo> builder) {
       Enumeration<JarEntry> entries = file.entries();
       while (entries.hasMoreElements()) {
         JarEntry entry = entries.nextElement();
         if (entry.isDirectory() || entry.getName().equals(JarFile.MANIFEST_NAME)) {
           continue;
         }
-        scanResource(ResourceInfo.of(new File(file.getName()), entry.getName(), classloader));
+        builder.add(ResourceInfo.of(new File(file.getName()), entry.getName(), classloader));
       }
     }
 
-    private void scanDirectory(ClassLoader classloader, File directory) throws IOException {
+    private void scanDirectory(File directory, ImmutableSet.Builder<ResourceInfo> builder)
+        throws IOException {
       Set<File> currentPath = new HashSet<>();
       currentPath.add(directory.getCanonicalFile());
-      scanDirectory(directory, classloader, "", currentPath);
+      scanDirectory(directory, "", currentPath, builder);
     }
 
     /**
@@ -532,14 +526,16 @@
      * cycles; otherwise symlinks are traversed.
      *
      * @param directory the root of the directory to scan
-     * @param classloader the classloader that includes resources found in {@code directory}
      * @param packagePrefix resource path prefix inside {@code classloader} for any files found
      *     under {@code directory}
      * @param currentPath canonical files already visited in the current directory tree path, for
      *     cycle elimination
      */
     private void scanDirectory(
-        File directory, ClassLoader classloader, String packagePrefix, Set<File> currentPath)
+        File directory,
+        String packagePrefix,
+        Set<File> currentPath,
+        ImmutableSet.Builder<ResourceInfo> builder)
         throws IOException {
       File[] files = directory.listFiles();
       if (files == null) {
@@ -552,32 +548,131 @@
         if (f.isDirectory()) {
           File deref = f.getCanonicalFile();
           if (currentPath.add(deref)) {
-            scanDirectory(deref, classloader, packagePrefix + name + "/", currentPath);
+            scanDirectory(deref, packagePrefix + name + "/", currentPath, builder);
             currentPath.remove(deref);
           }
         } else {
           String resourceName = packagePrefix + name;
           if (!resourceName.equals(JarFile.MANIFEST_NAME)) {
-            scanResource(ResourceInfo.of(f, resourceName, classloader));
+            builder.add(ResourceInfo.of(f, resourceName, classloader));
           }
         }
       }
     }
-  }
 
-  @VisibleForTesting
-  static final class DefaultScanner extends Scanner {
-    private final SetMultimap<ClassLoader, ResourceInfo> resources =
-        MultimapBuilder.hashKeys().linkedHashSetValues().build();
-
-    ImmutableSet<ResourceInfo> getResources() {
-      return ImmutableSet.copyOf(resources.values());
+    @Override
+    public boolean equals(@CheckForNull Object obj) {
+      if (obj instanceof LocationInfo) {
+        LocationInfo that = (LocationInfo) obj;
+        return home.equals(that.home) && classloader.equals(that.classloader);
+      }
+      return false;
     }
 
     @Override
-    protected void scanResource(ResourceInfo resource) {
-      resources.put(resource.loader, resource);
+    public int hashCode() {
+      return home.hashCode();
     }
+
+    @Override
+    public String toString() {
+      return home.toString();
+    }
+  }
+
+  /**
+   * Returns the class path URIs specified by the {@code Class-Path} manifest attribute, according
+   * to <a
+   * href="http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Main_Attributes">JAR
+   * File Specification</a>. If {@code manifest} is null, it means the jar file has no manifest, and
+   * an empty set will be returned.
+   */
+  @VisibleForTesting
+  static ImmutableSet<File> getClassPathFromManifest(
+      File jarFile, @CheckForNull Manifest manifest) {
+    if (manifest == null) {
+      return ImmutableSet.of();
+    }
+    ImmutableSet.Builder<File> builder = ImmutableSet.builder();
+    String classpathAttribute =
+        manifest.getMainAttributes().getValue(Attributes.Name.CLASS_PATH.toString());
+    if (classpathAttribute != null) {
+      for (String path : CLASS_PATH_ATTRIBUTE_SEPARATOR.split(classpathAttribute)) {
+        URL url;
+        try {
+          url = getClassPathEntry(jarFile, path);
+        } catch (MalformedURLException e) {
+          // Ignore bad entry
+          logger.warning("Invalid Class-Path entry: " + path);
+          continue;
+        }
+        if (url.getProtocol().equals("file")) {
+          builder.add(toFile(url));
+        }
+      }
+    }
+    return builder.build();
+  }
+
+  @VisibleForTesting
+  static ImmutableMap<File, ClassLoader> getClassPathEntries(ClassLoader classloader) {
+    LinkedHashMap<File, ClassLoader> entries = Maps.newLinkedHashMap();
+    // Search parent first, since it's the order ClassLoader#loadClass() uses.
+    ClassLoader parent = classloader.getParent();
+    if (parent != null) {
+      entries.putAll(getClassPathEntries(parent));
+    }
+    for (URL url : getClassLoaderUrls(classloader)) {
+      if (url.getProtocol().equals("file")) {
+        File file = toFile(url);
+        if (!entries.containsKey(file)) {
+          entries.put(file, classloader);
+        }
+      }
+    }
+    return ImmutableMap.copyOf(entries);
+  }
+
+  private static ImmutableList<URL> getClassLoaderUrls(ClassLoader classloader) {
+    if (classloader instanceof URLClassLoader) {
+      return ImmutableList.copyOf(((URLClassLoader) classloader).getURLs());
+    }
+    if (classloader.equals(ClassLoader.getSystemClassLoader())) {
+      return parseJavaClassPath();
+    }
+    return ImmutableList.of();
+  }
+
+  /**
+   * Returns the URLs in the class path specified by the {@code java.class.path} {@linkplain
+   * System#getProperty system property}.
+   */
+  @VisibleForTesting // TODO(b/65488446): Make this a public API.
+  static ImmutableList<URL> parseJavaClassPath() {
+    ImmutableList.Builder<URL> urls = ImmutableList.builder();
+    for (String entry : Splitter.on(PATH_SEPARATOR.value()).split(JAVA_CLASS_PATH.value())) {
+      try {
+        try {
+          urls.add(new File(entry).toURI().toURL());
+        } catch (SecurityException e) { // File.toURI checks to see if the file is a directory
+          urls.add(new URL("file", null, new File(entry).getAbsolutePath()));
+        }
+      } catch (MalformedURLException e) {
+        logger.log(WARNING, "malformed classpath entry: " + entry, e);
+      }
+    }
+    return urls.build();
+  }
+
+  /**
+   * Returns the absolute uri of the Class-Path entry value as specified in <a
+   * href="http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Main_Attributes">JAR
+   * File Specification</a>. Even though the specification only talks about relative urls, absolute
+   * urls are actually supported too (for example, in Maven surefire plugin).
+   */
+  @VisibleForTesting
+  static URL getClassPathEntry(File jarFile, String path) throws MalformedURLException {
+    return new URL(jarFile.toURI().toURL(), path);
   }
 
   @VisibleForTesting
diff --git a/android/guava/src/com/google/common/reflect/Element.java b/android/guava/src/com/google/common/reflect/Element.java
deleted file mode 100644
index e2b9652..0000000
--- a/android/guava/src/com/google/common/reflect/Element.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (C) 2012 The Guava Authors
- *
- * 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 com.google.common.reflect;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
-
-/**
- * Represents either a {@link Field}, a {@link Method} or a {@link Constructor}. Provides
- * convenience methods such as {@link #isPublic} and {@link #isPackagePrivate}.
- *
- * @author Ben Yu
- */
-class Element extends AccessibleObject implements Member {
-
-  private final AccessibleObject accessibleObject;
-  private final Member member;
-
-  <M extends AccessibleObject & Member> Element(M member) {
-    checkNotNull(member);
-    this.accessibleObject = member;
-    this.member = member;
-  }
-
-  public TypeToken<?> getOwnerType() {
-    return TypeToken.of(getDeclaringClass());
-  }
-
-  @Override
-  public final boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
-    return accessibleObject.isAnnotationPresent(annotationClass);
-  }
-
-  @Override
-  public final <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
-    return accessibleObject.getAnnotation(annotationClass);
-  }
-
-  @Override
-  public final Annotation[] getAnnotations() {
-    return accessibleObject.getAnnotations();
-  }
-
-  @Override
-  public final Annotation[] getDeclaredAnnotations() {
-    return accessibleObject.getDeclaredAnnotations();
-  }
-
-  @Override
-  public final void setAccessible(boolean flag) throws SecurityException {
-    accessibleObject.setAccessible(flag);
-  }
-
-  @Override
-  public final boolean isAccessible() {
-    return accessibleObject.isAccessible();
-  }
-
-  @Override
-  public Class<?> getDeclaringClass() {
-    return member.getDeclaringClass();
-  }
-
-  @Override
-  public final String getName() {
-    return member.getName();
-  }
-
-  @Override
-  public final int getModifiers() {
-    return member.getModifiers();
-  }
-
-  @Override
-  public final boolean isSynthetic() {
-    return member.isSynthetic();
-  }
-
-  /** Returns true if the element is public. */
-  public final boolean isPublic() {
-    return Modifier.isPublic(getModifiers());
-  }
-
-  /** Returns true if the element is protected. */
-  public final boolean isProtected() {
-    return Modifier.isProtected(getModifiers());
-  }
-
-  /** Returns true if the element is package-private. */
-  public final boolean isPackagePrivate() {
-    return !isPrivate() && !isPublic() && !isProtected();
-  }
-
-  /** Returns true if the element is private. */
-  public final boolean isPrivate() {
-    return Modifier.isPrivate(getModifiers());
-  }
-
-  /** Returns true if the element is static. */
-  public final boolean isStatic() {
-    return Modifier.isStatic(getModifiers());
-  }
-
-  /**
-   * Returns {@code true} if this method is final, per {@code Modifier.isFinal(getModifiers())}.
-   *
-   * <p>Note that a method may still be effectively "final", or non-overridable when it has no
-   * {@code final} keyword. For example, it could be private, or it could be declared by a final
-   * class. To tell whether a method is overridable, use {@link Invokable#isOverridable}.
-   */
-  public final boolean isFinal() {
-    return Modifier.isFinal(getModifiers());
-  }
-
-  /** Returns true if the method is abstract. */
-  public final boolean isAbstract() {
-    return Modifier.isAbstract(getModifiers());
-  }
-
-  /** Returns true if the element is native. */
-  public final boolean isNative() {
-    return Modifier.isNative(getModifiers());
-  }
-
-  /** Returns true if the method is synchronized. */
-  public final boolean isSynchronized() {
-    return Modifier.isSynchronized(getModifiers());
-  }
-
-  /** Returns true if the field is volatile. */
-  final boolean isVolatile() {
-    return Modifier.isVolatile(getModifiers());
-  }
-
-  /** Returns true if the field is transient. */
-  final boolean isTransient() {
-    return Modifier.isTransient(getModifiers());
-  }
-
-  @Override
-  public boolean equals(@NullableDecl Object obj) {
-    if (obj instanceof Element) {
-      Element that = (Element) obj;
-      return getOwnerType().equals(that.getOwnerType()) && member.equals(that.member);
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    return member.hashCode();
-  }
-
-  @Override
-  public String toString() {
-    return member.toString();
-  }
-}
diff --git a/android/guava/src/com/google/common/reflect/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/reflect/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..0e8ef3c
--- /dev/null
+++ b/android/guava/src/com/google/common/reflect/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.reflect;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java b/android/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
index 354fd19..7fad5de 100644
--- a/android/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
+++ b/android/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
@@ -18,6 +18,7 @@
 import com.google.common.collect.ForwardingMap;
 import com.google.common.collect.ImmutableMap;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.Map;
 
 /**
@@ -119,6 +120,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public <T extends B> T putInstance(TypeToken<T> type, T value) {
     throw new UnsupportedOperationException();
   }
@@ -132,6 +134,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public <T extends B> T putInstance(Class<T> type, T value) {
     throw new UnsupportedOperationException();
   }
@@ -145,6 +148,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public B put(TypeToken<? extends B> key, B value) {
     throw new UnsupportedOperationException();
   }
@@ -157,6 +161,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void putAll(Map<? extends TypeToken<? extends B>, ? extends B> map) {
     throw new UnsupportedOperationException();
   }
diff --git a/android/guava/src/com/google/common/reflect/Invokable.java b/android/guava/src/com/google/common/reflect/Invokable.java
index 3900244..8e75aa8 100644
--- a/android/guava/src/com/google/common/reflect/Invokable.java
+++ b/android/guava/src/com/google/common/reflect/Invokable.java
@@ -21,8 +21,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Constructor;
-import java.lang.reflect.GenericDeclaration;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
@@ -30,7 +30,8 @@
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Wrapper around either a {@link Method} or a {@link Constructor}. Convenience API is provided to
@@ -48,17 +49,29 @@
  * assertEquals(new TypeToken<List<String>>() {}, invokable.getOwnerType());
  * }</pre>
  *
+ * <p><b>Note:</b> earlier versions of this class inherited from {@link
+ * java.lang.reflect.AccessibleObject AccessibleObject} and {@link
+ * java.lang.reflect.GenericDeclaration GenericDeclaration}. Since version 31.0 that is no longer
+ * the case. However, most methods from those types are present with the same signature in this
+ * class.
+ *
  * @param <T> the type that owns this method or constructor.
  * @param <R> the return type of (or supertype thereof) the method or the declaring type of the
  *     constructor.
  * @author Ben Yu
- * @since 14.0
+ * @since 14.0 (no longer implements {@link AccessibleObject} or {@code GenericDeclaration} since
+ *     31.0)
  */
 @Beta
-public abstract class Invokable<T, R> extends Element implements GenericDeclaration {
+@ElementTypesAreNonnullByDefault
+public abstract class Invokable<T, R> implements AnnotatedElement, Member {
+  private final AccessibleObject accessibleObject;
+  private final Member member;
 
   <M extends AccessibleObject & Member> Invokable(M member) {
-    super(member);
+    checkNotNull(member);
+    this.accessibleObject = member;
+    this.member = member;
   }
 
   /** Returns {@link Invokable} of {@code method}. */
@@ -71,6 +84,151 @@
     return new ConstructorInvokable<T>(constructor);
   }
 
+  @Override
+  public final boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
+    return accessibleObject.isAnnotationPresent(annotationClass);
+  }
+
+  @Override
+  @CheckForNull
+  public final <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
+    return accessibleObject.getAnnotation(annotationClass);
+  }
+
+  @Override
+  public final Annotation[] getAnnotations() {
+    return accessibleObject.getAnnotations();
+  }
+
+  @Override
+  public final Annotation[] getDeclaredAnnotations() {
+    return accessibleObject.getDeclaredAnnotations();
+  }
+
+  // We ought to be able to implement GenericDeclaration instead its parent AnnotatedElement.
+  // That would give us this method declaration. But for some reason, implementing
+  // GenericDeclaration leads to weird errors in Android tests:
+  // IncompatibleClassChangeError: interface not implemented
+  /** See {@link java.lang.reflect.GenericDeclaration#getTypeParameters()}. */
+  public abstract TypeVariable<?>[] getTypeParameters();
+
+  /** See {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)}. */
+  public final void setAccessible(boolean flag) {
+    accessibleObject.setAccessible(flag);
+  }
+
+  /** See {@link java.lang.reflect.AccessibleObject#trySetAccessible()}. */
+  public final boolean trySetAccessible() {
+    // We can't call accessibleObject.trySetAccessible since that was added in Java 9 and this code
+    // should work on Java 8. So we emulate it this way.
+    try {
+      accessibleObject.setAccessible(true);
+      return true;
+    } catch (RuntimeException e) {
+      return false;
+    }
+  }
+
+  /** See {@link java.lang.reflect.AccessibleObject#isAccessible()}. */
+  public final boolean isAccessible() {
+    return accessibleObject.isAccessible();
+  }
+
+  @Override
+  public final String getName() {
+    return member.getName();
+  }
+
+  @Override
+  public final int getModifiers() {
+    return member.getModifiers();
+  }
+
+  @Override
+  public final boolean isSynthetic() {
+    return member.isSynthetic();
+  }
+
+  /** Returns true if the element is public. */
+  public final boolean isPublic() {
+    return Modifier.isPublic(getModifiers());
+  }
+
+  /** Returns true if the element is protected. */
+  public final boolean isProtected() {
+    return Modifier.isProtected(getModifiers());
+  }
+
+  /** Returns true if the element is package-private. */
+  public final boolean isPackagePrivate() {
+    return !isPrivate() && !isPublic() && !isProtected();
+  }
+
+  /** Returns true if the element is private. */
+  public final boolean isPrivate() {
+    return Modifier.isPrivate(getModifiers());
+  }
+
+  /** Returns true if the element is static. */
+  public final boolean isStatic() {
+    return Modifier.isStatic(getModifiers());
+  }
+
+  /**
+   * Returns {@code true} if this method is final, per {@code Modifier.isFinal(getModifiers())}.
+   *
+   * <p>Note that a method may still be effectively "final", or non-overridable when it has no
+   * {@code final} keyword. For example, it could be private, or it could be declared by a final
+   * class. To tell whether a method is overridable, use {@link Invokable#isOverridable}.
+   */
+  public final boolean isFinal() {
+    return Modifier.isFinal(getModifiers());
+  }
+
+  /** Returns true if the method is abstract. */
+  public final boolean isAbstract() {
+    return Modifier.isAbstract(getModifiers());
+  }
+
+  /** Returns true if the element is native. */
+  public final boolean isNative() {
+    return Modifier.isNative(getModifiers());
+  }
+
+  /** Returns true if the method is synchronized. */
+  public final boolean isSynchronized() {
+    return Modifier.isSynchronized(getModifiers());
+  }
+
+  /** Returns true if the field is volatile. */
+  final boolean isVolatile() {
+    return Modifier.isVolatile(getModifiers());
+  }
+
+  /** Returns true if the field is transient. */
+  final boolean isTransient() {
+    return Modifier.isTransient(getModifiers());
+  }
+
+  @Override
+  public boolean equals(@CheckForNull Object obj) {
+    if (obj instanceof Invokable) {
+      Invokable<?, ?> that = (Invokable<?, ?>) obj;
+      return getOwnerType().equals(that.getOwnerType()) && member.equals(that.member);
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return member.hashCode();
+  }
+
+  @Override
+  public String toString() {
+    return member.toString();
+  }
+
   /**
    * Returns {@code true} if this is an overridable method. Constructors, private, static or final
    * methods, or methods declared by final classes are not overridable.
@@ -93,10 +251,11 @@
    *     invocation conversion.
    * @throws InvocationTargetException if the underlying method or constructor throws an exception.
    */
-  // All subclasses are owned by us and we'll make sure to get the R type right.
-  @SuppressWarnings("unchecked")
+  // All subclasses are owned by us and we'll make sure to get the R type right, including nullness.
+  @SuppressWarnings({"unchecked", "nullness"})
   @CanIgnoreReturnValue
-  public final R invoke(@NullableDecl T receiver, Object... args)
+  @CheckForNull
+  public final R invoke(@CheckForNull T receiver, @Nullable Object... args)
       throws InvocationTargetException, IllegalAccessException {
     return (R) invokeInternal(receiver, checkNotNull(args));
   }
@@ -162,18 +321,18 @@
   @SuppressWarnings("unchecked") // The declaring class is T's raw class, or one of its supertypes.
   @Override
   public final Class<? super T> getDeclaringClass() {
-    return (Class<? super T>) super.getDeclaringClass();
+    return (Class<? super T>) member.getDeclaringClass();
   }
 
   /** Returns the type of {@code T}. */
   // Overridden in TypeToken#method() and TypeToken#constructor()
   @SuppressWarnings("unchecked") // The declaring class is T.
-  @Override
   public TypeToken<T> getOwnerType() {
     return (TypeToken<T>) TypeToken.of(getDeclaringClass());
   }
 
-  abstract Object invokeInternal(@NullableDecl Object receiver, Object[] args)
+  @CheckForNull
+  abstract Object invokeInternal(@CheckForNull Object receiver, @Nullable Object[] args)
       throws InvocationTargetException, IllegalAccessException;
 
   abstract Type[] getGenericParameterTypes();
@@ -195,7 +354,8 @@
     }
 
     @Override
-    final Object invokeInternal(@NullableDecl Object receiver, Object[] args)
+    @CheckForNull
+    final Object invokeInternal(@CheckForNull Object receiver, @Nullable Object[] args)
         throws InvocationTargetException, IllegalAccessException {
       return method.invoke(receiver, args);
     }
@@ -249,7 +409,7 @@
     }
 
     @Override
-    final Object invokeInternal(@NullableDecl Object receiver, Object[] args)
+    final Object invokeInternal(@CheckForNull Object receiver, @Nullable Object[] args)
         throws InvocationTargetException, IllegalAccessException {
       try {
         return constructor.newInstance(args);
diff --git a/android/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java b/android/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
index 3b88c9c..dccd298 100644
--- a/android/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
+++ b/android/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Maps;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
@@ -76,6 +77,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public B put(TypeToken<? extends B> key, B value) {
     throw new UnsupportedOperationException("Please use putInstance() instead.");
   }
@@ -88,6 +90,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void putAll(Map<? extends TypeToken<? extends B>, ? extends B> map) {
     throw new UnsupportedOperationException("Please use putInstance() instead.");
   }
diff --git a/android/guava/src/com/google/common/reflect/Parameter.java b/android/guava/src/com/google/common/reflect/Parameter.java
index 8f05ef6..a55734a 100644
--- a/android/guava/src/com/google/common/reflect/Parameter.java
+++ b/android/guava/src/com/google/common/reflect/Parameter.java
@@ -21,7 +21,8 @@
 import com.google.common.collect.ImmutableList;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Represents a method or constructor parameter.
@@ -30,6 +31,7 @@
  * @since 14.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class Parameter implements AnnotatedElement {
 
   private final Invokable<?, ?> declaration;
@@ -61,7 +63,7 @@
   }
 
   @Override
-  @NullableDecl
+  @CheckForNull
   public <A extends Annotation> A getAnnotation(Class<A> annotationType) {
     checkNotNull(annotationType);
     for (Annotation annotation : annotations) {
@@ -92,7 +94,7 @@
 
   /** @since 18.0 */
   // @Override on JDK8
-  @NullableDecl
+  @CheckForNull
   public <A extends Annotation> A getDeclaredAnnotation(Class<A> annotationType) {
     checkNotNull(annotationType);
     return FluentIterable.from(annotations).filter(annotationType).first().orNull();
@@ -101,11 +103,15 @@
   /** @since 18.0 */
   // @Override on JDK8
   public <A extends Annotation> A[] getDeclaredAnnotationsByType(Class<A> annotationType) {
-    return FluentIterable.from(annotations).filter(annotationType).toArray(annotationType);
+    @Nullable
+    A[] result = FluentIterable.from(annotations).filter(annotationType).toArray(annotationType);
+    @SuppressWarnings("nullness") // safe because the input list contains no nulls
+    A[] cast = (A[]) result;
+    return cast;
   }
 
   @Override
-  public boolean equals(@NullableDecl Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj instanceof Parameter) {
       Parameter that = (Parameter) obj;
       return position == that.position && declaration.equals(that.declaration);
diff --git a/android/guava/src/com/google/common/reflect/ParametricNullness.java b/android/guava/src/com/google/common/reflect/ParametricNullness.java
new file mode 100644
index 0000000..588aa5f
--- /dev/null
+++ b/android/guava/src/com/google/common/reflect/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.reflect;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/reflect/Reflection.java b/android/guava/src/com/google/common/reflect/Reflection.java
index 4ad5dff..fa35f7f 100644
--- a/android/guava/src/com/google/common/reflect/Reflection.java
+++ b/android/guava/src/com/google/common/reflect/Reflection.java
@@ -27,6 +27,7 @@
  * @since 12.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class Reflection {
 
   /**
diff --git a/android/guava/src/com/google/common/reflect/TypeCapture.java b/android/guava/src/com/google/common/reflect/TypeCapture.java
index effb382..2be7b4f 100644
--- a/android/guava/src/com/google/common/reflect/TypeCapture.java
+++ b/android/guava/src/com/google/common/reflect/TypeCapture.java
@@ -24,6 +24,7 @@
  *
  * @author Ben Yu
  */
+@ElementTypesAreNonnullByDefault
 abstract class TypeCapture<T> {
 
   /** Returns the captured type. */
diff --git a/android/guava/src/com/google/common/reflect/TypeParameter.java b/android/guava/src/com/google/common/reflect/TypeParameter.java
index 2834941..9c64abb 100644
--- a/android/guava/src/com/google/common/reflect/TypeParameter.java
+++ b/android/guava/src/com/google/common/reflect/TypeParameter.java
@@ -19,7 +19,7 @@
 import com.google.common.annotations.Beta;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Captures a free type variable that can be used in {@link TypeToken#where}. For example:
@@ -35,6 +35,17 @@
  * @since 12.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
+/*
+ * A nullable bound would let users create a TypeParameter instance for a parameter with a nullable
+ * bound. However, it would also let them create `new TypeParameter<@Nullable T>() {}`, which
+ * wouldn't behave as users might expect. Additionally, it's not clear how the TypeToken API could
+ * support even a "normal" `TypeParameter<T>` when `<T>` has a nullable bound. (See the discussion
+ * on TypeToken.where.) So, in the interest of failing fast and encouraging the user to switch to a
+ * non-null bound if possible, let's require a non-null bound here.
+ *
+ * TODO(cpovirk): Elaborate on "wouldn't behave as users might expect."
+ */
 public abstract class TypeParameter<T> extends TypeCapture<T> {
 
   final TypeVariable<?> typeVariable;
@@ -51,7 +62,7 @@
   }
 
   @Override
-  public final boolean equals(@NullableDecl Object o) {
+  public final boolean equals(@CheckForNull Object o) {
     if (o instanceof TypeParameter) {
       TypeParameter<?> that = (TypeParameter<?>) o;
       return typeVariable.equals(that.typeVariable);
diff --git a/android/guava/src/com/google/common/reflect/TypeResolver.java b/android/guava/src/com/google/common/reflect/TypeResolver.java
index 0c18a1d..fbe48c1 100644
--- a/android/guava/src/com/google/common/reflect/TypeResolver.java
+++ b/android/guava/src/com/google/common/reflect/TypeResolver.java
@@ -35,7 +35,7 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * An object of this class encapsulates type mappings from type variables. Mappings are established
@@ -52,6 +52,7 @@
  * @since 15.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class TypeResolver {
 
   private final TypeTable typeTable;
@@ -508,7 +509,7 @@
         @Override
         TypeVariable<?> captureAsTypeVariable(Type[] upperBounds) {
           Set<Type> combined = new LinkedHashSet<>(asList(upperBounds));
-          // Since this is an artifically generated type variable, we don't bother checking
+          // Since this is an artificially generated type variable, we don't bother checking
           // subtyping between declared type bound and actual type bound. So it's possible that we
           // may generate something like <capture#1-of ? extends Foo&SubFoo>.
           // Checking subtype between declared and actual type bounds
@@ -527,7 +528,8 @@
       return new WildcardCapturer(id);
     }
 
-    private Type captureNullable(@NullableDecl Type type) {
+    @CheckForNull
+    private Type captureNullable(@CheckForNull Type type) {
       if (type == null) {
         return null;
       }
@@ -561,7 +563,7 @@
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof TypeVariableKey) {
         TypeVariableKey that = (TypeVariableKey) obj;
         return equalsTypeVariable(that.var);
@@ -576,6 +578,7 @@
     }
 
     /** Wraps {@code t} in a {@code TypeVariableKey} if it's a type variable. */
+    @CheckForNull
     static TypeVariableKey forLookup(Type t) {
       if (t instanceof TypeVariable) {
         return new TypeVariableKey((TypeVariable<?>) t);
diff --git a/android/guava/src/com/google/common/reflect/TypeToken.java b/android/guava/src/com/google/common/reflect/TypeToken.java
index daf498c..f107b70 100644
--- a/android/guava/src/com/google/common/reflect/TypeToken.java
+++ b/android/guava/src/com/google/common/reflect/TypeToken.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.VisibleForTesting;
@@ -46,7 +47,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link Type} with generics.
@@ -98,15 +99,16 @@
  */
 @Beta
 @SuppressWarnings("serial") // SimpleTypeToken is the serialized form.
+@ElementTypesAreNonnullByDefault
 public abstract class TypeToken<T> extends TypeCapture<T> implements Serializable {
 
   private final Type runtimeType;
 
   /** Resolver for resolving parameter and field types with {@link #runtimeType} as context. */
-  @NullableDecl private transient TypeResolver invariantTypeResolver;
+  @CheckForNull private transient TypeResolver invariantTypeResolver;
 
   /** Resolver for resolving covariant types with {@link #runtimeType} as context. */
-  @NullableDecl private transient TypeResolver covariantTypeResolver;
+  @CheckForNull private transient TypeResolver covariantTypeResolver;
 
   /**
    * Constructs a new type token of {@code T}.
@@ -220,6 +222,17 @@
    * @param typeParam the parameter type variable
    * @param typeArg the actual type to substitute
    */
+  /*
+   * TODO(cpovirk): Is there any way for us to support TypeParameter instances for type parameters
+   * that have nullable bounds? Unfortunately, if we change the parameter to TypeParameter<? extends
+   * @Nullable X>, then users might pass a TypeParameter<Y>, where Y is a subtype of X, while still
+   * passing a TypeToken<X>. This would be invalid. Maybe we could accept a TypeParameter<@PolyNull
+   * X> if we support such a thing? It would be weird or misleading for users to be able to pass
+   * `new TypeParameter<@Nullable T>() {}` and have it act as a plain `TypeParameter<T>`, but
+   * hopefully no one would do that, anyway. See also the comment on TypeParameter itself.
+   *
+   * TODO(cpovirk): Elaborate on this / merge with other comment?
+   */
   public final <X> TypeToken<T> where(TypeParameter<X> typeParam, TypeToken<X> typeArg) {
     TypeResolver resolver =
         new TypeResolver()
@@ -248,6 +261,10 @@
    * @param typeParam the parameter type variable
    * @param typeArg the actual type to substitute
    */
+  /*
+   * TODO(cpovirk): Is there any way for us to support TypeParameter instances for type parameters
+   * that have nullable bounds? See discussion on the other overload of this method.
+   */
   public final <X> TypeToken<T> where(TypeParameter<X> typeParam, Class<X> typeArg) {
     return where(typeParam, of(typeArg));
   }
@@ -288,7 +305,7 @@
    * if the bound is a class or extends from a class. This means that the returned type could be a
    * type variable too.
    */
-  @NullableDecl
+  @CheckForNull
   final TypeToken<? super T> getGenericSuperclass() {
     if (runtimeType instanceof TypeVariable) {
       // First bound is always the super class, if one exists.
@@ -307,7 +324,7 @@
     return superToken;
   }
 
-  @NullableDecl
+  @CheckForNull
   private TypeToken<? super T> boundAsSuperclass(Type bound) {
     TypeToken<?> token = of(bound);
     if (token.getRawType().isInterface()) {
@@ -560,7 +577,7 @@
    * Returns the array component type if this type represents an array ({@code int[]}, {@code T[]},
    * {@code <? extends Map<String, Integer>[]>} etc.), or else {@code null} is returned.
    */
-  @NullableDecl
+  @CheckForNull
   public final TypeToken<?> getComponentType() {
     Type componentType = Types.getComponentType(runtimeType);
     if (componentType == null) {
@@ -655,7 +672,7 @@
    */
   public class TypeSet extends ForwardingSet<TypeToken<? super T>> implements Serializable {
 
-    @NullableDecl private transient ImmutableSet<TypeToken<? super T>> types;
+    @CheckForNull private transient ImmutableSet<TypeToken<? super T>> types;
 
     TypeSet() {}
 
@@ -701,7 +718,7 @@
   private final class InterfaceSet extends TypeSet {
 
     private final transient TypeSet allTypes;
-    @NullableDecl private transient ImmutableSet<TypeToken<? super T>> interfaces;
+    @CheckForNull private transient ImmutableSet<TypeToken<? super T>> interfaces;
 
     InterfaceSet(TypeSet allTypes) {
       this.allTypes = allTypes;
@@ -754,7 +771,7 @@
 
   private final class ClassSet extends TypeSet {
 
-    @NullableDecl private transient ImmutableSet<TypeToken<? super T>> classes;
+    @CheckForNull private transient ImmutableSet<TypeToken<? super T>> classes;
 
     @Override
     protected Set<TypeToken<? super T>> delegate() {
@@ -819,7 +836,7 @@
    * Returns true if {@code o} is another {@code TypeToken} that represents the same {@link Type}.
    */
   @Override
-  public boolean equals(@NullableDecl Object o) {
+  public boolean equals(@CheckForNull Object o) {
     if (o instanceof TypeToken) {
       TypeToken<?> that = (TypeToken<?>) o;
       return runtimeType.equals(that.runtimeType);
@@ -1133,7 +1150,7 @@
    * Returns the owner type of a {@link ParameterizedType} or enclosing class of a {@link Class}, or
    * null otherwise.
    */
-  @NullableDecl
+  @CheckForNull
   private Type getOwnerTypeIfPresent() {
     if (runtimeType instanceof ParameterizedType) {
       return ((ParameterizedType) runtimeType).getOwnerType();
@@ -1223,11 +1240,19 @@
     // with component type, we have lost generic type information
     // Use raw type so that compiler allows us to call getSupertype()
     @SuppressWarnings("rawtypes")
-    TypeToken componentType =
-        checkNotNull(getComponentType(), "%s isn't a super type of %s", supertype, this);
+    TypeToken componentType = getComponentType();
+    // TODO(cpovirk): checkArgument?
+    if (componentType == null) {
+      throw new IllegalArgumentException(supertype + " isn't a super type of " + this);
+    }
     // array is covariant. component type is super type, so is the array type.
     @SuppressWarnings("unchecked") // going from raw type back to generics
-    TypeToken<?> componentSupertype = componentType.getSupertype(supertype.getComponentType());
+    /*
+     * requireNonNull is safe because we call getArraySupertype only after checking
+     * supertype.isArray().
+     */
+    TypeToken<?> componentSupertype =
+        componentType.getSupertype(requireNonNull(supertype.getComponentType()));
     @SuppressWarnings("unchecked") // component type is super type, so is array type.
     TypeToken<? super T> result =
         (TypeToken<? super T>)
@@ -1237,8 +1262,14 @@
   }
 
   private TypeToken<? extends T> getArraySubtype(Class<?> subclass) {
+    Class<?> subclassComponentType = subclass.getComponentType();
+    if (subclassComponentType == null) {
+      throw new IllegalArgumentException(subclass + " does not appear to be a subtype of " + this);
+    }
     // array is covariant. component type is subtype, so is the array type.
-    TypeToken<?> componentSubtype = getComponentType().getSubtype(subclass.getComponentType());
+    // requireNonNull is safe because we call getArraySubtype only when isArray().
+    TypeToken<?> componentSubtype =
+        requireNonNull(getComponentType()).getSubtype(subclassComponentType);
     @SuppressWarnings("unchecked") // component type is subtype, so is array type.
     TypeToken<? extends T> result =
         (TypeToken<? extends T>)
@@ -1311,7 +1342,7 @@
           }
 
           @Override
-          @NullableDecl
+          @CheckForNull
           TypeToken<?> getSuperclass(TypeToken<?> type) {
             return type.getGenericSuperclass();
           }
@@ -1330,7 +1361,7 @@
           }
 
           @Override
-          @NullableDecl
+          @CheckForNull
           Class<?> getSuperclass(Class<?> type) {
             return type.getSuperclass();
           }
@@ -1402,7 +1433,9 @@
           new Ordering<K>() {
             @Override
             public int compare(K left, K right) {
-              return valueComparator.compare(map.get(left), map.get(right));
+              // requireNonNull is safe because we are passing keys in the map.
+              return valueComparator.compare(
+                  requireNonNull(map.get(left)), requireNonNull(map.get(right)));
             }
           };
       return keyOrdering.immutableSortedCopy(map.keySet());
@@ -1412,7 +1445,7 @@
 
     abstract Iterable<? extends K> getInterfaces(K type);
 
-    @NullableDecl
+    @CheckForNull
     abstract K getSuperclass(K type);
 
     private static class ForwardingTypeCollector<K> extends TypeCollector<K> {
@@ -1434,6 +1467,7 @@
       }
 
       @Override
+      @CheckForNull
       K getSuperclass(K type) {
         return delegate.getSuperclass(type);
       }
diff --git a/android/guava/src/com/google/common/reflect/TypeVisitor.java b/android/guava/src/com/google/common/reflect/TypeVisitor.java
index 3e8436d..416397b 100644
--- a/android/guava/src/com/google/common/reflect/TypeVisitor.java
+++ b/android/guava/src/com/google/common/reflect/TypeVisitor.java
@@ -21,6 +21,7 @@
 import java.lang.reflect.TypeVariable;
 import java.lang.reflect.WildcardType;
 import java.util.Set;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Based on what a {@link Type} is, dispatch it to the corresponding {@code visit*} method. By
@@ -53,6 +54,7 @@
  *
  * @author Ben Yu
  */
+@ElementTypesAreNonnullByDefault
 abstract class TypeVisitor {
 
   private final Set<Type> visited = Sets.newHashSet();
@@ -61,7 +63,7 @@
    * Visits the given types. Null types are ignored. This allows subclasses to call {@code
    * visit(parameterizedType.getOwnerType())} safely without having to check nulls.
    */
-  public final void visit(Type... types) {
+  public final void visit(@Nullable Type... types) {
     for (Type type : types) {
       if (type == null || !visited.add(type)) {
         // null owner type, or already visited;
diff --git a/android/guava/src/com/google/common/reflect/Types.java b/android/guava/src/com/google/common/reflect/Types.java
index 4fc3910..0dc327d 100644
--- a/android/guava/src/com/google/common/reflect/Types.java
+++ b/android/guava/src/com/google/common/reflect/Types.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Iterables.transform;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
@@ -44,13 +45,15 @@
 import java.util.Collection;
 import java.util.Map.Entry;
 import java.util.concurrent.atomic.AtomicReference;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Utilities for working with {@link Type}.
  *
  * @author Ben Yu
  */
+@ElementTypesAreNonnullByDefault
 final class Types {
 
   /** Class#toString without the "class " and "interface " prefixes */
@@ -86,7 +89,7 @@
    * {@code ownerType}.
    */
   static ParameterizedType newParameterizedTypeWithOwner(
-      @NullableDecl Type ownerType, Class<?> rawType, Type... arguments) {
+      @CheckForNull Type ownerType, Class<?> rawType, Type... arguments) {
     if (ownerType == null) {
       return newParameterizedType(rawType, arguments);
     }
@@ -106,14 +109,14 @@
   private enum ClassOwnership {
     OWNED_BY_ENCLOSING_CLASS {
       @Override
-      @NullableDecl
+      @CheckForNull
       Class<?> getOwnerType(Class<?> rawType) {
         return rawType.getEnclosingClass();
       }
     },
     LOCAL_CLASS_HAS_NO_OWNER {
       @Override
-      @NullableDecl
+      @CheckForNull
       Class<?> getOwnerType(Class<?> rawType) {
         if (rawType.isLocalClass()) {
           return null;
@@ -123,7 +126,7 @@
       }
     };
 
-    @NullableDecl
+    @CheckForNull
     abstract Class<?> getOwnerType(Class<?> rawType);
 
     static final ClassOwnership JVM_BEHAVIOR = detectJvmBehavior();
@@ -131,7 +134,9 @@
     private static ClassOwnership detectJvmBehavior() {
       class LocalClass<T> {}
       Class<?> subclass = new LocalClass<String>() {}.getClass();
-      ParameterizedType parameterizedType = (ParameterizedType) subclass.getGenericSuperclass();
+      // requireNonNull is safe because we're examining a type that's known to have a superclass.
+      ParameterizedType parameterizedType =
+          requireNonNull((ParameterizedType) subclass.getGenericSuperclass());
       for (ClassOwnership behavior : ClassOwnership.values()) {
         if (behavior.getOwnerType(LocalClass.class) == parameterizedType.getOwnerType()) {
           return behavior;
@@ -172,10 +177,10 @@
     return (type instanceof Class) ? ((Class<?>) type).getName() : type.toString();
   }
 
-  @NullableDecl
+  @CheckForNull
   static Type getComponentType(Type type) {
     checkNotNull(type);
-    final AtomicReference<Type> result = new AtomicReference<>();
+    final AtomicReference<@Nullable Type> result = new AtomicReference<>();
     new TypeVisitor() {
       @Override
       void visitTypeVariable(TypeVariable<?> t) {
@@ -204,7 +209,7 @@
    * Returns {@code ? extends X} if any of {@code bounds} is a subtype of {@code X[]}; or null
    * otherwise.
    */
-  @NullableDecl
+  @CheckForNull
   private static Type subtypeOfComponentType(Type[] bounds) {
     for (Type bound : bounds) {
       Type componentType = getComponentType(bound);
@@ -247,7 +252,7 @@
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof GenericArrayType) {
         GenericArrayType that = (GenericArrayType) obj;
         return Objects.equal(getGenericComponentType(), that.getGenericComponentType());
@@ -260,11 +265,11 @@
 
   private static final class ParameterizedTypeImpl implements ParameterizedType, Serializable {
 
-    @NullableDecl private final Type ownerType;
+    @CheckForNull private final Type ownerType;
     private final ImmutableList<Type> argumentsList;
     private final Class<?> rawType;
 
-    ParameterizedTypeImpl(@NullableDecl Type ownerType, Class<?> rawType, Type[] typeArguments) {
+    ParameterizedTypeImpl(@CheckForNull Type ownerType, Class<?> rawType, Type[] typeArguments) {
       checkNotNull(rawType);
       checkArgument(typeArguments.length == rawType.getTypeParameters().length);
       disallowPrimitiveType(typeArguments, "type parameter");
@@ -284,6 +289,7 @@
     }
 
     @Override
+    @CheckForNull
     public Type getOwnerType() {
       return ownerType;
     }
@@ -310,7 +316,7 @@
     }
 
     @Override
-    public boolean equals(Object other) {
+    public boolean equals(@CheckForNull Object other) {
       if (!(other instanceof ParameterizedType)) {
         return false;
       }
@@ -386,7 +392,9 @@
     }
 
     @Override
-    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+    @CheckForNull
+    public Object invoke(Object proxy, Method method, @CheckForNull @Nullable Object[] args)
+        throws Throwable {
       String methodName = method.getName();
       Method typeVariableMethod = typeVariableMethods.get(methodName);
       if (typeVariableMethod == null) {
@@ -441,7 +449,7 @@
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (NativeTypeVariableEquals.NATIVE_TYPE_VARIABLE_ONLY) {
         // equal only to our TypeVariable implementation with identical bounds
         if (obj != null
@@ -490,7 +498,7 @@
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof WildcardType) {
         WildcardType that = (WildcardType) obj;
         return lowerBounds.equals(Arrays.asList(that.getLowerBounds()))
diff --git a/android/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java b/android/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java
index 740a0d5..76eada2 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.util.concurrent.Futures.getDone;
 import static com.google.common.util.concurrent.MoreExecutors.rejectionPropagatingExecutor;
+import static com.google.common.util.concurrent.NullnessCasts.uncheckedCastNullableTToT;
 import static com.google.common.util.concurrent.Platform.isInstanceOfThrowableClass;
 
 import com.google.common.annotations.GwtCompatible;
@@ -26,13 +27,17 @@
 import com.google.errorprone.annotations.ForOverride;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Implementations of {@code Futures.catching*}. */
 @GwtCompatible
-abstract class AbstractCatchingFuture<V, X extends Throwable, F, T>
+@ElementTypesAreNonnullByDefault
+@SuppressWarnings("nullness") // TODO(b/147136275): Remove once our checker understands & and |.
+abstract class AbstractCatchingFuture<
+        V extends @Nullable Object, X extends Throwable, F, T extends @Nullable Object>
     extends FluentFuture.TrustedFuture<V> implements Runnable {
-  static <V, X extends Throwable> ListenableFuture<V> create(
+  static <V extends @Nullable Object, X extends Throwable> ListenableFuture<V> create(
       ListenableFuture<? extends V> input,
       Class<X> exceptionType,
       Function<? super X, ? extends V> fallback,
@@ -42,7 +47,7 @@
     return future;
   }
 
-  static <X extends Throwable, V> ListenableFuture<V> create(
+  static <X extends Throwable, V extends @Nullable Object> ListenableFuture<V> create(
       ListenableFuture<? extends V> input,
       Class<X> exceptionType,
       AsyncFunction<? super X, ? extends V> fallback,
@@ -56,9 +61,9 @@
    * In certain circumstances, this field might theoretically not be visible to an afterDone() call
    * triggered by cancel(). For details, see the comments on the fields of TimeoutFuture.
    */
-  @NullableDecl ListenableFuture<? extends V> inputFuture;
-  @NullableDecl Class<X> exceptionType;
-  @NullableDecl F fallback;
+  @CheckForNull ListenableFuture<? extends V> inputFuture;
+  @CheckForNull Class<X> exceptionType;
+  @CheckForNull F fallback;
 
   AbstractCatchingFuture(
       ListenableFuture<? extends V> inputFuture, Class<X> exceptionType, F fallback) {
@@ -107,7 +112,11 @@
     }
 
     if (throwable == null) {
-      set(sourceResult);
+      /*
+       * The cast is safe: There was no exception, so the assignment from getDone must have
+       * succeeded.
+       */
+      set(uncheckedCastNullableTToT(sourceResult));
       return;
     }
 
@@ -134,6 +143,7 @@
   }
 
   @Override
+  @CheckForNull
   protected String pendingToString() {
     ListenableFuture<? extends V> localInputFuture = inputFuture;
     Class<X> localExceptionType = exceptionType;
@@ -158,12 +168,12 @@
 
   /** Template method for subtypes to actually run the fallback. */
   @ForOverride
-  @NullableDecl
+  @ParametricNullness
   abstract T doFallback(F fallback, X throwable) throws Exception;
 
   /** Template method for subtypes to actually set the result. */
   @ForOverride
-  abstract void setResult(@NullableDecl T result);
+  abstract void setResult(@ParametricNullness T result);
 
   @Override
   protected final void afterDone() {
@@ -177,7 +187,7 @@
    * An {@link AbstractCatchingFuture} that delegates to an {@link AsyncFunction} and {@link
    * #setFuture(ListenableFuture)}.
    */
-  private static final class AsyncCatchingFuture<V, X extends Throwable>
+  private static final class AsyncCatchingFuture<V extends @Nullable Object, X extends Throwable>
       extends AbstractCatchingFuture<
           V, X, AsyncFunction<? super X, ? extends V>, ListenableFuture<? extends V>> {
     AsyncCatchingFuture(
@@ -209,7 +219,7 @@
    * An {@link AbstractCatchingFuture} that delegates to a {@link Function} and {@link
    * #set(Object)}.
    */
-  private static final class CatchingFuture<V, X extends Throwable>
+  private static final class CatchingFuture<V extends @Nullable Object, X extends Throwable>
       extends AbstractCatchingFuture<V, X, Function<? super X, ? extends V>, V> {
     CatchingFuture(
         ListenableFuture<? extends V> input,
@@ -219,13 +229,13 @@
     }
 
     @Override
-    @NullableDecl
+    @ParametricNullness
     V doFallback(Function<? super X, ? extends V> fallback, X cause) throws Exception {
       return fallback.apply(cause);
     }
 
     @Override
-    void setResult(@NullableDecl V result) {
+    void setResult(@ParametricNullness V result) {
       set(result);
     }
   }
diff --git a/android/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java b/android/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java
index 2bd392c..0dbafd3 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java
@@ -33,6 +33,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractExecutionThreadService implements Service {
   private static final Logger logger =
       Logger.getLogger(AbstractExecutionThreadService.class.getName());
diff --git a/android/guava/src/com/google/common/util/concurrent/AbstractFuture.java b/android/guava/src/com/google/common/util/concurrent/AbstractFuture.java
index e799241..624caa9 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractFuture.java
@@ -16,8 +16,10 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Throwables.throwIfUnchecked;
+import static com.google.common.util.concurrent.NullnessCasts.uncheckedNull;
 import static java.lang.Integer.toHexString;
 import static java.lang.System.identityHashCode;
+import static java.util.Objects.requireNonNull;
 import static java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater;
 
 import com.google.common.annotations.Beta;
@@ -43,7 +45,8 @@
 import java.util.concurrent.locks.LockSupport;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An abstract implementation of {@link ListenableFuture}, intended for advanced users only. More
@@ -64,10 +67,14 @@
  * @author Luke Sandberg
  * @since 1.0
  */
-@SuppressWarnings("ShortCircuitBoolean") // we use non-short circuiting comparisons intentionally
+@SuppressWarnings({
+  "ShortCircuitBoolean", // we use non-short circuiting comparisons intentionally
+  "nullness", // TODO(b/147136275): Remove once our checker understands & and |.
+})
 @GwtCompatible(emulated = true)
 @ReflectionSupport(value = ReflectionSupport.Level.FULL)
-public abstract class AbstractFuture<V> extends InternalFutureFailureAccess
+@ElementTypesAreNonnullByDefault
+public abstract class AbstractFuture<V extends @Nullable Object> extends InternalFutureFailureAccess
     implements ListenableFuture<V> {
   // NOTE: Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
 
@@ -91,21 +98,24 @@
    * of this interface must also be an AbstractFuture and must not override or expose for overriding
    * any of the public methods of ListenableFuture.
    */
-  interface Trusted<V> extends ListenableFuture<V> {}
+  interface Trusted<V extends @Nullable Object> extends ListenableFuture<V> {}
 
   /**
    * A less abstract subclass of AbstractFuture. This can be used to optimize setFuture by ensuring
    * that {@link #get} calls exactly the implementation of {@link AbstractFuture#get}.
    */
-  abstract static class TrustedFuture<V> extends AbstractFuture<V> implements Trusted<V> {
+  abstract static class TrustedFuture<V extends @Nullable Object> extends AbstractFuture<V>
+      implements Trusted<V> {
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public final V get() throws InterruptedException, ExecutionException {
       return super.get();
     }
 
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public final V get(long timeout, TimeUnit unit)
         throws InterruptedException, ExecutionException, TimeoutException {
       return super.get(timeout, unit);
@@ -191,8 +201,8 @@
   private static final class Waiter {
     static final Waiter TOMBSTONE = new Waiter(false /* ignored param */);
 
-    @NullableDecl volatile Thread thread;
-    @NullableDecl volatile Waiter next;
+    @CheckForNull volatile Thread thread;
+    @CheckForNull volatile Waiter next;
 
     /**
      * Constructor for the TOMBSTONE, avoids use of ATOMIC_HELPER in case this class is loaded
@@ -207,7 +217,7 @@
 
     // non-volatile write to the next field. Should be made visible by subsequent CAS on waiters
     // field.
-    void setNext(Waiter next) {
+    void setNext(@CheckForNull Waiter next) {
       ATOMIC_HELPER.putNext(this, next);
     }
 
@@ -264,17 +274,24 @@
 
   /** Listeners also form a stack through the {@link #listeners} field. */
   private static final class Listener {
-    static final Listener TOMBSTONE = new Listener(null, null);
+    static final Listener TOMBSTONE = new Listener();
+    @CheckForNull // null only for TOMBSTONE
     final Runnable task;
+    @CheckForNull // null only for TOMBSTONE
     final Executor executor;
 
     // writes to next are made visible by subsequent CAS's on the listeners field
-    @NullableDecl Listener next;
+    @CheckForNull Listener next;
 
     Listener(Runnable task, Executor executor) {
       this.task = task;
       this.executor = executor;
     }
+
+    Listener() {
+      this.task = null;
+      this.executor = null;
+    }
   }
 
   /** A special value to represent {@code null}. */
@@ -300,8 +317,8 @@
   /** A special value to represent cancellation and the 'wasInterrupted' bit. */
   private static final class Cancellation {
     // constants to use when GENERATE_CANCELLATION_CAUSES = false
-    static final Cancellation CAUSELESS_INTERRUPTED;
-    static final Cancellation CAUSELESS_CANCELLED;
+    @CheckForNull static final Cancellation CAUSELESS_INTERRUPTED;
+    @CheckForNull static final Cancellation CAUSELESS_CANCELLED;
 
     static {
       if (GENERATE_CANCELLATION_CAUSES) {
@@ -314,16 +331,16 @@
     }
 
     final boolean wasInterrupted;
-    @NullableDecl final Throwable cause;
+    @CheckForNull final Throwable cause;
 
-    Cancellation(boolean wasInterrupted, @NullableDecl Throwable cause) {
+    Cancellation(boolean wasInterrupted, @CheckForNull Throwable cause) {
       this.wasInterrupted = wasInterrupted;
       this.cause = cause;
     }
   }
 
   /** A special value that encodes the 'setFuture' state. */
-  private static final class SetFuture<V> implements Runnable {
+  private static final class SetFuture<V extends @Nullable Object> implements Runnable {
     final AbstractFuture<V> owner;
     final ListenableFuture<? extends V> future;
 
@@ -362,13 +379,13 @@
    *       argument.
    * </ul>
    */
-  @NullableDecl private volatile Object value;
+  @CheckForNull private volatile Object value;
 
   /** All listeners. */
-  @NullableDecl private volatile Listener listeners;
+  @CheckForNull private volatile Listener listeners;
 
   /** All waiting threads. */
-  @NullableDecl private volatile Waiter waiters;
+  @CheckForNull private volatile Waiter waiters;
 
   /** Constructor for use by subclasses. */
   protected AbstractFuture() {}
@@ -407,6 +424,7 @@
    */
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public V get(long timeout, TimeUnit unit)
       throws InterruptedException, TimeoutException, ExecutionException {
     // NOTE: if timeout < 0, remainingNanos will be < 0 and we will fall into the while(true) loop
@@ -459,7 +477,8 @@
       }
       // re-read value, if we get here then we must have observed a TOMBSTONE while trying to add a
       // waiter.
-      return getDoneValue(value);
+      // requireNonNull is safe because value is always set before TOMBSTONE.
+      return getDoneValue(requireNonNull(value));
     }
     // If we get here then we have remainingNanos < SPIN_THRESHOLD_NANOS and there is no node on the
     // waiters list
@@ -518,6 +537,7 @@
    */
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public V get() throws InterruptedException, ExecutionException {
     if (Thread.interrupted()) {
       throw new InterruptedException();
@@ -553,10 +573,12 @@
     }
     // re-read value, if we get here then we must have observed a TOMBSTONE while trying to add a
     // waiter.
-    return getDoneValue(value);
+    // requireNonNull is safe because value is always set before TOMBSTONE.
+    return getDoneValue(requireNonNull(value));
   }
 
   /** Unboxes {@code obj}. Assumes that obj is not {@code null} or a {@link SetFuture}. */
+  @ParametricNullness
   private V getDoneValue(Object obj) throws ExecutionException {
     // While this seems like it might be too branch-y, simple benchmarking proves it to be
     // unmeasurable (comparing done AbstractFutures with immediateFuture)
@@ -565,7 +587,11 @@
     } else if (obj instanceof Failure) {
       throw new ExecutionException(((Failure) obj).exception);
     } else if (obj == NULL) {
-      return null;
+      /*
+       * It's safe to return null because we would only have stored it in the first place if it were
+       * a valid value for V.
+       */
+      return uncheckedNull();
     } else {
       @SuppressWarnings("unchecked") // this is the only other option
       V asV = (V) obj;
@@ -613,9 +639,20 @@
           GENERATE_CANCELLATION_CAUSES
               ? new Cancellation(
                   mayInterruptIfRunning, new CancellationException("Future.cancel() was called."))
-              : (mayInterruptIfRunning
-                  ? Cancellation.CAUSELESS_INTERRUPTED
-                  : Cancellation.CAUSELESS_CANCELLED);
+              /*
+               * requireNonNull is safe because we've initialized these if
+               * !GENERATE_CANCELLATION_CAUSES.
+               *
+               * TODO(cpovirk): Maybe it would be cleaner to define a CancellationSupplier interface
+               * with two implementations, one that contains causeless Cancellation instances and
+               * the other of which creates new Cancellation instances each time it's called? Yet
+               * another alternative is to fill in a non-null value for each of the fields no matter
+               * what and to just not use it if !GENERATE_CANCELLATION_CAUSES.
+               */
+              : requireNonNull(
+                  mayInterruptIfRunning
+                      ? Cancellation.CAUSELESS_INTERRUPTED
+                      : Cancellation.CAUSELESS_CANCELLED);
       AbstractFuture<?> abstractFuture = this;
       while (true) {
         if (ATOMIC_HELPER.casValue(abstractFuture, localValue, valueToSet)) {
@@ -740,7 +777,7 @@
    * @return true if the attempt was accepted, completing the {@code Future}
    */
   @CanIgnoreReturnValue
-  protected boolean set(@NullableDecl V value) {
+  protected boolean set(@ParametricNullness V value) {
     Object valueToSet = value == null ? NULL : value;
     if (ATOMIC_HELPER.casValue(this, null, valueToSet)) {
       complete(this);
@@ -816,7 +853,7 @@
         }
         return false;
       }
-      SetFuture valueToSet = new SetFuture<V>(this, future);
+      SetFuture<V> valueToSet = new SetFuture<V>(this, future);
       if (ATOMIC_HELPER.casValue(this, null, valueToSet)) {
         // the listener is responsible for calling completeWithFuture, directExecutor is appropriate
         // since all we are doing is unpacking a completed future which should be fast.
@@ -873,7 +910,8 @@
                   : Cancellation.CAUSELESS_CANCELLED;
         }
       }
-      return v;
+      // requireNonNull is safe as long as we call this method only on completed futures.
+      return requireNonNull(v);
     }
     if (future instanceof InternalFutureFailureAccess) {
       Throwable throwable =
@@ -885,7 +923,11 @@
     boolean wasCancelled = future.isCancelled();
     // Don't allocate a CancellationException if it's not necessary
     if (!GENERATE_CANCELLATION_CAUSES & wasCancelled) {
-      return Cancellation.CAUSELESS_CANCELLED;
+      /*
+       * requireNonNull is safe because we've initialized CAUSELESS_CANCELLED if
+       * !GENERATE_CANCELLATION_CAUSES.
+       */
+      return requireNonNull(Cancellation.CAUSELESS_CANCELLED);
     }
     // Otherwise calculate the value by calling .get()
     try {
@@ -928,7 +970,9 @@
    * An inlined private copy of {@link Uninterruptibles#getUninterruptibly} used to break an
    * internal dependency on other /util/concurrent classes.
    */
-  private static <V> V getUninterruptibly(Future<V> future) throws ExecutionException {
+  @ParametricNullness
+  private static <V extends @Nullable Object> V getUninterruptibly(Future<V> future)
+      throws ExecutionException {
     boolean interrupted = false;
     try {
       while (true) {
@@ -946,7 +990,10 @@
   }
 
   /** Unblocks all threads and runs all listeners. */
-  private static void complete(AbstractFuture<?> future) {
+  private static void complete(AbstractFuture<?> param) {
+    // Declare a "true" local variable so that the Checker Framework will infer nullness.
+    AbstractFuture<?> future = param;
+
     Listener next = null;
     outer:
     while (true) {
@@ -963,7 +1010,11 @@
       while (next != null) {
         Listener curr = next;
         next = next.next;
-        Runnable task = curr.task;
+        /*
+         * requireNonNull is safe because the listener stack never contains TOMBSTONE until after
+         * clearListeners.
+         */
+        Runnable task = requireNonNull(curr.task);
         if (task instanceof SetFuture) {
           SetFuture<?> setFuture = (SetFuture<?>) task;
           // We unwind setFuture specifically to avoid StackOverflowErrors in the case of long
@@ -980,7 +1031,11 @@
           }
           // other wise the future we were trying to set is already done.
         } else {
-          executeListener(task, curr.executor);
+          /*
+           * requireNonNull is safe because the listener stack never contains TOMBSTONE until after
+           * clearListeners.
+           */
+          executeListener(task, requireNonNull(curr.executor));
         }
       }
       break;
@@ -1024,7 +1079,13 @@
    * @since 27.0
    */
   @Override
-  @NullableDecl
+  /*
+   * We should annotate the superclass, InternalFutureFailureAccess, to say that its copy of this
+   * method returns @Nullable, too. However, we're not sure if we want to make any changes to that
+   * class, since it's in a separate artifact that we planned to release only a single version of.
+   */
+  @SuppressWarnings("nullness")
+  @CheckForNull
   protected final Throwable tryInternalFastPathGetFailure() {
     if (this instanceof Trusted) {
       Object obj = value;
@@ -1039,7 +1100,7 @@
    * If this future has been cancelled (and possibly interrupted), cancels (and possibly interrupts)
    * the given future (if available).
    */
-  final void maybePropagateCancellationTo(@NullableDecl Future<?> related) {
+  final void maybePropagateCancellationTo(@CheckForNull Future<?> related) {
     if (related != null & isCancelled()) {
       related.cancel(wasInterrupted());
     }
@@ -1060,7 +1121,8 @@
    * Clears the {@link #listeners} list and prepends its contents to {@code onto}, least recently
    * added first.
    */
-  private Listener clearListeners(Listener onto) {
+  @CheckForNull
+  private Listener clearListeners(@CheckForNull Listener onto) {
     // We need to
     // 1. atomically swap the listeners with TOMBSTONE, this is because addListener uses that to
     //    to synchronize with us
@@ -1108,7 +1170,7 @@
    * @return null if an explanation cannot be provided (e.g. because the future is done).
    * @since 23.0
    */
-  @NullableDecl
+  @CheckForNull
   protected String pendingToString() {
     // TODO(diamondm) consider moving this into addPendingString so it's always in the output
     if (this instanceof ScheduledFuture) {
@@ -1174,7 +1236,7 @@
    * implementation. Using a reconstruction of the default Object.toString() prevents OOMs and stack
    * overflows, and helps avoid sensitive data inadvertently ending up in exception messages.
    */
-  private void appendResultObject(StringBuilder builder, Object o) {
+  private void appendResultObject(StringBuilder builder, @CheckForNull Object o) {
     if (o == null) {
       builder.append("null");
     } else if (o == this) {
@@ -1188,7 +1250,7 @@
   }
 
   /** Helper for printing user supplied objects into our toString method. */
-  private void appendUserObject(StringBuilder builder, Object o) {
+  private void appendUserObject(StringBuilder builder, @CheckForNull Object o) {
     // This is some basic recursion detection for when people create cycles via set/setFuture or
     // when deep chains of futures exist resulting in a StackOverflowException. We could detect
     // arbitrary cycles using a thread local but this should be a good enough solution (it is also
@@ -1229,16 +1291,18 @@
     abstract void putThread(Waiter waiter, Thread newValue);
 
     /** Non volatile write of the waiter to the {@link Waiter#next} field. */
-    abstract void putNext(Waiter waiter, Waiter newValue);
+    abstract void putNext(Waiter waiter, @CheckForNull Waiter newValue);
 
     /** Performs a CAS operation on the {@link #waiters} field. */
-    abstract boolean casWaiters(AbstractFuture<?> future, Waiter expect, Waiter update);
+    abstract boolean casWaiters(
+        AbstractFuture<?> future, @CheckForNull Waiter expect, @CheckForNull Waiter update);
 
     /** Performs a CAS operation on the {@link #listeners} field. */
-    abstract boolean casListeners(AbstractFuture<?> future, Listener expect, Listener update);
+    abstract boolean casListeners(
+        AbstractFuture<?> future, @CheckForNull Listener expect, Listener update);
 
     /** Performs a CAS operation on the {@link #value} field. */
-    abstract boolean casValue(AbstractFuture<?> future, Object expect, Object update);
+    abstract boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update);
   }
 
   /**
@@ -1247,6 +1311,7 @@
    * <p>Static initialization of this class will fail if the {@link sun.misc.Unsafe} object cannot
    * be accessed.
    */
+  @SuppressWarnings("sunapi")
   private static final class UnsafeAtomicHelper extends AtomicHelper {
     static final sun.misc.Unsafe UNSAFE;
     static final long LISTENERS_OFFSET;
@@ -1301,30 +1366,32 @@
     }
 
     @Override
-    void putNext(Waiter waiter, Waiter newValue) {
+    void putNext(Waiter waiter, @CheckForNull Waiter newValue) {
       UNSAFE.putObject(waiter, WAITER_NEXT_OFFSET, newValue);
     }
 
     /** Performs a CAS operation on the {@link #waiters} field. */
     @Override
-    boolean casWaiters(AbstractFuture<?> future, Waiter expect, Waiter update) {
+    boolean casWaiters(
+        AbstractFuture<?> future, @CheckForNull Waiter expect, @CheckForNull Waiter update) {
       return UNSAFE.compareAndSwapObject(future, WAITERS_OFFSET, expect, update);
     }
 
     /** Performs a CAS operation on the {@link #listeners} field. */
     @Override
-    boolean casListeners(AbstractFuture<?> future, Listener expect, Listener update) {
+    boolean casListeners(AbstractFuture<?> future, @CheckForNull Listener expect, Listener update) {
       return UNSAFE.compareAndSwapObject(future, LISTENERS_OFFSET, expect, update);
     }
 
     /** Performs a CAS operation on the {@link #value} field. */
     @Override
-    boolean casValue(AbstractFuture<?> future, Object expect, Object update) {
+    boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
       return UNSAFE.compareAndSwapObject(future, VALUE_OFFSET, expect, update);
     }
   }
 
   /** {@link AtomicHelper} based on {@link AtomicReferenceFieldUpdater}. */
+  @SuppressWarnings("rawtypes")
   private static final class SafeAtomicHelper extends AtomicHelper {
     final AtomicReferenceFieldUpdater<Waiter, Thread> waiterThreadUpdater;
     final AtomicReferenceFieldUpdater<Waiter, Waiter> waiterNextUpdater;
@@ -1351,22 +1418,23 @@
     }
 
     @Override
-    void putNext(Waiter waiter, Waiter newValue) {
+    void putNext(Waiter waiter, @CheckForNull Waiter newValue) {
       waiterNextUpdater.lazySet(waiter, newValue);
     }
 
     @Override
-    boolean casWaiters(AbstractFuture<?> future, Waiter expect, Waiter update) {
+    boolean casWaiters(
+        AbstractFuture<?> future, @CheckForNull Waiter expect, @CheckForNull Waiter update) {
       return waitersUpdater.compareAndSet(future, expect, update);
     }
 
     @Override
-    boolean casListeners(AbstractFuture<?> future, Listener expect, Listener update) {
+    boolean casListeners(AbstractFuture<?> future, @CheckForNull Listener expect, Listener update) {
       return listenersUpdater.compareAndSet(future, expect, update);
     }
 
     @Override
-    boolean casValue(AbstractFuture<?> future, Object expect, Object update) {
+    boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
       return valueUpdater.compareAndSet(future, expect, update);
     }
   }
@@ -1384,12 +1452,13 @@
     }
 
     @Override
-    void putNext(Waiter waiter, Waiter newValue) {
+    void putNext(Waiter waiter, @CheckForNull Waiter newValue) {
       waiter.next = newValue;
     }
 
     @Override
-    boolean casWaiters(AbstractFuture<?> future, Waiter expect, Waiter update) {
+    boolean casWaiters(
+        AbstractFuture<?> future, @CheckForNull Waiter expect, @CheckForNull Waiter update) {
       synchronized (future) {
         if (future.waiters == expect) {
           future.waiters = update;
@@ -1400,7 +1469,7 @@
     }
 
     @Override
-    boolean casListeners(AbstractFuture<?> future, Listener expect, Listener update) {
+    boolean casListeners(AbstractFuture<?> future, @CheckForNull Listener expect, Listener update) {
       synchronized (future) {
         if (future.listeners == expect) {
           future.listeners = update;
@@ -1411,7 +1480,7 @@
     }
 
     @Override
-    boolean casValue(AbstractFuture<?> future, Object expect, Object update) {
+    boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
       synchronized (future) {
         if (future.value == expect) {
           future.value = update;
@@ -1423,7 +1492,7 @@
   }
 
   private static CancellationException cancellationExceptionWithCause(
-      @NullableDecl String message, @NullableDecl Throwable cause) {
+      String message, @CheckForNull Throwable cause) {
     CancellationException exception = new CancellationException(message);
     exception.initCause(cause);
     return exception;
diff --git a/android/guava/src/com/google/common/util/concurrent/AbstractIdleService.java b/android/guava/src/com/google/common/util/concurrent/AbstractIdleService.java
index 7416a9b..05bc4b9 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractIdleService.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractIdleService.java
@@ -31,6 +31,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractIdleService implements Service {
 
   /* Thread names will look like {@code "MyService STARTING"}. */
diff --git a/android/guava/src/com/google/common/util/concurrent/AbstractListeningExecutorService.java b/android/guava/src/com/google/common/util/concurrent/AbstractListeningExecutorService.java
index 22157ba..fd5c5c9 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractListeningExecutorService.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractListeningExecutorService.java
@@ -20,7 +20,7 @@
 import java.util.concurrent.AbstractExecutorService;
 import java.util.concurrent.Callable;
 import java.util.concurrent.RunnableFuture;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Abstract {@link ListeningExecutorService} implementation that creates {@link ListenableFuture}
@@ -36,18 +36,20 @@
 @Beta
 @CanIgnoreReturnValue
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractListeningExecutorService extends AbstractExecutorService
     implements ListeningExecutorService {
 
   /** @since 19.0 (present with return type {@code ListenableFutureTask} since 14.0) */
   @Override
-  protected final <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
+  protected final <T extends @Nullable Object> RunnableFuture<T> newTaskFor(
+      Runnable runnable, @ParametricNullness T value) {
     return TrustedListenableFutureTask.create(runnable, value);
   }
 
   /** @since 19.0 (present with return type {@code ListenableFutureTask} since 14.0) */
   @Override
-  protected final <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
+  protected final <T extends @Nullable Object> RunnableFuture<T> newTaskFor(Callable<T> callable) {
     return TrustedListenableFutureTask.create(callable);
   }
 
@@ -57,12 +59,13 @@
   }
 
   @Override
-  public <T> ListenableFuture<T> submit(Runnable task, @NullableDecl T result) {
+  public <T extends @Nullable Object> ListenableFuture<T> submit(
+      Runnable task, @ParametricNullness T result) {
     return (ListenableFuture<T>) super.submit(task, result);
   }
 
   @Override
-  public <T> ListenableFuture<T> submit(Callable<T> task) {
+  public <T extends @Nullable Object> ListenableFuture<T> submit(Callable<T> task) {
     return (ListenableFuture<T>) super.submit(task);
   }
 }
diff --git a/android/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java b/android/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
index 70d4fb7..7288ba5 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
@@ -16,7 +16,9 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.util.concurrent.Futures.immediateCancelledFuture;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Supplier;
@@ -28,13 +30,15 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Base class for services that can implement {@link #startUp} and {@link #shutDown} but while in
@@ -94,6 +98,7 @@
  * @since 11.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractScheduledService implements Service {
   private static final Logger logger = Logger.getLogger(AbstractScheduledService.class.getName());
 
@@ -126,9 +131,10 @@
       checkArgument(delay > 0, "delay must be > 0, found %s", delay);
       return new Scheduler() {
         @Override
-        public Future<?> schedule(
+        public Cancellable schedule(
             AbstractService service, ScheduledExecutorService executor, Runnable task) {
-          return executor.scheduleWithFixedDelay(task, initialDelay, delay, unit);
+          return new FutureAsCancellable(
+              executor.scheduleWithFixedDelay(task, initialDelay, delay, unit));
         }
       };
     }
@@ -148,15 +154,16 @@
       checkArgument(period > 0, "period must be > 0, found %s", period);
       return new Scheduler() {
         @Override
-        public Future<?> schedule(
+        public Cancellable schedule(
             AbstractService service, ScheduledExecutorService executor, Runnable task) {
-          return executor.scheduleAtFixedRate(task, initialDelay, period, unit);
+          return new FutureAsCancellable(
+              executor.scheduleAtFixedRate(task, initialDelay, period, unit));
         }
       };
     }
 
     /** Schedules the task to run on the provided executor on behalf of the service. */
-    abstract Future<?> schedule(
+    abstract Cancellable schedule(
         AbstractService service, ScheduledExecutorService executor, Runnable runnable);
 
     private Scheduler() {}
@@ -170,8 +177,8 @@
 
     // A handle to the running task so that we can stop it when a shutdown has been requested.
     // These two fields are volatile because their values will be accessed from multiple threads.
-    @NullableDecl private volatile Future<?> runningTask;
-    @NullableDecl private volatile ScheduledExecutorService executorService;
+    @CheckForNull private volatile Cancellable runningTask;
+    @CheckForNull private volatile ScheduledExecutorService executorService;
 
     // This lock protects the task so we can ensure that none of the template methods (startUp,
     // shutDown or runOneIteration) run concurrently with one another.
@@ -185,7 +192,11 @@
       public void run() {
         lock.lock();
         try {
-          if (runningTask.isCancelled()) {
+          /*
+           * requireNonNull is safe because Task isn't run (or at least it doesn't succeed in taking
+           * the lock) until after it's scheduled and the runningTask field is set.
+           */
+          if (requireNonNull(runningTask).isCancelled()) {
             // task may have been cancelled while blocked on the lock.
             return;
           }
@@ -200,7 +211,8 @@
                 ignored);
           }
           notifyFailed(t);
-          runningTask.cancel(false); // prevent future invocations.
+          // requireNonNull is safe now, just as it was above.
+          requireNonNull(runningTask).cancel(false); // prevent future invocations.
         } finally {
           lock.unlock();
         }
@@ -244,6 +256,9 @@
 
     @Override
     protected final void doStop() {
+      // Both requireNonNull calls are safe because doStop can run only after a successful doStart.
+      requireNonNull(runningTask);
+      requireNonNull(executorService);
       runningTask.cancel(false);
       executorService.execute(
           new Runnable() {
@@ -316,9 +331,9 @@
    * fails}. Subclasses may override this method to supply a custom {@link ScheduledExecutorService}
    * instance. This method is guaranteed to only be called once.
    *
-   * <p>By default this returns a new {@link ScheduledExecutorService} with a single thread thread
-   * pool that sets the name of the thread to the {@linkplain #serviceName() service name}. Also,
-   * the pool will be {@linkplain ScheduledExecutorService#shutdown() shut down} when the service
+   * <p>By default this returns a new {@link ScheduledExecutorService} with a single thread pool
+   * that sets the name of the thread to the {@linkplain #serviceName() service name}. Also, the
+   * pool will be {@linkplain ScheduledExecutorService#shutdown() shut down} when the service
    * {@linkplain Service.State#TERMINATED terminates} or {@linkplain Service.State#TERMINATED
    * fails}.
    */
@@ -430,6 +445,30 @@
     delegate.awaitTerminated(timeout, unit);
   }
 
+  interface Cancellable {
+    void cancel(boolean mayInterruptIfRunning);
+
+    boolean isCancelled();
+  }
+
+  private static final class FutureAsCancellable implements Cancellable {
+    private final Future<?> delegate;
+
+    FutureAsCancellable(Future<?> delegate) {
+      this.delegate = delegate;
+    }
+
+    @Override
+    public void cancel(boolean mayInterruptIfRunning) {
+      delegate.cancel(mayInterruptIfRunning);
+    }
+
+    @Override
+    public boolean isCancelled() {
+      return delegate.isCancelled();
+    }
+  }
+
   /**
    * A {@link Scheduler} that provides a convenient way for the {@link AbstractScheduledService} to
    * use a dynamically changing schedule. After every execution of the task, assuming it hasn't been
@@ -441,7 +480,7 @@
   public abstract static class CustomScheduler extends Scheduler {
 
     /** A callable class that can reschedule itself using a {@link CustomScheduler}. */
-    private class ReschedulableCallable extends ForwardingFuture<Void> implements Callable<Void> {
+    private final class ReschedulableCallable implements Callable<@Nullable Void> {
 
       /** The underlying task. */
       private final Runnable wrappedRunnable;
@@ -453,6 +492,27 @@
        * The service that is managing this callable. This is used so that failure can be reported
        * properly.
        */
+      /*
+       * This reference is part of a reference cycle, which is typically something we want to avoid
+       * under j2objc -- but it is not detected by our j2objc cycle test. The cycle:
+       *
+       * - CustomScheduler.service contains an instance of ServiceDelegate. (It needs it so that it
+       *   can call notifyFailed.)
+       *
+       * - ServiceDelegate.runningTask contains an instance of ReschedulableCallable (at least in
+       *   the case that the service is using CustomScheduler). (It needs it so that it can cancel
+       *   the task and detect whether it has been cancelled.)
+       *
+       * - ReschedulableCallable has a reference back to its enclosing CustomScheduler. (It needs it
+       *   so that it can call getNextSchedule).
+       *
+       * Maybe there is a way to avoid this cycle. But we think the cycle is safe enough to ignore:
+       * Each task is retained for only as long as it is running -- so it's retained only as long as
+       * it would already be retained by the underlying executor.
+       *
+       * If the cycle test starts reporting this cycle in the future, we should add an entry to
+       * cycle_suppress_list.txt.
+       */
       private final AbstractService service;
 
       /**
@@ -464,8 +524,8 @@
 
       /** The future that represents the next execution of this task. */
       @GuardedBy("lock")
-      @NullableDecl
-      private Future<Void> currentFuture;
+      @CheckForNull
+      private SupplantableFuture cancellationDelegate;
 
       ReschedulableCallable(
           AbstractService service, ScheduledExecutorService executor, Runnable runnable) {
@@ -475,32 +535,36 @@
       }
 
       @Override
+      @CheckForNull
       public Void call() throws Exception {
         wrappedRunnable.run();
         reschedule();
         return null;
       }
 
-      /** Atomically reschedules this task and assigns the new future to {@link #currentFuture}. */
-      public void reschedule() {
+      /**
+       * Atomically reschedules this task and assigns the new future to {@link
+       * #cancellationDelegate}.
+       */
+      @CanIgnoreReturnValue
+      public Cancellable reschedule() {
         // invoke the callback outside the lock, prevents some shenanigans.
         Schedule schedule;
         try {
           schedule = CustomScheduler.this.getNextSchedule();
         } catch (Throwable t) {
           service.notifyFailed(t);
-          return;
+          return new FutureAsCancellable(immediateCancelledFuture());
         }
         // We reschedule ourselves with a lock held for two reasons. 1. we want to make sure that
         // cancel calls cancel on the correct future. 2. we want to make sure that the assignment
         // to currentFuture doesn't race with itself so that currentFuture is assigned in the
         // correct order.
         Throwable scheduleFailure = null;
+        Cancellable toReturn;
         lock.lock();
         try {
-          if (currentFuture == null || !currentFuture.isCancelled()) {
-            currentFuture = executor.schedule(this, schedule.delay, schedule.unit);
-          }
+          toReturn = initializeOrUpdateCancellationDelegate(schedule);
         } catch (Throwable e) {
           // If an exception is thrown by the subclass then we need to make sure that the service
           // notices and transitions to the FAILED state. We do it by calling notifyFailed directly
@@ -511,6 +575,7 @@
           // the AbstractService could monitor the future directly. Rescheduling is still hard...
           // but it would help with some of these lock ordering issues.
           scheduleFailure = e;
+          toReturn = new FutureAsCancellable(immediateCancelledFuture());
         } finally {
           lock.unlock();
         }
@@ -518,16 +583,63 @@
         if (scheduleFailure != null) {
           service.notifyFailed(scheduleFailure);
         }
+        return toReturn;
       }
 
-      // N.B. Only protect cancel and isCancelled because those are the only methods that are
-      // invoked by the AbstractScheduledService.
+      @GuardedBy("lock")
+      /*
+       * The GuardedBy checker warns us that we're not holding cancellationDelegate.lock. But in
+       * fact we are holding it because it is the same as this.lock, which we know we are holding,
+       * thanks to @GuardedBy above. (cancellationDelegate.lock is initialized to this.lock in the
+       * call to `new SupplantableFuture` below.)
+       */
+      @SuppressWarnings("GuardedBy")
+      private Cancellable initializeOrUpdateCancellationDelegate(Schedule schedule) {
+        if (cancellationDelegate == null) {
+          return cancellationDelegate = new SupplantableFuture(lock, submitToExecutor(schedule));
+        }
+        if (!cancellationDelegate.currentFuture.isCancelled()) {
+          cancellationDelegate.currentFuture = submitToExecutor(schedule);
+        }
+        return cancellationDelegate;
+      }
+
+      private ScheduledFuture<@Nullable Void> submitToExecutor(Schedule schedule) {
+        return executor.schedule(this, schedule.delay, schedule.unit);
+      }
+    }
+
+    /**
+     * Contains the most recently submitted {@code Future}, which may be cancelled or updated,
+     * always under a lock.
+     */
+    private static final class SupplantableFuture implements Cancellable {
+      private final ReentrantLock lock;
+
+      @GuardedBy("lock")
+      private Future<@Nullable Void> currentFuture;
+
+      SupplantableFuture(ReentrantLock lock, Future<@Nullable Void> currentFuture) {
+        this.lock = lock;
+        this.currentFuture = currentFuture;
+      }
+
       @Override
-      public boolean cancel(boolean mayInterruptIfRunning) {
-        // Ensure that a task cannot be rescheduled while a cancel is ongoing.
+      public void cancel(boolean mayInterruptIfRunning) {
+        /*
+         * Lock to ensure that a task cannot be rescheduled while a cancel is ongoing.
+         *
+         * In theory, cancel() could execute arbitrary listeners -- bad to do while holding a lock.
+         * However, we don't expose currentFuture to users, so they can't attach listeners. And the
+         * Future might not even be a ListenableFuture, just a plain Future. That said, similar
+         * problems can exist with methods like FutureTask.done(), not to mention slow calls to
+         * Thread.interrupt() (as discussed in InterruptibleTask). At the end of the day, it's
+         * unlikely that cancel() will be slow, so we can probably get away with calling it while
+         * holding a lock. Still, it would be nice to avoid somehow.
+         */
         lock.lock();
         try {
-          return currentFuture.cancel(mayInterruptIfRunning);
+          currentFuture.cancel(mayInterruptIfRunning);
         } finally {
           lock.unlock();
         }
@@ -542,20 +654,12 @@
           lock.unlock();
         }
       }
-
-      @Override
-      protected Future<Void> delegate() {
-        throw new UnsupportedOperationException(
-            "Only cancel and isCancelled is supported by this future");
-      }
     }
 
     @Override
-    final Future<?> schedule(
+    final Cancellable schedule(
         AbstractService service, ScheduledExecutorService executor, Runnable runnable) {
-      ReschedulableCallable task = new ReschedulableCallable(service, executor, runnable);
-      task.reschedule();
-      return task;
+      return new ReschedulableCallable(service, executor, runnable).reschedule();
     }
 
     /**
diff --git a/android/guava/src/com/google/common/util/concurrent/AbstractService.java b/android/guava/src/com/google/common/util/concurrent/AbstractService.java
index 733bf3b..1cf31bf 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractService.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractService.java
@@ -23,6 +23,7 @@
 import static com.google.common.util.concurrent.Service.State.STARTING;
 import static com.google.common.util.concurrent.Service.State.STOPPING;
 import static com.google.common.util.concurrent.Service.State.TERMINATED;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -35,7 +36,7 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Base class for implementing services that can handle {@link #doStart} and {@link #doStop}
@@ -48,6 +49,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractService implements Service {
   private static final ListenerCallQueue.Event<Listener> STARTING_EVENT =
       new ListenerCallQueue.Event<Listener>() {
@@ -169,7 +171,7 @@
 
     @Override
     public boolean isSatisfied() {
-      return state().isTerminal();
+      return state().compareTo(TERMINATED) >= 0;
     }
   }
 
@@ -575,20 +577,20 @@
      * The exception that caused this service to fail. This will be {@code null} unless the service
      * has failed.
      */
-    @NullableDecl final Throwable failure;
+    @CheckForNull final Throwable failure;
 
     StateSnapshot(State internalState) {
       this(internalState, false, null);
     }
 
     StateSnapshot(
-        State internalState, boolean shutdownWhenStartupFinishes, @NullableDecl Throwable failure) {
+        State internalState, boolean shutdownWhenStartupFinishes, @CheckForNull Throwable failure) {
       checkArgument(
           !shutdownWhenStartupFinishes || internalState == STARTING,
           "shutdownWhenStartupFinishes can only be set if state is STARTING. Got %s instead.",
           internalState);
       checkArgument(
-          !(failure != null ^ internalState == FAILED),
+          (failure != null) == (internalState == FAILED),
           "A failure cause should be set if and only if the state is failed.  Got %s and %s "
               + "instead.",
           internalState,
@@ -613,7 +615,8 @@
           state == FAILED,
           "failureCause() is only valid if the service has failed, service is %s",
           state);
-      return failure;
+      // requireNonNull is safe because the constructor requires a non-null cause with state=FAILED.
+      return requireNonNull(failure);
     }
   }
 }
diff --git a/android/guava/src/com/google/common/util/concurrent/AbstractTransformFuture.java b/android/guava/src/com/google/common/util/concurrent/AbstractTransformFuture.java
index 4b908dc..dd68791 100644
--- a/android/guava/src/com/google/common/util/concurrent/AbstractTransformFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/AbstractTransformFuture.java
@@ -24,13 +24,17 @@
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Implementations of {@code Futures.transform*}. */
 @GwtCompatible
-abstract class AbstractTransformFuture<I, O, F, T> extends FluentFuture.TrustedFuture<O>
-    implements Runnable {
-  static <I, O> ListenableFuture<O> create(
+@ElementTypesAreNonnullByDefault
+@SuppressWarnings("nullness") // TODO(b/147136275): Remove once our checker understands & and |.
+abstract class AbstractTransformFuture<
+        I extends @Nullable Object, O extends @Nullable Object, F, T extends @Nullable Object>
+    extends FluentFuture.TrustedFuture<O> implements Runnable {
+  static <I extends @Nullable Object, O extends @Nullable Object> ListenableFuture<O> create(
       ListenableFuture<I> input,
       AsyncFunction<? super I, ? extends O> function,
       Executor executor) {
@@ -40,7 +44,7 @@
     return output;
   }
 
-  static <I, O> ListenableFuture<O> create(
+  static <I extends @Nullable Object, O extends @Nullable Object> ListenableFuture<O> create(
       ListenableFuture<I> input, Function<? super I, ? extends O> function, Executor executor) {
     checkNotNull(function);
     TransformFuture<I, O> output = new TransformFuture<>(input, function);
@@ -52,8 +56,8 @@
    * In certain circumstances, this field might theoretically not be visible to an afterDone() call
    * triggered by cancel(). For details, see the comments on the fields of TimeoutFuture.
    */
-  @NullableDecl ListenableFuture<? extends I> inputFuture;
-  @NullableDecl F function;
+  @CheckForNull ListenableFuture<? extends I> inputFuture;
+  @CheckForNull F function;
 
   AbstractTransformFuture(ListenableFuture<? extends I> inputFuture, F function) {
     this.inputFuture = checkNotNull(inputFuture);
@@ -165,12 +169,12 @@
 
   /** Template method for subtypes to actually run the transform. */
   @ForOverride
-  @NullableDecl
-  abstract T doTransform(F function, @NullableDecl I result) throws Exception;
+  @ParametricNullness
+  abstract T doTransform(F function, @ParametricNullness I result) throws Exception;
 
   /** Template method for subtypes to actually set the result. */
   @ForOverride
-  abstract void setResult(@NullableDecl T result);
+  abstract void setResult(@ParametricNullness T result);
 
   @Override
   protected final void afterDone() {
@@ -180,6 +184,7 @@
   }
 
   @Override
+  @CheckForNull
   protected String pendingToString() {
     ListenableFuture<? extends I> localInputFuture = inputFuture;
     F localFunction = function;
@@ -200,7 +205,8 @@
    * An {@link AbstractTransformFuture} that delegates to an {@link AsyncFunction} and {@link
    * #setFuture(ListenableFuture)}.
    */
-  private static final class AsyncTransformFuture<I, O>
+  private static final class AsyncTransformFuture<
+          I extends @Nullable Object, O extends @Nullable Object>
       extends AbstractTransformFuture<
           I, O, AsyncFunction<? super I, ? extends O>, ListenableFuture<? extends O>> {
     AsyncTransformFuture(
@@ -210,7 +216,8 @@
 
     @Override
     ListenableFuture<? extends O> doTransform(
-        AsyncFunction<? super I, ? extends O> function, @NullableDecl I input) throws Exception {
+        AsyncFunction<? super I, ? extends O> function, @ParametricNullness I input)
+        throws Exception {
       ListenableFuture<? extends O> outputFuture = function.apply(input);
       checkNotNull(
           outputFuture,
@@ -230,7 +237,7 @@
    * An {@link AbstractTransformFuture} that delegates to a {@link Function} and {@link
    * #set(Object)}.
    */
-  private static final class TransformFuture<I, O>
+  private static final class TransformFuture<I extends @Nullable Object, O extends @Nullable Object>
       extends AbstractTransformFuture<I, O, Function<? super I, ? extends O>, O> {
     TransformFuture(
         ListenableFuture<? extends I> inputFuture, Function<? super I, ? extends O> function) {
@@ -238,13 +245,13 @@
     }
 
     @Override
-    @NullableDecl
-    O doTransform(Function<? super I, ? extends O> function, @NullableDecl I input) {
+    @ParametricNullness
+    O doTransform(Function<? super I, ? extends O> function, @ParametricNullness I input) {
       return function.apply(input);
     }
 
     @Override
-    void setResult(@NullableDecl O result) {
+    void setResult(@ParametricNullness O result) {
       set(result);
     }
   }
diff --git a/android/guava/src/com/google/common/util/concurrent/AggregateFuture.java b/android/guava/src/com/google/common/util/concurrent/AggregateFuture.java
index 244f9fd..a32e76c 100644
--- a/android/guava/src/com/google/common/util/concurrent/AggregateFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/AggregateFuture.java
@@ -20,6 +20,7 @@
 import static com.google.common.util.concurrent.AggregateFuture.ReleaseResourcesReason.OUTPUT_FUTURE_DONE;
 import static com.google.common.util.concurrent.Futures.getDone;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.Objects.requireNonNull;
 import static java.util.logging.Level.SEVERE;
 
 import com.google.common.annotations.GwtCompatible;
@@ -30,7 +31,8 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A future whose value is derived from a collection of input futures.
@@ -39,7 +41,9 @@
  * @param <OutputT> the type of the output (i.e. this) future
  */
 @GwtCompatible
-abstract class AggregateFuture<InputT, OutputT> extends AggregateFutureState<OutputT> {
+@ElementTypesAreNonnullByDefault
+abstract class AggregateFuture<InputT extends @Nullable Object, OutputT extends @Nullable Object>
+    extends AggregateFutureState<OutputT> {
   private static final Logger logger = Logger.getLogger(AggregateFuture.class.getName());
 
   /**
@@ -52,7 +56,7 @@
    * In certain circumstances, this field might theoretically not be visible to an afterDone() call
    * triggered by cancel(). For details, see the comments on the fields of TimeoutFuture.
    */
-  @NullableDecl private ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures;
+  @CheckForNull private ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures;
 
   private final boolean allMustSucceed;
   private final boolean collectsValues;
@@ -87,6 +91,7 @@
   }
 
   @Override
+  @CheckForNull
   protected final String pendingToString() {
     ImmutableCollection<? extends Future<?>> localFutures = futures;
     if (localFutures != null) {
@@ -103,6 +108,13 @@
    * we're guaranteed to have properly initialized the subclass.
    */
   final void init() {
+    /*
+     * requireNonNull is safe because this is called from the constructor after `futures` is set but
+     * before releaseResources could be called (because we have not yet set up any of the listeners
+     * that could call it, nor exposed this Future for users to call cancel() on).
+     */
+    requireNonNull(futures);
+
     // Corner case: List is empty.
     if (futures.isEmpty()) {
       handleAllCompleted();
@@ -234,8 +246,14 @@
   final void addInitialException(Set<Throwable> seen) {
     checkNotNull(seen);
     if (!isCancelled()) {
-      // TODO(cpovirk): Think about whether we could/should use Verify to check this.
-      boolean unused = addCausalChain(seen, tryInternalFastPathGetFailure());
+      /*
+       * requireNonNull is safe because this is a TrustedFuture, and we're calling this method only
+       * if it has failed.
+       *
+       * TODO(cpovirk): Think about whether we could/should use Verify to check the return value of
+       * addCausalChain.
+       */
+      boolean unused = addCausalChain(seen, requireNonNull(tryInternalFastPathGetFailure()));
     }
   }
 
@@ -255,7 +273,7 @@
   }
 
   private void decrementCountAndMaybeComplete(
-      @NullableDecl
+      @CheckForNull
           ImmutableCollection<? extends Future<? extends InputT>>
               futuresIfNeedToCollectAtCompletion) {
     int newRemaining = decrementRemainingAndGet();
@@ -266,7 +284,7 @@
   }
 
   private void processCompleted(
-      @NullableDecl
+      @CheckForNull
           ImmutableCollection<? extends Future<? extends InputT>>
               futuresIfNeedToCollectAtCompletion) {
     if (futuresIfNeedToCollectAtCompletion != null) {
@@ -322,12 +340,15 @@
    * If {@code allMustSucceed} is true, called as each future completes; otherwise, if {@code
    * collectsValues} is true, called for each future when all futures complete.
    */
-  abstract void collectOneValue(int index, @NullableDecl InputT returnValue);
+  abstract void collectOneValue(int index, @ParametricNullness InputT returnValue);
 
   abstract void handleAllCompleted();
 
   /** Adds the chain to the seen set, and returns whether all the chain was new to us. */
-  private static boolean addCausalChain(Set<Throwable> seen, Throwable t) {
+  private static boolean addCausalChain(Set<Throwable> seen, Throwable param) {
+    // Declare a "true" local variable so that the Checker Framework will infer nullness.
+    Throwable t = param;
+
     for (; t != null; t = t.getCause()) {
       boolean firstTimeSeen = seen.add(t);
       if (!firstTimeSeen) {
diff --git a/android/guava/src/com/google/common/util/concurrent/AggregateFutureState.java b/android/guava/src/com/google/common/util/concurrent/AggregateFutureState.java
index f8398d8..ee23ca0 100644
--- a/android/guava/src/com/google/common/util/concurrent/AggregateFutureState.java
+++ b/android/guava/src/com/google/common/util/concurrent/AggregateFutureState.java
@@ -15,6 +15,7 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.collect.Sets.newConcurrentHashSet;
+import static java.util.Objects.requireNonNull;
 import static java.util.concurrent.atomic.AtomicIntegerFieldUpdater.newUpdater;
 import static java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater;
 
@@ -25,6 +26,8 @@
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A helper which does some thread-safe operations for aggregate futures, which must be implemented
@@ -37,10 +40,12 @@
  */
 @GwtCompatible(emulated = true)
 @ReflectionSupport(value = ReflectionSupport.Level.FULL)
-abstract class AggregateFutureState<OutputT> extends AbstractFuture.TrustedFuture<OutputT> {
+@ElementTypesAreNonnullByDefault
+abstract class AggregateFutureState<OutputT extends @Nullable Object>
+    extends AbstractFuture.TrustedFuture<OutputT> {
   // Lazily initialized the first time we see an exception; not released until all the input futures
   // have completed and we have processed them all.
-  private volatile Set<Throwable> seenExceptions = null;
+  @CheckForNull private volatile Set<Throwable> seenExceptions = null;
 
   private volatile int remaining;
 
@@ -54,7 +59,7 @@
     try {
       helper =
           new SafeAtomicHelper(
-              newUpdater(AggregateFutureState.class, (Class) Set.class, "seenExceptions"),
+              newUpdater(AggregateFutureState.class, Set.class, "seenExceptions"),
               newUpdater(AggregateFutureState.class, "remaining"));
     } catch (Throwable reflectionFailure) {
       // Some Android 5.0.x Samsung devices have bugs in JDK reflection APIs that cause
@@ -124,8 +129,11 @@
        * other callers have added to it.
        *
        * This read is guaranteed to get us the right value because we only set this once (here).
+       *
+       * requireNonNull is safe because either our compareAndSet succeeded or it failed because
+       * another thread did it for us.
        */
-      seenExceptionsLocal = seenExceptions;
+      seenExceptionsLocal = requireNonNull(seenExceptions);
     }
     return seenExceptionsLocal;
   }
@@ -144,32 +152,37 @@
   private abstract static class AtomicHelper {
     /** Atomic compare-and-set of the {@link AggregateFutureState#seenExceptions} field. */
     abstract void compareAndSetSeenExceptions(
-        AggregateFutureState state, Set<Throwable> expect, Set<Throwable> update);
+        AggregateFutureState<?> state, @CheckForNull Set<Throwable> expect, Set<Throwable> update);
 
     /** Atomic decrement-and-get of the {@link AggregateFutureState#remaining} field. */
-    abstract int decrementAndGetRemainingCount(AggregateFutureState state);
+    abstract int decrementAndGetRemainingCount(AggregateFutureState<?> state);
   }
 
   private static final class SafeAtomicHelper extends AtomicHelper {
-    final AtomicReferenceFieldUpdater<AggregateFutureState, Set<Throwable>> seenExceptionsUpdater;
+    final AtomicReferenceFieldUpdater<AggregateFutureState<?>, Set<Throwable>>
+        seenExceptionsUpdater;
 
-    final AtomicIntegerFieldUpdater<AggregateFutureState> remainingCountUpdater;
+    final AtomicIntegerFieldUpdater<AggregateFutureState<?>> remainingCountUpdater;
 
+    @SuppressWarnings({"rawtypes", "unchecked"}) // Unavoidable with reflection API
     SafeAtomicHelper(
         AtomicReferenceFieldUpdater seenExceptionsUpdater,
         AtomicIntegerFieldUpdater remainingCountUpdater) {
-      this.seenExceptionsUpdater = seenExceptionsUpdater;
-      this.remainingCountUpdater = remainingCountUpdater;
+      this.seenExceptionsUpdater =
+          (AtomicReferenceFieldUpdater<AggregateFutureState<?>, Set<Throwable>>)
+              seenExceptionsUpdater;
+      this.remainingCountUpdater =
+          (AtomicIntegerFieldUpdater<AggregateFutureState<?>>) remainingCountUpdater;
     }
 
     @Override
     void compareAndSetSeenExceptions(
-        AggregateFutureState state, Set<Throwable> expect, Set<Throwable> update) {
+        AggregateFutureState<?> state, @CheckForNull Set<Throwable> expect, Set<Throwable> update) {
       seenExceptionsUpdater.compareAndSet(state, expect, update);
     }
 
     @Override
-    int decrementAndGetRemainingCount(AggregateFutureState state) {
+    int decrementAndGetRemainingCount(AggregateFutureState<?> state) {
       return remainingCountUpdater.decrementAndGet(state);
     }
   }
@@ -177,7 +190,7 @@
   private static final class SynchronizedAtomicHelper extends AtomicHelper {
     @Override
     void compareAndSetSeenExceptions(
-        AggregateFutureState state, Set<Throwable> expect, Set<Throwable> update) {
+        AggregateFutureState<?> state, @CheckForNull Set<Throwable> expect, Set<Throwable> update) {
       synchronized (state) {
         if (state.seenExceptions == expect) {
           state.seenExceptions = update;
@@ -186,7 +199,7 @@
     }
 
     @Override
-    int decrementAndGetRemainingCount(AggregateFutureState state) {
+    int decrementAndGetRemainingCount(AggregateFutureState<?> state) {
       synchronized (state) {
         return --state.remaining;
       }
diff --git a/android/guava/src/com/google/common/util/concurrent/AsyncCallable.java b/android/guava/src/com/google/common/util/concurrent/AsyncCallable.java
index 99807de..7ee831e 100644
--- a/android/guava/src/com/google/common/util/concurrent/AsyncCallable.java
+++ b/android/guava/src/com/google/common/util/concurrent/AsyncCallable.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.concurrent.Future;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Computes a value, possibly asynchronously. For an example usage and more information, see {@link
@@ -29,7 +30,8 @@
  */
 @Beta
 @GwtCompatible
-public interface AsyncCallable<V> {
+@ElementTypesAreNonnullByDefault
+public interface AsyncCallable<V extends @Nullable Object> {
   /**
    * Computes a result {@code Future}. The output {@code Future} need not be {@linkplain
    * Future#isDone done}, making {@code AsyncCallable} suitable for asynchronous derivations.
diff --git a/android/guava/src/com/google/common/util/concurrent/AsyncFunction.java b/android/guava/src/com/google/common/util/concurrent/AsyncFunction.java
index 67c3cc2..cd70d20 100644
--- a/android/guava/src/com/google/common/util/concurrent/AsyncFunction.java
+++ b/android/guava/src/com/google/common/util/concurrent/AsyncFunction.java
@@ -16,7 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.concurrent.Future;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Transforms a value, possibly asynchronously. For an example usage and more information, see
@@ -26,7 +26,8 @@
  * @since 11.0
  */
 @GwtCompatible
-public interface AsyncFunction<I, O> {
+@ElementTypesAreNonnullByDefault
+public interface AsyncFunction<I extends @Nullable Object, O extends @Nullable Object> {
   /**
    * Returns an output {@code Future} to use in place of the given {@code input}. The output {@code
    * Future} need not be {@linkplain Future#isDone done}, making {@code AsyncFunction} suitable for
@@ -34,5 +35,5 @@
    *
    * <p>Throwing an exception from this method is equivalent to returning a failing {@code Future}.
    */
-  ListenableFuture<O> apply(@NullableDecl I input) throws Exception;
+  ListenableFuture<O> apply(@ParametricNullness I input) throws Exception;
 }
diff --git a/android/guava/src/com/google/common/util/concurrent/AtomicDouble.java b/android/guava/src/com/google/common/util/concurrent/AtomicDouble.java
index 563381b..161fca8 100644
--- a/android/guava/src/com/google/common/util/concurrent/AtomicDouble.java
+++ b/android/guava/src/com/google/common/util/concurrent/AtomicDouble.java
@@ -49,6 +49,7 @@
  * @author Martin Buchholz
  * @since 11.0
  */
+@ElementTypesAreNonnullByDefault
 public class AtomicDouble extends Number implements java.io.Serializable {
   private static final long serialVersionUID = 0L;
 
diff --git a/android/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java b/android/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
index 5c4baa1..58407f5 100644
--- a/android/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
+++ b/android/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
@@ -44,6 +44,7 @@
  * @since 11.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public class AtomicDoubleArray implements java.io.Serializable {
   private static final long serialVersionUID = 0L;
 
@@ -96,7 +97,7 @@
   }
 
   /**
-   * Sets the element at position {@code i} to the given value.
+   * Atomically sets the element at position {@code i} to the given value.
    *
    * @param i the index
    * @param newValue the new value
diff --git a/android/guava/src/com/google/common/util/concurrent/AtomicLongMap.java b/android/guava/src/com/google/common/util/concurrent/AtomicLongMap.java
index 7fc58f4..bac02c1 100644
--- a/android/guava/src/com/google/common/util/concurrent/AtomicLongMap.java
+++ b/android/guava/src/com/google/common/util/concurrent/AtomicLongMap.java
@@ -28,7 +28,7 @@
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A map containing {@code long} values that can be atomically updated. While writes to a
@@ -54,6 +54,7 @@
  * @since 11.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class AtomicLongMap<K> implements Serializable {
   private final ConcurrentHashMap<K, AtomicLong> map;
 
@@ -325,7 +326,7 @@
     return sum;
   }
 
-  @NullableDecl private transient Map<K, Long> asMap;
+  @CheckForNull private transient Map<K, Long> asMap;
 
   /** Returns a live, read-only view of the map backing this {@code AtomicLongMap}. */
   public Map<K, Long> asMap() {
diff --git a/android/guava/src/com/google/common/util/concurrent/Atomics.java b/android/guava/src/com/google/common/util/concurrent/Atomics.java
index f6aafb7..c1b6964 100644
--- a/android/guava/src/com/google/common/util/concurrent/Atomics.java
+++ b/android/guava/src/com/google/common/util/concurrent/Atomics.java
@@ -17,7 +17,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.atomic.AtomicReferenceArray;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to classes in the {@code java.util.concurrent.atomic} package.
@@ -26,6 +26,7 @@
  * @since 10.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Atomics {
   private Atomics() {}
 
@@ -34,8 +35,8 @@
    *
    * @return a new {@code AtomicReference} with no initial value
    */
-  public static <V> AtomicReference<V> newReference() {
-    return new AtomicReference<V>();
+  public static <V> AtomicReference<@Nullable V> newReference() {
+    return new AtomicReference<>();
   }
 
   /**
@@ -44,8 +45,9 @@
    * @param initialValue the initial value
    * @return a new {@code AtomicReference} with the given initial value
    */
-  public static <V> AtomicReference<V> newReference(@NullableDecl V initialValue) {
-    return new AtomicReference<V>(initialValue);
+  public static <V extends @Nullable Object> AtomicReference<V> newReference(
+      @ParametricNullness V initialValue) {
+    return new AtomicReference<>(initialValue);
   }
 
   /**
@@ -54,8 +56,8 @@
    * @param length the length of the array
    * @return a new {@code AtomicReferenceArray} with the given length
    */
-  public static <E> AtomicReferenceArray<E> newReferenceArray(int length) {
-    return new AtomicReferenceArray<E>(length);
+  public static <E> AtomicReferenceArray<@Nullable E> newReferenceArray(int length) {
+    return new AtomicReferenceArray<>(length);
   }
 
   /**
@@ -65,7 +67,7 @@
    * @param array the array to copy elements from
    * @return a new {@code AtomicReferenceArray} copied from the given array
    */
-  public static <E> AtomicReferenceArray<E> newReferenceArray(E[] array) {
-    return new AtomicReferenceArray<E>(array);
+  public static <E extends @Nullable Object> AtomicReferenceArray<E> newReferenceArray(E[] array) {
+    return new AtomicReferenceArray<>(array);
   }
 }
diff --git a/android/guava/src/com/google/common/util/concurrent/Callables.java b/android/guava/src/com/google/common/util/concurrent/Callables.java
index c4caf36..47b5264 100644
--- a/android/guava/src/com/google/common/util/concurrent/Callables.java
+++ b/android/guava/src/com/google/common/util/concurrent/Callables.java
@@ -21,7 +21,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Supplier;
 import java.util.concurrent.Callable;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to the {@link Callable} interface.
@@ -30,13 +30,16 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Callables {
   private Callables() {}
 
   /** Creates a {@code Callable} which immediately returns a preset value each time it is called. */
-  public static <T> Callable<T> returning(@NullableDecl final T value) {
+  public static <T extends @Nullable Object> Callable<T> returning(
+      @ParametricNullness final T value) {
     return new Callable<T>() {
       @Override
+      @ParametricNullness
       public T call() {
         return value;
       }
@@ -53,7 +56,7 @@
    */
   @Beta
   @GwtIncompatible
-  public static <T> AsyncCallable<T> asAsyncCallable(
+  public static <T extends @Nullable Object> AsyncCallable<T> asAsyncCallable(
       final Callable<T> callable, final ListeningExecutorService listeningExecutorService) {
     checkNotNull(callable);
     checkNotNull(listeningExecutorService);
@@ -69,18 +72,18 @@
    * Wraps the given callable such that for the duration of {@link Callable#call} the thread that is
    * running will have the given name.
    *
-   *
    * @param callable The callable to wrap
    * @param nameSupplier The supplier of thread names, {@link Supplier#get get} will be called once
    *     for each invocation of the wrapped callable.
    */
   @GwtIncompatible // threads
-  static <T> Callable<T> threadRenaming(
+  static <T extends @Nullable Object> Callable<T> threadRenaming(
       final Callable<T> callable, final Supplier<String> nameSupplier) {
     checkNotNull(nameSupplier);
     checkNotNull(callable);
     return new Callable<T>() {
       @Override
+      @ParametricNullness
       public T call() throws Exception {
         Thread currentThread = Thread.currentThread();
         String oldName = currentThread.getName();
@@ -100,7 +103,6 @@
    * Wraps the given runnable such that for the duration of {@link Runnable#run} the thread that is
    * running with have the given name.
    *
-   *
    * @param task The Runnable to wrap
    * @param nameSupplier The supplier of thread names, {@link Supplier#get get} will be called once
    *     for each invocation of the wrapped callable.
diff --git a/android/guava/src/com/google/common/util/concurrent/ClosingFuture.java b/android/guava/src/com/google/common/util/concurrent/ClosingFuture.java
index 2e5b5c5..c5ce0c4 100644
--- a/android/guava/src/com/google/common/util/concurrent/ClosingFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ClosingFuture.java
@@ -60,7 +60,8 @@
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A step in a pipeline of an asynchronous computation. When the last step in the computation is
@@ -137,8 +138,9 @@
  * <h4>Automatically closing</h4>
  *
  * You can extract a {@link Future} that represents the result of the last step in the pipeline by
- * calling {@link #finishToFuture()}. When that final {@link Future} is done, all objects captured
- * by all steps in the pipeline will be closed.
+ * calling {@link #finishToFuture()}. All objects the pipeline has captured for closing will begin
+ * to be closed asynchronously <b>after</b> the returned {@code Future} is done: the future
+ * completes before closing starts, rather than once it has finished.
  *
  * <pre>{@code
  * FluentFuture<UserName> userName =
@@ -191,8 +193,9 @@
 // TODO(dpb): Consider reusing one CloseableList for the entire pipeline, modulo combinations.
 @Beta // @Beta for one release.
 @DoNotMock("Use ClosingFuture.from(Futures.immediate*Future)")
+@ElementTypesAreNonnullByDefault
 // TODO(dpb): GWT compatibility.
-public final class ClosingFuture<V> {
+public final class ClosingFuture<V extends @Nullable Object> {
 
   private static final Logger logger = Logger.getLogger(ClosingFuture.class.getName());
 
@@ -231,10 +234,10 @@
      * @return the first argument
      */
     @CanIgnoreReturnValue
-    @NullableDecl
+    @ParametricNullness
     // TODO(b/163345357): Widen bound to AutoCloseable once we require API Level 19.
-    public <C extends Object & Closeable> C eventuallyClose(
-        @NullableDecl C closeable, Executor closingExecutor) {
+    public <C extends @Nullable Object & @Nullable Closeable> C eventuallyClose(
+        @ParametricNullness C closeable, Executor closingExecutor) {
       checkNotNull(closingExecutor);
       if (closeable != null) {
         list.add(closeable, closingExecutor);
@@ -248,7 +251,7 @@
    *
    * @param <V> the type of the result
    */
-  public interface ClosingCallable<V extends Object> {
+  public interface ClosingCallable<V extends @Nullable Object> {
     /**
      * Computes a result, or throws an exception if unable to do so.
      *
@@ -256,17 +259,34 @@
      * closer.eventuallyClose()} will be closed when the {@link ClosingFuture} pipeline is done (but
      * not before this method completes), even if this method throws or the pipeline is cancelled.
      */
-    @NullableDecl
+    @ParametricNullness
     V call(DeferredCloser closer) throws Exception;
   }
 
   /**
+   * An operation that computes a {@link ClosingFuture} of a result.
+   *
+   * @param <V> the type of the result
+   * @since 30.1
+   */
+  public interface AsyncClosingCallable<V extends @Nullable Object> {
+    /**
+     * Computes a result, or throws an exception if unable to do so.
+     *
+     * <p>Any objects that are passed to {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     * closer.eventuallyClose()} will be closed when the {@link ClosingFuture} pipeline is done (but
+     * not before this method completes), even if this method throws or the pipeline is cancelled.
+     */
+    ClosingFuture<V> call(DeferredCloser closer) throws Exception;
+  }
+
+  /**
    * A function from an input to a result.
    *
    * @param <T> the type of the input to the function
    * @param <U> the type of the result of the function
    */
-  public interface ClosingFunction<T extends Object, U extends Object> {
+  public interface ClosingFunction<T extends @Nullable Object, U extends @Nullable Object> {
 
     /**
      * Applies this function to an input, or throws an exception if unable to do so.
@@ -275,8 +295,8 @@
      * closer.eventuallyClose()} will be closed when the {@link ClosingFuture} pipeline is done (but
      * not before this method completes), even if this method throws or the pipeline is cancelled.
      */
-    @NullableDecl
-    U apply(DeferredCloser closer, @NullableDecl T input) throws Exception;
+    @ParametricNullness
+    U apply(DeferredCloser closer, @ParametricNullness T input) throws Exception;
   }
 
   /**
@@ -285,7 +305,7 @@
    * @param <T> the type of the input to the function
    * @param <U> the type of the result of the function
    */
-  public interface AsyncClosingFunction<T extends Object, U extends Object> {
+  public interface AsyncClosingFunction<T extends @Nullable Object, U extends @Nullable Object> {
     /**
      * Applies this function to an input, or throws an exception if unable to do so.
      *
@@ -293,7 +313,7 @@
      * closer.eventuallyClose()} will be closed when the {@link ClosingFuture} pipeline is done (but
      * not before this method completes), even if this method throws or the pipeline is cancelled.
      */
-    ClosingFuture<U> apply(DeferredCloser closer, @NullableDecl T input) throws Exception;
+    ClosingFuture<U> apply(DeferredCloser closer, @ParametricNullness T input) throws Exception;
   }
 
   /**
@@ -306,7 +326,7 @@
    * @param <V> the type of the value of a successful operation
    * @see ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)
    */
-  public static final class ValueAndCloser<V> {
+  public static final class ValueAndCloser<V extends @Nullable Object> {
 
     private final ClosingFuture<? extends V> closingFuture;
 
@@ -324,7 +344,7 @@
      * @throws CancellationException if the computation was cancelled
      * @throws ExecutionException if the computation threw an exception
      */
-    @NullableDecl
+    @ParametricNullness
     public V get() throws ExecutionException {
       return getDone(closingFuture.future);
     }
@@ -351,7 +371,7 @@
    * @param <V> the type of the final value of a successful pipeline
    * @see ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)
    */
-  public interface ValueAndCloserConsumer<V> {
+  public interface ValueAndCloserConsumer<V extends @Nullable Object> {
 
     /** Accepts a {@link ValueAndCloser} for the last step in a {@link ClosingFuture} pipeline. */
     void accept(ValueAndCloser<V> valueAndCloser);
@@ -363,11 +383,22 @@
    * @throws java.util.concurrent.RejectedExecutionException if the task cannot be scheduled for
    *     execution
    */
-  public static <V> ClosingFuture<V> submit(ClosingCallable<V> callable, Executor executor) {
+  public static <V extends @Nullable Object> ClosingFuture<V> submit(
+      ClosingCallable<V> callable, Executor executor) {
     return new ClosingFuture<>(callable, executor);
   }
 
-  // TODO(dpb, cpovirk): Do we need submitAsync?
+  /**
+   * Starts a {@link ClosingFuture} pipeline by submitting a callable block to an executor.
+   *
+   * @throws java.util.concurrent.RejectedExecutionException if the task cannot be scheduled for
+   *     execution
+   * @since 30.1
+   */
+  public static <V extends @Nullable Object> ClosingFuture<V> submitAsync(
+      AsyncClosingCallable<V> callable, Executor executor) {
+    return new ClosingFuture<>(callable, executor);
+  }
 
   /**
    * Starts a {@link ClosingFuture} pipeline with a {@link ListenableFuture}.
@@ -376,7 +407,7 @@
    * implements {@link Closeable}. In order to start a pipeline with a value that will be closed
    * when the pipeline is done, use {@link #submit(ClosingCallable, Executor)} instead.
    */
-  public static <V> ClosingFuture<V> from(ListenableFuture<V> future) {
+  public static <V extends @Nullable Object> ClosingFuture<V> from(ListenableFuture<V> future) {
     return new ClosingFuture<V>(future);
   }
 
@@ -403,15 +434,16 @@
    */
   @Deprecated
   // TODO(b/163345357): Widen bound to AutoCloseable once we require API Level 19.
-  public static <C extends Object & Closeable> ClosingFuture<C> eventuallyClosing(
-      ListenableFuture<C> future, final Executor closingExecutor) {
+  public static <C extends @Nullable Object & @Nullable Closeable>
+      ClosingFuture<C> eventuallyClosing(
+          ListenableFuture<C> future, final Executor closingExecutor) {
     checkNotNull(closingExecutor);
     final ClosingFuture<C> closingFuture = new ClosingFuture<>(nonCancellationPropagating(future));
     Futures.addCallback(
         future,
-        new FutureCallback<Closeable>() {
+        new FutureCallback<@Nullable Closeable>() {
           @Override
-          public void onSuccess(@NullableDecl Closeable result) {
+          public void onSuccess(@CheckForNull Closeable result) {
             closingFuture.closeables.closer.eventuallyClose(result, closingExecutor);
           }
 
@@ -464,8 +496,8 @@
    * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
    *     the arguments, or if any has already been {@linkplain #finishToFuture() finished}
    */
-  public static <V1, V2> Combiner2<V1, V2> whenAllSucceed(
-      ClosingFuture<V1> future1, ClosingFuture<V2> future2) {
+  public static <V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Combiner2<V1, V2> whenAllSucceed(ClosingFuture<V1> future1, ClosingFuture<V2> future2) {
     return new Combiner2<>(future1, future2);
   }
 
@@ -479,8 +511,10 @@
    * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
    *     the arguments, or if any has already been {@linkplain #finishToFuture() finished}
    */
-  public static <V1, V2, V3> Combiner3<V1, V2, V3> whenAllSucceed(
-      ClosingFuture<V1> future1, ClosingFuture<V2> future2, ClosingFuture<V3> future3) {
+  public static <
+          V1 extends @Nullable Object, V2 extends @Nullable Object, V3 extends @Nullable Object>
+      Combiner3<V1, V2, V3> whenAllSucceed(
+          ClosingFuture<V1> future1, ClosingFuture<V2> future2, ClosingFuture<V3> future3) {
     return new Combiner3<>(future1, future2, future3);
   }
 
@@ -494,11 +528,16 @@
    * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
    *     the arguments, or if any has already been {@linkplain #finishToFuture() finished}
    */
-  public static <V1, V2, V3, V4> Combiner4<V1, V2, V3, V4> whenAllSucceed(
-      ClosingFuture<V1> future1,
-      ClosingFuture<V2> future2,
-      ClosingFuture<V3> future3,
-      ClosingFuture<V4> future4) {
+  public static <
+          V1 extends @Nullable Object,
+          V2 extends @Nullable Object,
+          V3 extends @Nullable Object,
+          V4 extends @Nullable Object>
+      Combiner4<V1, V2, V3, V4> whenAllSucceed(
+          ClosingFuture<V1> future1,
+          ClosingFuture<V2> future2,
+          ClosingFuture<V3> future3,
+          ClosingFuture<V4> future4) {
     return new Combiner4<>(future1, future2, future3, future4);
   }
 
@@ -512,12 +551,18 @@
    * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
    *     the arguments, or if any has already been {@linkplain #finishToFuture() finished}
    */
-  public static <V1, V2, V3, V4, V5> Combiner5<V1, V2, V3, V4, V5> whenAllSucceed(
-      ClosingFuture<V1> future1,
-      ClosingFuture<V2> future2,
-      ClosingFuture<V3> future3,
-      ClosingFuture<V4> future4,
-      ClosingFuture<V5> future5) {
+  public static <
+          V1 extends @Nullable Object,
+          V2 extends @Nullable Object,
+          V3 extends @Nullable Object,
+          V4 extends @Nullable Object,
+          V5 extends @Nullable Object>
+      Combiner5<V1, V2, V3, V4, V5> whenAllSucceed(
+          ClosingFuture<V1> future1,
+          ClosingFuture<V2> future2,
+          ClosingFuture<V3> future3,
+          ClosingFuture<V4> future4,
+          ClosingFuture<V5> future5) {
     return new Combiner5<>(future1, future2, future3, future4, future5);
   }
 
@@ -555,6 +600,7 @@
         TrustedListenableFutureTask.create(
             new Callable<V>() {
               @Override
+              @ParametricNullness
               public V call() throws Exception {
                 return callable.call(closeables.closer);
               }
@@ -568,6 +614,32 @@
     this.future = task;
   }
 
+  private ClosingFuture(final AsyncClosingCallable<V> callable, Executor executor) {
+    checkNotNull(callable);
+    TrustedListenableFutureTask<V> task =
+        TrustedListenableFutureTask.create(
+            new AsyncCallable<V>() {
+              @Override
+              public ListenableFuture<V> call() throws Exception {
+                CloseableList newCloseables = new CloseableList();
+                try {
+                  ClosingFuture<V> closingFuture = callable.call(newCloseables.closer);
+                  closingFuture.becomeSubsumedInto(closeables);
+                  return closingFuture.future;
+                } finally {
+                  closeables.add(newCloseables, directExecutor());
+                }
+              }
+
+              @Override
+              public String toString() {
+                return callable.toString();
+              }
+            });
+    executor.execute(task);
+    this.future = task;
+  }
+
   /**
    * Returns a future that finishes when this step does. Calling {@code get()} on the returned
    * future returns {@code null} if the step is successful or throws the same exception that would
@@ -616,7 +688,7 @@
    *     one, or if this {@code ClosingFuture} has already been {@linkplain #finishToFuture()
    *     finished}
    */
-  public <U> ClosingFuture<U> transform(
+  public <U extends @Nullable Object> ClosingFuture<U> transform(
       final ClosingFunction<? super V, U> function, Executor executor) {
     checkNotNull(function);
     AsyncFunction<V, U> applyFunction =
@@ -710,7 +782,7 @@
    *     one, or if this {@code ClosingFuture} has already been {@linkplain #finishToFuture()
    *     finished}
    */
-  public <U> ClosingFuture<U> transformAsync(
+  public <U extends @Nullable Object> ClosingFuture<U> transformAsync(
       final AsyncClosingFunction<? super V, U> function, Executor executor) {
     checkNotNull(function);
     AsyncFunction<V, U> applyFunction =
@@ -754,8 +826,8 @@
    * @param function transforms the value of a {@code ClosingFuture} step to a {@link
    *     ListenableFuture} with the value of a derived step
    */
-  public static <V, U> AsyncClosingFunction<V, U> withoutCloser(
-      final AsyncFunction<V, U> function) {
+  public static <V extends @Nullable Object, U extends @Nullable Object>
+      AsyncClosingFunction<V, U> withoutCloser(final AsyncFunction<V, U> function) {
     checkNotNull(function);
     return new AsyncClosingFunction<V, U>() {
       @Override
@@ -930,9 +1002,14 @@
   }
 
   /**
-   * Marks this step as the last step in the {@code ClosingFuture} pipeline. When the returned
-   * {@link Future} is done, all objects captured for closing during the pipeline's computation will
-   * be closed.
+   * Marks this step as the last step in the {@code ClosingFuture} pipeline.
+   *
+   * <p>The returned {@link Future} is completed when the pipeline's computation completes, or when
+   * the pipeline is cancelled.
+   *
+   * <p>All objects the pipeline has captured for closing will begin to be closed asynchronously
+   * <b>after</b> the returned {@code Future} is done: the future completes before closing starts,
+   * rather than once it has finished.
    *
    * <p>After calling this method, you may not call {@link
    * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, this method, or any other
@@ -1019,7 +1096,7 @@
         executor);
   }
 
-  private static <C, V extends C> void provideValueAndCloser(
+  private static <C extends @Nullable Object, V extends C> void provideValueAndCloser(
       ValueAndCloserConsumer<C> consumer, ClosingFuture<V> closingFuture) {
     consumer.accept(new ValueAndCloser<C>(closingFuture));
   }
@@ -1055,7 +1132,7 @@
     closeables.close();
   }
 
-  private <U> ClosingFuture<U> derive(FluentFuture<U> future) {
+  private <U extends @Nullable Object> ClosingFuture<U> derive(FluentFuture<U> future) {
     ClosingFuture<U> derived = new ClosingFuture<>(future);
     becomeSubsumedInto(derived.closeables);
     return derived;
@@ -1091,17 +1168,17 @@
      *     CombiningCallable#call(DeferredCloser, Peeker)} or {@link
      *     AsyncCombiningCallable#call(DeferredCloser, Peeker)}
      */
-    @NullableDecl
-    public final <D extends Object> D getDone(ClosingFuture<D> closingFuture)
+    @ParametricNullness
+    public final <D extends @Nullable Object> D getDone(ClosingFuture<D> closingFuture)
         throws ExecutionException {
       checkState(beingCalled);
       checkArgument(futures.contains(closingFuture));
       return Futures.getDone(closingFuture.future);
     }
 
-    @NullableDecl
-    private <V extends Object> V call(CombiningCallable<V> combiner, CloseableList closeables)
-        throws Exception {
+    @ParametricNullness
+    private <V extends @Nullable Object> V call(
+        CombiningCallable<V> combiner, CloseableList closeables) throws Exception {
       beingCalled = true;
       CloseableList newCloseables = new CloseableList();
       try {
@@ -1112,7 +1189,7 @@
       }
     }
 
-    private <V extends Object> FluentFuture<V> callAsync(
+    private <V extends @Nullable Object> FluentFuture<V> callAsync(
         AsyncCombiningCallable<V> combiner, CloseableList closeables) throws Exception {
       beingCalled = true;
       CloseableList newCloseables = new CloseableList();
@@ -1162,7 +1239,7 @@
      *
      * @param <V> the type of the result
      */
-    public interface CombiningCallable<V extends Object> {
+    public interface CombiningCallable<V extends @Nullable Object> {
       /**
        * Computes a result, or throws an exception if unable to do so.
        *
@@ -1173,7 +1250,7 @@
        *
        * @param peeker used to get the value of any of the input futures
        */
-      @NullableDecl
+      @ParametricNullness
       V call(DeferredCloser closer, Peeker peeker) throws Exception;
     }
 
@@ -1182,7 +1259,7 @@
      *
      * @param <V> the type of the result
      */
-    public interface AsyncCombiningCallable<V extends Object> {
+    public interface AsyncCombiningCallable<V extends @Nullable Object> {
       /**
        * Computes a {@link ClosingFuture} result, or throws an exception if unable to do so.
        *
@@ -1221,11 +1298,12 @@
      * <p>If the combiningCallable throws an {@code ExecutionException}, the cause of the thrown
      * {@code ExecutionException} will be extracted and used as the failure of the derived step.
      */
-    public <V> ClosingFuture<V> call(
+    public <V extends @Nullable Object> ClosingFuture<V> call(
         final CombiningCallable<V> combiningCallable, Executor executor) {
       Callable<V> callable =
           new Callable<V>() {
             @Override
+            @ParametricNullness
             public V call() throws Exception {
               return new Peeker(inputs).call(combiningCallable, closeables);
             }
@@ -1277,7 +1355,7 @@
      * <p>The same warnings about doing heavyweight operations within {@link
      * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
      */
-    public <V> ClosingFuture<V> callAsync(
+    public <V extends @Nullable Object> ClosingFuture<V> callAsync(
         final AsyncCombiningCallable<V> combiningCallable, Executor executor) {
       AsyncCallable<V> asyncCallable =
           new AsyncCallable<V>() {
@@ -1297,7 +1375,7 @@
       return derived;
     }
 
-    private FutureCombiner<Object> futureCombiner() {
+    private FutureCombiner<@Nullable Object> futureCombiner() {
       return allMustSucceed
           ? Futures.whenAllSucceed(inputFutures())
           : Futures.whenAllComplete(inputFutures());
@@ -1324,7 +1402,8 @@
    * @param <V1> the type returned by the first future
    * @param <V2> the type returned by the second future
    */
-  public static final class Combiner2<V1 extends Object, V2 extends Object> extends Combiner {
+  public static final class Combiner2<V1 extends @Nullable Object, V2 extends @Nullable Object>
+      extends Combiner {
 
     /**
      * A function that returns a value when applied to the values of the two futures passed to
@@ -1334,7 +1413,8 @@
      * @param <V2> the type returned by the second future
      * @param <U> the type returned by the function
      */
-    public interface ClosingFunction2<V1 extends Object, V2 extends Object, U extends Object> {
+    public interface ClosingFunction2<
+        V1 extends @Nullable Object, V2 extends @Nullable Object, U extends @Nullable Object> {
 
       /**
        * Applies this function to two inputs, or throws an exception if unable to do so.
@@ -1344,8 +1424,8 @@
        * is done (but not before this method completes), even if this method throws or the pipeline
        * is cancelled.
        */
-      @NullableDecl
-      U apply(DeferredCloser closer, @NullableDecl V1 value1, @NullableDecl V2 value2)
+      @ParametricNullness
+      U apply(DeferredCloser closer, @ParametricNullness V1 value1, @ParametricNullness V2 value2)
           throws Exception;
     }
 
@@ -1357,7 +1437,8 @@
      * @param <V2> the type returned by the second future
      * @param <U> the type returned by the function
      */
-    public interface AsyncClosingFunction2<V1 extends Object, V2 extends Object, U extends Object> {
+    public interface AsyncClosingFunction2<
+        V1 extends @Nullable Object, V2 extends @Nullable Object, U extends @Nullable Object> {
 
       /**
        * Applies this function to two inputs, or throws an exception if unable to do so.
@@ -1368,7 +1449,8 @@
        * is cancelled.
        */
       ClosingFuture<U> apply(
-          DeferredCloser closer, @NullableDecl V1 value1, @NullableDecl V2 value2) throws Exception;
+          DeferredCloser closer, @ParametricNullness V1 value1, @ParametricNullness V2 value2)
+          throws Exception;
     }
 
     private final ClosingFuture<V1> future1;
@@ -1393,12 +1475,12 @@
      * <p>If the function throws an {@code ExecutionException}, the cause of the thrown {@code
      * ExecutionException} will be extracted and used as the failure of the derived step.
      */
-    public <U extends Object> ClosingFuture<U> call(
+    public <U extends @Nullable Object> ClosingFuture<U> call(
         final ClosingFunction2<V1, V2, U> function, Executor executor) {
       return call(
           new CombiningCallable<U>() {
             @Override
-            @NullableDecl
+            @ParametricNullness
             public U call(DeferredCloser closer, Peeker peeker) throws Exception {
               return function.apply(closer, peeker.getDone(future1), peeker.getDone(future2));
             }
@@ -1447,7 +1529,7 @@
      * <p>The same warnings about doing heavyweight operations within {@link
      * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
      */
-    public <U extends Object> ClosingFuture<U> callAsync(
+    public <U extends @Nullable Object> ClosingFuture<U> callAsync(
         final AsyncClosingFunction2<V1, V2, U> function, Executor executor) {
       return callAsync(
           new AsyncCombiningCallable<U>() {
@@ -1474,7 +1556,8 @@
    * @param <V2> the type returned by the second future
    * @param <V3> the type returned by the third future
    */
-  public static final class Combiner3<V1 extends Object, V2 extends Object, V3 extends Object>
+  public static final class Combiner3<
+          V1 extends @Nullable Object, V2 extends @Nullable Object, V3 extends @Nullable Object>
       extends Combiner {
     /**
      * A function that returns a value when applied to the values of the three futures passed to
@@ -1486,7 +1569,10 @@
      * @param <U> the type returned by the function
      */
     public interface ClosingFunction3<
-        V1 extends Object, V2 extends Object, V3 extends Object, U extends Object> {
+        V1 extends @Nullable Object,
+        V2 extends @Nullable Object,
+        V3 extends @Nullable Object,
+        U extends @Nullable Object> {
       /**
        * Applies this function to three inputs, or throws an exception if unable to do so.
        *
@@ -1495,12 +1581,12 @@
        * is done (but not before this method completes), even if this method throws or the pipeline
        * is cancelled.
        */
-      @NullableDecl
+      @ParametricNullness
       U apply(
           DeferredCloser closer,
-          @NullableDecl V1 value1,
-          @NullableDecl V2 value2,
-          @NullableDecl V3 v3)
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3)
           throws Exception;
     }
 
@@ -1514,7 +1600,10 @@
      * @param <U> the type returned by the function
      */
     public interface AsyncClosingFunction3<
-        V1 extends Object, V2 extends Object, V3 extends Object, U extends Object> {
+        V1 extends @Nullable Object,
+        V2 extends @Nullable Object,
+        V3 extends @Nullable Object,
+        U extends @Nullable Object> {
       /**
        * Applies this function to three inputs, or throws an exception if unable to do so.
        *
@@ -1525,9 +1614,9 @@
        */
       ClosingFuture<U> apply(
           DeferredCloser closer,
-          @NullableDecl V1 value1,
-          @NullableDecl V2 value2,
-          @NullableDecl V3 value3)
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3)
           throws Exception;
     }
 
@@ -1556,12 +1645,12 @@
      * <p>If the function throws an {@code ExecutionException}, the cause of the thrown {@code
      * ExecutionException} will be extracted and used as the failure of the derived step.
      */
-    public <U extends Object> ClosingFuture<U> call(
+    public <U extends @Nullable Object> ClosingFuture<U> call(
         final ClosingFunction3<V1, V2, V3, U> function, Executor executor) {
       return call(
           new CombiningCallable<U>() {
             @Override
-            @NullableDecl
+            @ParametricNullness
             public U call(DeferredCloser closer, Peeker peeker) throws Exception {
               return function.apply(
                   closer,
@@ -1614,7 +1703,7 @@
      * <p>The same warnings about doing heavyweight operations within {@link
      * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
      */
-    public <U extends Object> ClosingFuture<U> callAsync(
+    public <U extends @Nullable Object> ClosingFuture<U> callAsync(
         final AsyncClosingFunction3<V1, V2, V3, U> function, Executor executor) {
       return callAsync(
           new AsyncCombiningCallable<U>() {
@@ -1647,7 +1736,10 @@
    * @param <V4> the type returned by the fourth future
    */
   public static final class Combiner4<
-          V1 extends Object, V2 extends Object, V3 extends Object, V4 extends Object>
+          V1 extends @Nullable Object,
+          V2 extends @Nullable Object,
+          V3 extends @Nullable Object,
+          V4 extends @Nullable Object>
       extends Combiner {
     /**
      * A function that returns a value when applied to the values of the four futures passed to
@@ -1660,11 +1752,11 @@
      * @param <U> the type returned by the function
      */
     public interface ClosingFunction4<
-        V1 extends Object,
-        V2 extends Object,
-        V3 extends Object,
-        V4 extends Object,
-        U extends Object> {
+        V1 extends @Nullable Object,
+        V2 extends @Nullable Object,
+        V3 extends @Nullable Object,
+        V4 extends @Nullable Object,
+        U extends @Nullable Object> {
       /**
        * Applies this function to four inputs, or throws an exception if unable to do so.
        *
@@ -1673,13 +1765,13 @@
        * is done (but not before this method completes), even if this method throws or the pipeline
        * is cancelled.
        */
-      @NullableDecl
+      @ParametricNullness
       U apply(
           DeferredCloser closer,
-          @NullableDecl V1 value1,
-          @NullableDecl V2 value2,
-          @NullableDecl V3 value3,
-          @NullableDecl V4 value4)
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3,
+          @ParametricNullness V4 value4)
           throws Exception;
     }
 
@@ -1695,11 +1787,11 @@
      * @param <U> the type returned by the function
      */
     public interface AsyncClosingFunction4<
-        V1 extends Object,
-        V2 extends Object,
-        V3 extends Object,
-        V4 extends Object,
-        U extends Object> {
+        V1 extends @Nullable Object,
+        V2 extends @Nullable Object,
+        V3 extends @Nullable Object,
+        V4 extends @Nullable Object,
+        U extends @Nullable Object> {
       /**
        * Applies this function to four inputs, or throws an exception if unable to do so.
        *
@@ -1710,10 +1802,10 @@
        */
       ClosingFuture<U> apply(
           DeferredCloser closer,
-          @NullableDecl V1 value1,
-          @NullableDecl V2 value2,
-          @NullableDecl V3 value3,
-          @NullableDecl V4 value4)
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3,
+          @ParametricNullness V4 value4)
           throws Exception;
     }
 
@@ -1747,12 +1839,12 @@
      * <p>If the function throws an {@code ExecutionException}, the cause of the thrown {@code
      * ExecutionException} will be extracted and used as the failure of the derived step.
      */
-    public <U extends Object> ClosingFuture<U> call(
+    public <U extends @Nullable Object> ClosingFuture<U> call(
         final ClosingFunction4<V1, V2, V3, V4, U> function, Executor executor) {
       return call(
           new CombiningCallable<U>() {
             @Override
-            @NullableDecl
+            @ParametricNullness
             public U call(DeferredCloser closer, Peeker peeker) throws Exception {
               return function.apply(
                   closer,
@@ -1806,7 +1898,7 @@
      * <p>The same warnings about doing heavyweight operations within {@link
      * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
      */
-    public <U extends Object> ClosingFuture<U> callAsync(
+    public <U extends @Nullable Object> ClosingFuture<U> callAsync(
         final AsyncClosingFunction4<V1, V2, V3, V4, U> function, Executor executor) {
       return callAsync(
           new AsyncCombiningCallable<U>() {
@@ -1841,11 +1933,11 @@
    * @param <V5> the type returned by the fifth future
    */
   public static final class Combiner5<
-          V1 extends Object,
-          V2 extends Object,
-          V3 extends Object,
-          V4 extends Object,
-          V5 extends Object>
+          V1 extends @Nullable Object,
+          V2 extends @Nullable Object,
+          V3 extends @Nullable Object,
+          V4 extends @Nullable Object,
+          V5 extends @Nullable Object>
       extends Combiner {
     /**
      * A function that returns a value when applied to the values of the five futures passed to
@@ -1860,12 +1952,12 @@
      * @param <U> the type returned by the function
      */
     public interface ClosingFunction5<
-        V1 extends Object,
-        V2 extends Object,
-        V3 extends Object,
-        V4 extends Object,
-        V5 extends Object,
-        U extends Object> {
+        V1 extends @Nullable Object,
+        V2 extends @Nullable Object,
+        V3 extends @Nullable Object,
+        V4 extends @Nullable Object,
+        V5 extends @Nullable Object,
+        U extends @Nullable Object> {
       /**
        * Applies this function to five inputs, or throws an exception if unable to do so.
        *
@@ -1874,14 +1966,14 @@
        * is done (but not before this method completes), even if this method throws or the pipeline
        * is cancelled.
        */
-      @NullableDecl
+      @ParametricNullness
       U apply(
           DeferredCloser closer,
-          @NullableDecl V1 value1,
-          @NullableDecl V2 value2,
-          @NullableDecl V3 value3,
-          @NullableDecl V4 value4,
-          @NullableDecl V5 value5)
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3,
+          @ParametricNullness V4 value4,
+          @ParametricNullness V5 value5)
           throws Exception;
     }
 
@@ -1898,12 +1990,12 @@
      * @param <U> the type returned by the function
      */
     public interface AsyncClosingFunction5<
-        V1 extends Object,
-        V2 extends Object,
-        V3 extends Object,
-        V4 extends Object,
-        V5 extends Object,
-        U extends Object> {
+        V1 extends @Nullable Object,
+        V2 extends @Nullable Object,
+        V3 extends @Nullable Object,
+        V4 extends @Nullable Object,
+        V5 extends @Nullable Object,
+        U extends @Nullable Object> {
       /**
        * Applies this function to five inputs, or throws an exception if unable to do so.
        *
@@ -1914,11 +2006,11 @@
        */
       ClosingFuture<U> apply(
           DeferredCloser closer,
-          @NullableDecl V1 value1,
-          @NullableDecl V2 value2,
-          @NullableDecl V3 value3,
-          @NullableDecl V4 value4,
-          @NullableDecl V5 value5)
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3,
+          @ParametricNullness V4 value4,
+          @ParametricNullness V5 value5)
           throws Exception;
     }
 
@@ -1956,12 +2048,12 @@
      * <p>If the function throws an {@code ExecutionException}, the cause of the thrown {@code
      * ExecutionException} will be extracted and used as the failure of the derived step.
      */
-    public <U extends Object> ClosingFuture<U> call(
+    public <U extends @Nullable Object> ClosingFuture<U> call(
         final ClosingFunction5<V1, V2, V3, V4, V5, U> function, Executor executor) {
       return call(
           new CombiningCallable<U>() {
             @Override
-            @NullableDecl
+            @ParametricNullness
             public U call(DeferredCloser closer, Peeker peeker) throws Exception {
               return function.apply(
                   closer,
@@ -2017,7 +2109,7 @@
      * <p>The same warnings about doing heavyweight operations within {@link
      * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
      */
-    public <U extends Object> ClosingFuture<U> callAsync(
+    public <U extends @Nullable Object> ClosingFuture<U> callAsync(
         final AsyncClosingFunction5<V1, V2, V3, V4, V5, U> function, Executor executor) {
       return callAsync(
           new AsyncCombiningCallable<U>() {
@@ -2055,7 +2147,7 @@
     }
   }
 
-  private static void closeQuietly(final Closeable closeable, Executor executor) {
+  private static void closeQuietly(@CheckForNull final Closeable closeable, Executor executor) {
     if (closeable == null) {
       return;
     }
@@ -2097,10 +2189,12 @@
       implements Closeable {
     private final DeferredCloser closer = new DeferredCloser(this);
     private volatile boolean closed;
-    private volatile CountDownLatch whenClosed;
+    @CheckForNull private volatile CountDownLatch whenClosed;
 
-    <V, U> ListenableFuture<U> applyClosingFunction(
-        ClosingFunction<? super V, U> transformation, V input) throws Exception {
+    <V extends @Nullable Object, U extends @Nullable Object>
+        ListenableFuture<U> applyClosingFunction(
+            ClosingFunction<? super V, U> transformation, @ParametricNullness V input)
+            throws Exception {
       // TODO(dpb): Consider ways to defer closing without creating a separate CloseableList.
       CloseableList newCloseables = new CloseableList();
       try {
@@ -2110,8 +2204,10 @@
       }
     }
 
-    <V, U> FluentFuture<U> applyAsyncClosingFunction(
-        AsyncClosingFunction<V, U> transformation, V input) throws Exception {
+    <V extends @Nullable Object, U extends @Nullable Object>
+        FluentFuture<U> applyAsyncClosingFunction(
+            AsyncClosingFunction<V, U> transformation, @ParametricNullness V input)
+            throws Exception {
       // TODO(dpb): Consider ways to defer closing without creating a separate CloseableList.
       CloseableList newCloseables = new CloseableList();
       try {
@@ -2143,7 +2239,7 @@
       }
     }
 
-    void add(@NullableDecl Closeable closeable, Executor executor) {
+    void add(@CheckForNull Closeable closeable, Executor executor) {
       checkNotNull(executor);
       if (closeable == null) {
         return;
diff --git a/android/guava/src/com/google/common/util/concurrent/CollectionFuture.java b/android/guava/src/com/google/common/util/concurrent/CollectionFuture.java
index 3ae5800..c106c15 100644
--- a/android/guava/src/com/google/common/util/concurrent/CollectionFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/CollectionFuture.java
@@ -19,32 +19,34 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.Future;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Aggregate future that collects (stores) results of each future. */
 @GwtCompatible(emulated = true)
-abstract class CollectionFuture<V, C> extends AggregateFuture<V, C> {
+@ElementTypesAreNonnullByDefault
+abstract class CollectionFuture<V extends @Nullable Object, C extends @Nullable Object>
+    extends AggregateFuture<V, C> {
   /*
    * We access this field racily but safely. For discussion of a similar situation, see the comments
    * on the fields of TimeoutFuture. This field is slightly different than the fields discussed
    * there: cancel() never reads this field, only writes to it. That makes the race here completely
    * harmless, rather than just 99.99% harmless.
    */
-  private List<Present<V>> values;
+  @CheckForNull private List<@Nullable Present<V>> values;
 
   CollectionFuture(
       ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
       boolean allMustSucceed) {
     super(futures, allMustSucceed, true);
 
-    List<Present<V>> values =
+    List<@Nullable Present<V>> values =
         futures.isEmpty()
-            ? ImmutableList.<Present<V>>of()
-            : Lists.<Present<V>>newArrayListWithCapacity(futures.size());
+            ? Collections.<@Nullable Present<V>>emptyList()
+            : Lists.<@Nullable Present<V>>newArrayListWithCapacity(futures.size());
 
     // Populate the results list with null initially.
     for (int i = 0; i < futures.size(); ++i) {
@@ -55,8 +57,8 @@
   }
 
   @Override
-  final void collectOneValue(int index, @NullableDecl V returnValue) {
-    List<Present<V>> localValues = values;
+  final void collectOneValue(int index, @ParametricNullness V returnValue) {
+    List<@Nullable Present<V>> localValues = values;
     if (localValues != null) {
       localValues.set(index, new Present<>(returnValue));
     }
@@ -64,7 +66,7 @@
 
   @Override
   final void handleAllCompleted() {
-    List<Present<V>> localValues = values;
+    List<@Nullable Present<V>> localValues = values;
     if (localValues != null) {
       set(combine(localValues));
     }
@@ -76,10 +78,11 @@
     this.values = null;
   }
 
-  abstract C combine(List<Present<V>> values);
+  abstract C combine(List<@Nullable Present<V>> values);
 
   /** Used for {@link Futures#allAsList} and {@link Futures#successfulAsList}. */
-  static final class ListFuture<V> extends CollectionFuture<V, List<V>> {
+  static final class ListFuture<V extends @Nullable Object>
+      extends CollectionFuture<V, List<@Nullable V>> {
     ListFuture(
         ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
         boolean allMustSucceed) {
@@ -88,8 +91,8 @@
     }
 
     @Override
-    public List<V> combine(List<Present<V>> values) {
-      List<V> result = newArrayListWithCapacity(values.size());
+    public List<@Nullable V> combine(List<@Nullable Present<V>> values) {
+      List<@Nullable V> result = newArrayListWithCapacity(values.size());
       for (Present<V> element : values) {
         result.add(element != null ? element.value : null);
       }
@@ -98,7 +101,7 @@
   }
 
   /** The result of a successful {@code Future}. */
-  private static final class Present<V> {
+  private static final class Present<V extends @Nullable Object> {
     V value;
 
     Present(V value) {
diff --git a/android/guava/src/com/google/common/util/concurrent/CombinedFuture.java b/android/guava/src/com/google/common/util/concurrent/CombinedFuture.java
index 15a1c07..c222111 100644
--- a/android/guava/src/com/google/common/util/concurrent/CombinedFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/CombinedFuture.java
@@ -25,12 +25,15 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.RejectedExecutionException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Aggregate future that computes its value by calling a callable. */
 @GwtCompatible
-final class CombinedFuture<V> extends AggregateFuture<Object, V> {
-  private CombinedFutureInterruptibleTask<?> task;
+@ElementTypesAreNonnullByDefault
+final class CombinedFuture<V extends @Nullable Object>
+    extends AggregateFuture<@Nullable Object, V> {
+  @CheckForNull private CombinedFutureInterruptibleTask<?> task;
 
   CombinedFuture(
       ImmutableCollection<? extends ListenableFuture<?>> futures,
@@ -53,7 +56,7 @@
   }
 
   @Override
-  void collectOneValue(int index, @NullableDecl Object returnValue) {}
+  void collectOneValue(int index, @CheckForNull Object returnValue) {}
 
   @Override
   void handleAllCompleted() {
@@ -87,7 +90,8 @@
   }
 
   @WeakOuter
-  private abstract class CombinedFutureInterruptibleTask<T> extends InterruptibleTask<T> {
+  private abstract class CombinedFutureInterruptibleTask<T extends @Nullable Object>
+      extends InterruptibleTask<T> {
     private final Executor listenerExecutor;
 
     CombinedFutureInterruptibleTask(Executor listenerExecutor) {
@@ -108,7 +112,7 @@
     }
 
     @Override
-    final void afterRanInterruptibly(T result, Throwable error) {
+    final void afterRanInterruptiblySuccess(@ParametricNullness T result) {
       /*
        * The future no longer needs to interrupt this task, so it no longer needs a reference to it.
        *
@@ -122,20 +126,28 @@
        */
       CombinedFuture.this.task = null;
 
-      if (error != null) {
-        if (error instanceof ExecutionException) {
-          CombinedFuture.this.setException(error.getCause());
-        } else if (error instanceof CancellationException) {
-          cancel(false);
-        } else {
-          CombinedFuture.this.setException(error);
-        }
+      setValue(result);
+    }
+
+    @Override
+    final void afterRanInterruptiblyFailure(Throwable error) {
+      // See afterRanInterruptiblySuccess.
+      CombinedFuture.this.task = null;
+
+      if (error instanceof ExecutionException) {
+        /*
+         * Cast to ExecutionException to satisfy our nullness checker, which (unsoundly but
+         * *usually* safely) assumes that getCause() returns non-null on an ExecutionException.
+         */
+        CombinedFuture.this.setException(((ExecutionException) error).getCause());
+      } else if (error instanceof CancellationException) {
+        cancel(false);
       } else {
-        setValue(result);
+        CombinedFuture.this.setException(error);
       }
     }
 
-    abstract void setValue(T value);
+    abstract void setValue(@ParametricNullness T value);
   }
 
   @WeakOuter
@@ -179,12 +191,13 @@
     }
 
     @Override
+    @ParametricNullness
     V runInterruptibly() throws Exception {
       return callable.call();
     }
 
     @Override
-    void setValue(V value) {
+    void setValue(@ParametricNullness V value) {
       CombinedFuture.this.set(value);
     }
 
diff --git a/android/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java b/android/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
index d6ea486..b6b161d 100644
--- a/android/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
+++ b/android/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
@@ -15,6 +15,7 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -42,7 +43,7 @@
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * The {@code CycleDetectingLockFactory} creates {@link ReentrantLock} instances and {@link
@@ -162,6 +163,7 @@
 @Beta
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public class CycleDetectingLockFactory {
 
   /**
@@ -268,7 +270,8 @@
   }
 
   // A static mapping from an Enum type to its set of LockGraphNodes.
-  private static final ConcurrentMap<Class<? extends Enum>, Map<? extends Enum, LockGraphNode>>
+  private static final ConcurrentMap<
+          Class<? extends Enum<?>>, Map<? extends Enum<?>, LockGraphNode>>
       lockGraphNodesPerType = new MapMaker().weakKeys().makeMap();
 
   /** Creates a {@code CycleDetectingLockFactory.WithExplicitOrdering<E>}. */
@@ -283,13 +286,15 @@
     return new WithExplicitOrdering<E>(policy, lockGraphNodes);
   }
 
-  private static Map<? extends Enum, LockGraphNode> getOrCreateNodes(Class<? extends Enum> clazz) {
-    Map<? extends Enum, LockGraphNode> existing = lockGraphNodesPerType.get(clazz);
+  @SuppressWarnings("unchecked")
+  private static <E extends Enum<E>> Map<? extends E, LockGraphNode> getOrCreateNodes(
+      Class<E> clazz) {
+    Map<E, LockGraphNode> existing = (Map<E, LockGraphNode>) lockGraphNodesPerType.get(clazz);
     if (existing != null) {
       return existing;
     }
-    Map<? extends Enum, LockGraphNode> created = createNodes(clazz);
-    existing = lockGraphNodesPerType.putIfAbsent(clazz, created);
+    Map<E, LockGraphNode> created = createNodes(clazz);
+    existing = (Map<E, LockGraphNode>) lockGraphNodesPerType.putIfAbsent(clazz, created);
     return MoreObjects.firstNonNull(existing, created);
   }
 
@@ -417,7 +422,9 @@
     public ReentrantLock newReentrantLock(E rank, boolean fair) {
       return policy == Policies.DISABLED
           ? new ReentrantLock(fair)
-          : new CycleDetectingReentrantLock(lockGraphNodes.get(rank), fair);
+          // requireNonNull is safe because createNodes inserts an entry for every E.
+          // (If the caller passes `null` for the `rank` parameter, this will throw, but that's OK.)
+          : new CycleDetectingReentrantLock(requireNonNull(lockGraphNodes.get(rank)), fair);
     }
 
     /** Equivalent to {@code newReentrantReadWriteLock(rank, false)}. */
@@ -436,7 +443,10 @@
     public ReentrantReadWriteLock newReentrantReadWriteLock(E rank, boolean fair) {
       return policy == Policies.DISABLED
           ? new ReentrantReadWriteLock(fair)
-          : new CycleDetectingReentrantReadWriteLock(lockGraphNodes.get(rank), fair);
+          // requireNonNull is safe because createNodes inserts an entry for every E.
+          // (If the caller passes `null` for the `rank` parameter, this will throw, but that's OK.)
+          : new CycleDetectingReentrantReadWriteLock(
+              requireNonNull(lockGraphNodes.get(rank)), fair);
     }
   }
 
@@ -546,7 +556,8 @@
      */
     @Override
     public String getMessage() {
-      StringBuilder message = new StringBuilder(super.getMessage());
+      // requireNonNull is safe because ExampleStackTrace sets a non-null message.
+      StringBuilder message = new StringBuilder(requireNonNull(super.getMessage()));
       for (Throwable t = conflictingStackTrace; t != null; t = t.getCause()) {
         message.append(", ").append(t.getMessage());
       }
@@ -599,8 +610,8 @@
     }
 
     void checkAcquiredLocks(Policy policy, List<LockGraphNode> acquiredLocks) {
-      for (int i = 0, size = acquiredLocks.size(); i < size; i++) {
-        checkAcquiredLock(policy, acquiredLocks.get(i));
+      for (LockGraphNode acquiredLock : acquiredLocks) {
+        checkAcquiredLock(policy, acquiredLock);
       }
     }
 
@@ -674,7 +685,7 @@
      * @return If a path was found, a chained {@link ExampleStackTrace} illustrating the path to the
      *     {@code lock}, or {@code null} if no path was found.
      */
-    @NullableDecl
+    @CheckForNull
     private ExampleStackTrace findPathTo(LockGraphNode node, Set<LockGraphNode> seen) {
       if (!seen.add(this)) {
         return null; // Already traversed this node.
diff --git a/android/guava/src/com/google/common/util/concurrent/DirectExecutor.java b/android/guava/src/com/google/common/util/concurrent/DirectExecutor.java
index 3022971..0c3a46b 100644
--- a/android/guava/src/com/google/common/util/concurrent/DirectExecutor.java
+++ b/android/guava/src/com/google/common/util/concurrent/DirectExecutor.java
@@ -22,6 +22,7 @@
  * execute}.
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 enum DirectExecutor implements Executor {
   INSTANCE;
 
diff --git a/android/guava/src/com/google/common/util/concurrent/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/util/concurrent/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..3487125
--- /dev/null
+++ b/android/guava/src/com/google/common/util/concurrent/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.util.concurrent;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/util/concurrent/ExecutionError.java b/android/guava/src/com/google/common/util/concurrent/ExecutionError.java
index dd25efb..deaff15 100644
--- a/android/guava/src/com/google/common/util/concurrent/ExecutionError.java
+++ b/android/guava/src/com/google/common/util/concurrent/ExecutionError.java
@@ -15,7 +15,7 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtCompatible;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * {@link Error} variant of {@link java.util.concurrent.ExecutionException}. As with {@code
@@ -28,22 +28,29 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class ExecutionError extends Error {
+  /*
+   * Ideally, this class would have exposed only constructors that require a non-null cause. We
+   * might try to move in that direction, but there are complications. See
+   * https://github.com/jspecify/nullness-checker-for-checker-framework/blob/61aafa4ae52594830cfc2d61c8b113009dbdb045/src/main/java/com/google/jspecify/nullness/NullSpecTransfer.java#L789
+   */
+
   /** Creates a new instance with {@code null} as its detail message. */
   protected ExecutionError() {}
 
   /** Creates a new instance with the given detail message. */
-  protected ExecutionError(@NullableDecl String message) {
+  protected ExecutionError(@CheckForNull String message) {
     super(message);
   }
 
   /** Creates a new instance with the given detail message and cause. */
-  public ExecutionError(@NullableDecl String message, @NullableDecl Error cause) {
+  public ExecutionError(@CheckForNull String message, @CheckForNull Error cause) {
     super(message, cause);
   }
 
   /** Creates a new instance with the given cause. */
-  public ExecutionError(@NullableDecl Error cause) {
+  public ExecutionError(@CheckForNull Error cause) {
     super(cause);
   }
 
diff --git a/android/guava/src/com/google/common/util/concurrent/ExecutionList.java b/android/guava/src/com/google/common/util/concurrent/ExecutionList.java
index 153f425..96fc51c 100644
--- a/android/guava/src/com/google/common/util/concurrent/ExecutionList.java
+++ b/android/guava/src/com/google/common/util/concurrent/ExecutionList.java
@@ -21,7 +21,7 @@
 import java.util.concurrent.Executor;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A support class for {@code ListenableFuture} implementations to manage their listeners. An
@@ -40,6 +40,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ExecutionList {
   /** Logger to log exceptions caught when running runnables. */
   private static final Logger log = Logger.getLogger(ExecutionList.class.getName());
@@ -49,7 +50,7 @@
    * RunnableExecutorPair#next} field.
    */
   @GuardedBy("this")
-  @NullableDecl
+  @CheckForNull
   private RunnableExecutorPair runnables;
 
   @GuardedBy("this")
@@ -154,9 +155,10 @@
   private static final class RunnableExecutorPair {
     final Runnable runnable;
     final Executor executor;
-    @NullableDecl RunnableExecutorPair next;
+    @CheckForNull RunnableExecutorPair next;
 
-    RunnableExecutorPair(Runnable runnable, Executor executor, RunnableExecutorPair next) {
+    RunnableExecutorPair(
+        Runnable runnable, Executor executor, @CheckForNull RunnableExecutorPair next) {
       this.runnable = runnable;
       this.executor = executor;
       this.next = next;
diff --git a/android/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java b/android/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
index f589e08..148f50b 100644
--- a/android/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
+++ b/android/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
@@ -23,11 +23,14 @@
 import static com.google.common.util.concurrent.Futures.immediateFuture;
 import static com.google.common.util.concurrent.Futures.immediateVoidFuture;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicReference;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Serializes execution of tasks, somewhat like an "asynchronous {@code synchronized} block." Each
@@ -78,6 +81,7 @@
  * @since 26.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class ExecutionSequencer {
 
   private ExecutionSequencer() {}
@@ -88,7 +92,7 @@
   }
 
   /** This reference acts as a pointer tracking the head of a linked list of ListenableFutures. */
-  private final AtomicReference<ListenableFuture<Void>> ref =
+  private final AtomicReference<ListenableFuture<@Nullable Void>> ref =
       new AtomicReference<>(immediateVoidFuture());
 
   private ThreadConfinedTaskQueue latestTaskQueue = new ThreadConfinedTaskQueue();
@@ -122,11 +126,11 @@
      * All the states where thread != currentThread are identical for our purposes, and so even
      * though it's racy, we don't care which of those values we get, so no need to synchronize.
      */
-    Thread thread;
+    @CheckForNull Thread thread;
     /** Only used by the thread associated with this object */
-    Runnable nextTask;
+    @CheckForNull Runnable nextTask;
     /** Only used by the thread associated with this object */
-    Executor nextExecutor;
+    @CheckForNull Executor nextExecutor;
   }
 
   /**
@@ -136,7 +140,8 @@
    * execute, but if the output future is cancelled before {@link Callable#call()} is invoked,
    * {@link Callable#call()} will not be invoked.
    */
-  public <T> ListenableFuture<T> submit(final Callable<T> callable, Executor executor) {
+  public <T extends @Nullable Object> ListenableFuture<T> submit(
+      final Callable<T> callable, Executor executor) {
     checkNotNull(callable);
     checkNotNull(executor);
     return submitAsync(
@@ -161,7 +166,7 @@
    * callable} or a callable that has begun to execute, but if the output future is cancelled before
    * {@link AsyncCallable#call()} is invoked, {@link AsyncCallable#call()} will not be invoked.
    */
-  public <T> ListenableFuture<T> submitAsync(
+  public <T extends @Nullable Object> ListenableFuture<T> submitAsync(
       final AsyncCallable<T> callable, final Executor executor) {
     checkNotNull(callable);
     checkNotNull(executor);
@@ -192,9 +197,9 @@
      * have completed - namely after oldFuture is done, and taskFuture has either completed or been
      * cancelled before the callable started execution.
      */
-    final SettableFuture<Void> newFuture = SettableFuture.create();
+    final SettableFuture<@Nullable Void> newFuture = SettableFuture.create();
 
-    final ListenableFuture<Void> oldFuture = ref.getAndSet(newFuture);
+    final ListenableFuture<@Nullable Void> oldFuture = ref.getAndSet(newFuture);
 
     // Invoke our task once the previous future completes.
     final TrustedListenableFutureTask<T> taskFuture = TrustedListenableFutureTask.create(task);
@@ -279,7 +284,6 @@
    * properties; for example, calling WeakReference.get() on Android will block during an
    * otherwise-concurrent GC cycle.
    */
-  @SuppressWarnings("ShouldNotSubclass") // Saving an allocation here is worth it
   private static final class TaskNonReentrantExecutor extends AtomicReference<RunningState>
       implements Executor, Runnable {
 
@@ -287,22 +291,22 @@
      * Used to update and read the latestTaskQueue field. Set to null once the runnable has been run
      * or queued.
      */
-    ExecutionSequencer sequencer;
+    @CheckForNull ExecutionSequencer sequencer;
 
     /**
      * Executor the task was set to run on. Set to null when the task has been queued, run, or
      * cancelled.
      */
-    Executor delegate;
+    @CheckForNull Executor delegate;
 
     /**
      * Set before calling delegate.execute(); set to null once run, so that it can be GCed; this
      * object may live on after, if submitAsync returns an incomplete future.
      */
-    Runnable task;
+    @CheckForNull Runnable task;
 
     /** Thread that called execute(). Set in execute, cleared when delegate.execute() returns. */
-    Thread submitting;
+    @CheckForNull Thread submitting;
 
     private TaskNonReentrantExecutor(Executor delegate, ExecutionSequencer sequencer) {
       super(NOT_RUN);
@@ -327,8 +331,18 @@
         return;
       }
       submitting = Thread.currentThread();
+
       try {
-        ThreadConfinedTaskQueue submittingTaskQueue = sequencer.latestTaskQueue;
+        /*
+         * requireNonNull is safe because we don't null out `sequencer` except:
+         *
+         * - above, where we return (in which case we never get here)
+         *
+         * - in `run`, which can't run until this Runnable is submitted to an executor, which
+         *   doesn't happen until below. (And this Executor -- yes, the object is both a Runnable
+         *   and an Executor -- is used for only a single `execute` call.)
+         */
+        ThreadConfinedTaskQueue submittingTaskQueue = requireNonNull(sequencer).latestTaskQueue;
         if (submittingTaskQueue.thread == submitting) {
           sequencer = null;
           // Submit from inside a reentrant submit. We don't know if this one will be reentrant (and
@@ -337,10 +351,12 @@
           // execution.
           checkState(submittingTaskQueue.nextTask == null);
           submittingTaskQueue.nextTask = task;
-          submittingTaskQueue.nextExecutor = delegate;
+          // requireNonNull(delegate) is safe for reasons similar to requireNonNull(sequencer).
+          submittingTaskQueue.nextExecutor = requireNonNull(delegate);
           delegate = null;
         } else {
-          Executor localDelegate = delegate;
+          // requireNonNull(delegate) is safe for reasons similar to requireNonNull(sequencer).
+          Executor localDelegate = requireNonNull(delegate);
           delegate = null;
           this.task = task;
           localDelegate.execute(this);
@@ -359,7 +375,11 @@
     public void run() {
       Thread currentThread = Thread.currentThread();
       if (currentThread != submitting) {
-        Runnable localTask = task;
+        /*
+         * requireNonNull is safe because we set `task` before submitting this Runnable to an
+         * Executor, and we don't null it out until here.
+         */
+        Runnable localTask = requireNonNull(task);
         task = null;
         localTask.run();
         return;
@@ -369,6 +389,18 @@
       // latestTaskQueue, and queue rather than calling execute() directly.
       ThreadConfinedTaskQueue executingTaskQueue = new ThreadConfinedTaskQueue();
       executingTaskQueue.thread = currentThread;
+      /*
+       * requireNonNull is safe because we don't null out `sequencer` except:
+       *
+       * - after the requireNonNull call below. (And this object has its Runnable.run override
+       *   called only once, just as it has its Executor.execute override called only once.)
+       *
+       * - if we return immediately from `execute` (in which case we never get here)
+       *
+       * - in the "reentrant submit" case of `execute` (in which case we must have started running a
+       *   user task -- which means that we already got past this code (or else we exited early
+       *   above))
+       */
       // Unconditionally set; there is no risk of throwing away a queued task from another thread,
       // because in order for the current task to run on this executor the previous task must have
       // already started execution. Because each task on a TaskNonReentrantExecutor can only produce
@@ -378,10 +410,11 @@
       // otherwise have another task queued on to it. Note the exception to this, cancellation, is
       // specially handled in execute() - execute() calls triggered by cancellation are no-ops, and
       // thus don't count.
-      sequencer.latestTaskQueue = executingTaskQueue;
+      requireNonNull(sequencer).latestTaskQueue = executingTaskQueue;
       sequencer = null;
       try {
-        Runnable localTask = task;
+        // requireNonNull is safe, as discussed above.
+        Runnable localTask = requireNonNull(task);
         task = null;
         localTask.run();
         // Now check if our task attempted to reentrantly execute the next task.
diff --git a/android/guava/src/com/google/common/util/concurrent/FakeTimeLimiter.java b/android/guava/src/com/google/common/util/concurrent/FakeTimeLimiter.java
index 9dad51b..ddc9440 100644
--- a/android/guava/src/com/google/common/util/concurrent/FakeTimeLimiter.java
+++ b/android/guava/src/com/google/common/util/concurrent/FakeTimeLimiter.java
@@ -22,6 +22,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A TimeLimiter implementation which actually does not attempt to limit time at all. This may be
@@ -36,6 +37,7 @@
 @Beta
 @CanIgnoreReturnValue
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class FakeTimeLimiter implements TimeLimiter {
   @Override
   public <T> T newProxy(
@@ -47,8 +49,9 @@
   }
 
   @Override
-  public <T> T callWithTimeout(Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
-      throws ExecutionException {
+  @ParametricNullness
+  public <T extends @Nullable Object> T callWithTimeout(
+      Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit) throws ExecutionException {
     checkNotNull(callable);
     checkNotNull(timeoutUnit);
     try {
@@ -67,7 +70,8 @@
   }
 
   @Override
-  public <T> T callUninterruptiblyWithTimeout(
+  @ParametricNullness
+  public <T extends @Nullable Object> T callUninterruptiblyWithTimeout(
       Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit) throws ExecutionException {
     return callWithTimeout(callable, timeoutDuration, timeoutUnit);
   }
diff --git a/android/guava/src/com/google/common/util/concurrent/FluentFuture.java b/android/guava/src/com/google/common/util/concurrent/FluentFuture.java
index 070cb15..2b6ef9f 100644
--- a/android/guava/src/com/google/common/util/concurrent/FluentFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/FluentFuture.java
@@ -27,6 +27,7 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link ListenableFuture} that supports fluent chains of operations. For example:
@@ -72,22 +73,26 @@
 @Beta
 @DoNotMock("Use FluentFuture.from(Futures.immediate*Future) or SettableFuture")
 @GwtCompatible(emulated = true)
-public abstract class FluentFuture<V> extends GwtFluentFutureCatchingSpecialization<V> {
+@ElementTypesAreNonnullByDefault
+public abstract class FluentFuture<V extends @Nullable Object>
+    extends GwtFluentFutureCatchingSpecialization<V> {
 
   /**
    * A less abstract subclass of AbstractFuture. This can be used to optimize setFuture by ensuring
    * that {@link #get} calls exactly the implementation of {@link AbstractFuture#get}.
    */
-  abstract static class TrustedFuture<V> extends FluentFuture<V>
+  abstract static class TrustedFuture<V extends @Nullable Object> extends FluentFuture<V>
       implements AbstractFuture.Trusted<V> {
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public final V get() throws InterruptedException, ExecutionException {
       return super.get();
     }
 
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public final V get(long timeout, TimeUnit unit)
         throws InterruptedException, ExecutionException, TimeoutException {
       return super.get(timeout, unit);
@@ -124,7 +129,7 @@
    * directly. If not, it is wrapped in a {@code FluentFuture} that delegates all calls to the
    * original {@code ListenableFuture}.
    */
-  public static <V> FluentFuture<V> from(ListenableFuture<V> future) {
+  public static <V extends @Nullable Object> FluentFuture<V> from(ListenableFuture<V> future) {
     return future instanceof FluentFuture
         ? (FluentFuture<V>) future
         : new ForwardingFluentFuture<V>(future);
@@ -137,7 +142,7 @@
    * @since 28.0
    */
   @Deprecated
-  public static <V> FluentFuture<V> from(FluentFuture<V> future) {
+  public static <V extends @Nullable Object> FluentFuture<V> from(FluentFuture<V> future) {
     return checkNotNull(future);
   }
 
@@ -304,7 +309,7 @@
    * @return A future that holds result of the function (if the input succeeded) or the original
    *     input's failure (if not)
    */
-  public final <T> FluentFuture<T> transformAsync(
+  public final <T extends @Nullable Object> FluentFuture<T> transformAsync(
       AsyncFunction<? super V, T> function, Executor executor) {
     return (FluentFuture<T>) Futures.transformAsync(this, function, executor);
   }
@@ -341,7 +346,8 @@
    * @param executor Executor to run the function in.
    * @return A future that holds result of the transformation.
    */
-  public final <T> FluentFuture<T> transform(Function<? super V, T> function, Executor executor) {
+  public final <T extends @Nullable Object> FluentFuture<T> transform(
+      Function<? super V, T> function, Executor executor) {
     return (FluentFuture<T>) Futures.transform(this, function, executor);
   }
 
diff --git a/android/guava/src/com/google/common/util/concurrent/ForwardingBlockingDeque.java b/android/guava/src/com/google/common/util/concurrent/ForwardingBlockingDeque.java
index 2485966..d0d72a8 100644
--- a/android/guava/src/com/google/common/util/concurrent/ForwardingBlockingDeque.java
+++ b/android/guava/src/com/google/common/util/concurrent/ForwardingBlockingDeque.java
@@ -21,6 +21,7 @@
 import java.util.Collection;
 import java.util.concurrent.BlockingDeque;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link BlockingDeque} which forwards all its method calls to another {@code BlockingDeque}.
@@ -44,6 +45,7 @@
  * @since 21.0 (since 14.0 as {@link com.google.common.collect.ForwardingBlockingDeque})
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingBlockingDeque<E> extends ForwardingDeque<E>
     implements BlockingDeque<E> {
 
@@ -89,11 +91,13 @@
   }
 
   @Override
+  @CheckForNull
   public E pollFirst(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().pollFirst(timeout, unit);
   }
 
   @Override
+  @CheckForNull
   public E pollLast(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().pollLast(timeout, unit);
   }
@@ -114,6 +118,7 @@
   }
 
   @Override
+  @CheckForNull
   public E poll(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().poll(timeout, unit);
   }
diff --git a/android/guava/src/com/google/common/util/concurrent/ForwardingBlockingQueue.java b/android/guava/src/com/google/common/util/concurrent/ForwardingBlockingQueue.java
index f5575a1..dc8511d 100644
--- a/android/guava/src/com/google/common/util/concurrent/ForwardingBlockingQueue.java
+++ b/android/guava/src/com/google/common/util/concurrent/ForwardingBlockingQueue.java
@@ -20,6 +20,7 @@
 import java.util.Collection;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link BlockingQueue} which forwards all its method calls to another {@link BlockingQueue}.
@@ -37,6 +38,7 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingBlockingQueue<E> extends ForwardingQueue<E>
     implements BlockingQueue<E> {
 
@@ -62,6 +64,7 @@
   }
 
   @Override
+  @CheckForNull
   public E poll(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().poll(timeout, unit);
   }
diff --git a/android/guava/src/com/google/common/util/concurrent/ForwardingCondition.java b/android/guava/src/com/google/common/util/concurrent/ForwardingCondition.java
index 62c4d4c..d17f98c 100644
--- a/android/guava/src/com/google/common/util/concurrent/ForwardingCondition.java
+++ b/android/guava/src/com/google/common/util/concurrent/ForwardingCondition.java
@@ -19,6 +19,7 @@
 import java.util.concurrent.locks.Condition;
 
 /** Forwarding wrapper around a {@code Condition}. */
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingCondition implements Condition {
   abstract Condition delegate();
 
diff --git a/android/guava/src/com/google/common/util/concurrent/ForwardingExecutorService.java b/android/guava/src/com/google/common/util/concurrent/ForwardingExecutorService.java
index f9da1d4..ed78b86 100644
--- a/android/guava/src/com/google/common/util/concurrent/ForwardingExecutorService.java
+++ b/android/guava/src/com/google/common/util/concurrent/ForwardingExecutorService.java
@@ -25,6 +25,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An executor service which forwards all its method calls to another executor service. Subclasses
@@ -36,6 +37,7 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingExecutorService extends ForwardingObject
     implements ExecutorService {
   /** Constructor for use by subclasses. */
@@ -50,26 +52,27 @@
   }
 
   @Override
-  public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
-      throws InterruptedException {
+  public <T extends @Nullable Object> List<Future<T>> invokeAll(
+      Collection<? extends Callable<T>> tasks) throws InterruptedException {
     return delegate().invokeAll(tasks);
   }
 
   @Override
-  public <T> List<Future<T>> invokeAll(
+  public <T extends @Nullable Object> List<Future<T>> invokeAll(
       Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
       throws InterruptedException {
     return delegate().invokeAll(tasks, timeout, unit);
   }
 
   @Override
-  public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
+  public <T extends @Nullable Object> T invokeAny(Collection<? extends Callable<T>> tasks)
       throws InterruptedException, ExecutionException {
     return delegate().invokeAny(tasks);
   }
 
   @Override
-  public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
+  public <T extends @Nullable Object> T invokeAny(
+      Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
       throws InterruptedException, ExecutionException, TimeoutException {
     return delegate().invokeAny(tasks, timeout, unit);
   }
@@ -100,7 +103,7 @@
   }
 
   @Override
-  public <T> Future<T> submit(Callable<T> task) {
+  public <T extends @Nullable Object> Future<T> submit(Callable<T> task) {
     return delegate().submit(task);
   }
 
@@ -110,7 +113,8 @@
   }
 
   @Override
-  public <T> Future<T> submit(Runnable task, T result) {
+  public <T extends @Nullable Object> Future<T> submit(
+      Runnable task, @ParametricNullness T result) {
     return delegate().submit(task, result);
   }
 }
diff --git a/android/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java b/android/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java
index 984fd68..cb779c3 100644
--- a/android/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java
@@ -21,6 +21,7 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * {@link FluentFuture} that forwards all calls to a delegate.
@@ -33,7 +34,8 @@
  * forwards to that future and adds the desired methods.
  */
 @GwtCompatible
-final class ForwardingFluentFuture<V> extends FluentFuture<V> {
+@ElementTypesAreNonnullByDefault
+final class ForwardingFluentFuture<V extends @Nullable Object> extends FluentFuture<V> {
   private final ListenableFuture<V> delegate;
 
   ForwardingFluentFuture(ListenableFuture<V> delegate) {
@@ -61,11 +63,13 @@
   }
 
   @Override
+  @ParametricNullness
   public V get() throws InterruptedException, ExecutionException {
     return delegate.get();
   }
 
   @Override
+  @ParametricNullness
   public V get(long timeout, TimeUnit unit)
       throws InterruptedException, ExecutionException, TimeoutException {
     return delegate.get(timeout, unit);
diff --git a/android/guava/src/com/google/common/util/concurrent/ForwardingFuture.java b/android/guava/src/com/google/common/util/concurrent/ForwardingFuture.java
index 165793b..47002b0 100644
--- a/android/guava/src/com/google/common/util/concurrent/ForwardingFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ForwardingFuture.java
@@ -22,6 +22,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Future} which forwards all its method calls to another future. Subclasses should
@@ -35,7 +36,9 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtCompatible
-public abstract class ForwardingFuture<V> extends ForwardingObject implements Future<V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingFuture<V extends @Nullable Object> extends ForwardingObject
+    implements Future<V> {
   /** Constructor for use by subclasses. */
   protected ForwardingFuture() {}
 
@@ -58,11 +61,13 @@
   }
 
   @Override
+  @ParametricNullness
   public V get() throws InterruptedException, ExecutionException {
     return delegate().get();
   }
 
   @Override
+  @ParametricNullness
   public V get(long timeout, TimeUnit unit)
       throws InterruptedException, ExecutionException, TimeoutException {
     return delegate().get(timeout, unit);
@@ -75,7 +80,8 @@
    *
    * @since 9.0
    */
-  public abstract static class SimpleForwardingFuture<V> extends ForwardingFuture<V> {
+  public abstract static class SimpleForwardingFuture<V extends @Nullable Object>
+      extends ForwardingFuture<V> {
     private final Future<V> delegate;
 
     protected SimpleForwardingFuture(Future<V> delegate) {
diff --git a/android/guava/src/com/google/common/util/concurrent/ForwardingListenableFuture.java b/android/guava/src/com/google/common/util/concurrent/ForwardingListenableFuture.java
index d3ed3c2..3868091 100644
--- a/android/guava/src/com/google/common/util/concurrent/ForwardingListenableFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ForwardingListenableFuture.java
@@ -18,6 +18,7 @@
 import com.google.common.base.Preconditions;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.concurrent.Executor;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link ListenableFuture} which forwards all its method calls to another future. Subclasses
@@ -31,8 +32,9 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtCompatible
-public abstract class ForwardingListenableFuture<V> extends ForwardingFuture<V>
-    implements ListenableFuture<V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingListenableFuture<V extends @Nullable Object>
+    extends ForwardingFuture<V> implements ListenableFuture<V> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingListenableFuture() {}
@@ -52,7 +54,7 @@
    *
    * @since 9.0
    */
-  public abstract static class SimpleForwardingListenableFuture<V>
+  public abstract static class SimpleForwardingListenableFuture<V extends @Nullable Object>
       extends ForwardingListenableFuture<V> {
     private final ListenableFuture<V> delegate;
 
diff --git a/android/guava/src/com/google/common/util/concurrent/ForwardingListeningExecutorService.java b/android/guava/src/com/google/common/util/concurrent/ForwardingListeningExecutorService.java
index 48a49b8..fe25b86 100644
--- a/android/guava/src/com/google/common/util/concurrent/ForwardingListeningExecutorService.java
+++ b/android/guava/src/com/google/common/util/concurrent/ForwardingListeningExecutorService.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.concurrent.Callable;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A listening executor service which forwards all its method calls to another listening executor
@@ -29,6 +30,7 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingListeningExecutorService extends ForwardingExecutorService
     implements ListeningExecutorService {
   /** Constructor for use by subclasses. */
@@ -38,7 +40,7 @@
   protected abstract ListeningExecutorService delegate();
 
   @Override
-  public <T> ListenableFuture<T> submit(Callable<T> task) {
+  public <T extends @Nullable Object> ListenableFuture<T> submit(Callable<T> task) {
     return delegate().submit(task);
   }
 
@@ -48,7 +50,8 @@
   }
 
   @Override
-  public <T> ListenableFuture<T> submit(Runnable task, T result) {
+  public <T extends @Nullable Object> ListenableFuture<T> submit(
+      Runnable task, @ParametricNullness T result) {
     return delegate().submit(task, result);
   }
 }
diff --git a/android/guava/src/com/google/common/util/concurrent/ForwardingLock.java b/android/guava/src/com/google/common/util/concurrent/ForwardingLock.java
index 8c50787..db2026a 100644
--- a/android/guava/src/com/google/common/util/concurrent/ForwardingLock.java
+++ b/android/guava/src/com/google/common/util/concurrent/ForwardingLock.java
@@ -19,6 +19,7 @@
 import java.util.concurrent.locks.Lock;
 
 /** Forwarding wrapper around a {@code Lock}. */
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingLock implements Lock {
   abstract Lock delegate();
 
diff --git a/android/guava/src/com/google/common/util/concurrent/FutureCallback.java b/android/guava/src/com/google/common/util/concurrent/FutureCallback.java
index a10f71b..f5684e7 100644
--- a/android/guava/src/com/google/common/util/concurrent/FutureCallback.java
+++ b/android/guava/src/com/google/common/util/concurrent/FutureCallback.java
@@ -17,7 +17,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A callback for accepting the results of a {@link java.util.concurrent.Future} computation
@@ -29,9 +29,10 @@
  * @since 10.0
  */
 @GwtCompatible
-public interface FutureCallback<V> {
+@ElementTypesAreNonnullByDefault
+public interface FutureCallback<V extends @Nullable Object> {
   /** Invoked with the result of the {@code Future} computation when it is successful. */
-  void onSuccess(@NullableDecl V result);
+  void onSuccess(@ParametricNullness V result);
 
   /**
    * Invoked when a {@code Future} computation fails or is canceled.
diff --git a/android/guava/src/com/google/common/util/concurrent/Futures.java b/android/guava/src/com/google/common/util/concurrent/Futures.java
index d2ed5d9..e6bf7a7 100644
--- a/android/guava/src/com/google/common/util/concurrent/Futures.java
+++ b/android/guava/src/com/google/common/util/concurrent/Futures.java
@@ -18,6 +18,7 @@
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -44,7 +45,8 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to the {@link Future} interface.
@@ -71,6 +73,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Futures extends GwtFuturesCatchingSpecialization {
 
   // A note on memory visibility.
@@ -125,7 +128,8 @@
    * getters just return the value. This {@code Future} can't be canceled or timed out and its
    * {@code isDone()} method always returns {@code true}.
    */
-  public static <V> ListenableFuture<V> immediateFuture(@NullableDecl V value) {
+  public static <V extends @Nullable Object> ListenableFuture<V> immediateFuture(
+      @ParametricNullness V value) {
     if (value == null) {
       // This cast is safe because null is assignable to V for all V (i.e. it is bivariant)
       @SuppressWarnings("unchecked")
@@ -142,8 +146,8 @@
    * @since 29.0
    */
   @SuppressWarnings("unchecked")
-  public static ListenableFuture<Void> immediateVoidFuture() {
-    return (ListenableFuture<Void>) ImmediateFuture.NULL;
+  public static ListenableFuture<@Nullable Void> immediateVoidFuture() {
+    return (ListenableFuture<@Nullable Void>) ImmediateFuture.NULL;
   }
 
   /**
@@ -153,7 +157,8 @@
    * returns {@code true}. Calling {@code get()} will immediately throw the provided {@code
    * Throwable} wrapped in an {@code ExecutionException}.
    */
-  public static <V> ListenableFuture<V> immediateFailedFuture(Throwable throwable) {
+  public static <V extends @Nullable Object> ListenableFuture<V> immediateFailedFuture(
+      Throwable throwable) {
     checkNotNull(throwable);
     return new ImmediateFailedFuture<V>(throwable);
   }
@@ -164,7 +169,7 @@
    *
    * @since 14.0
    */
-  public static <V> ListenableFuture<V> immediateCancelledFuture() {
+  public static <V extends @Nullable Object> ListenableFuture<V> immediateCancelledFuture() {
     return new ImmediateCancelledFuture<V>();
   }
 
@@ -175,7 +180,8 @@
    * @since 28.2
    */
   @Beta
-  public static <O> ListenableFuture<O> submit(Callable<O> callable, Executor executor) {
+  public static <O extends @Nullable Object> ListenableFuture<O> submit(
+      Callable<O> callable, Executor executor) {
     TrustedListenableFutureTask<O> task = TrustedListenableFutureTask.create(callable);
     executor.execute(task);
     return task;
@@ -189,8 +195,9 @@
    * @since 28.2
    */
   @Beta
-  public static ListenableFuture<Void> submit(Runnable runnable, Executor executor) {
-    TrustedListenableFutureTask<Void> task = TrustedListenableFutureTask.create(runnable, null);
+  public static ListenableFuture<@Nullable Void> submit(Runnable runnable, Executor executor) {
+    TrustedListenableFutureTask<@Nullable Void> task =
+        TrustedListenableFutureTask.create(runnable, null);
     executor.execute(task);
     return task;
   }
@@ -202,7 +209,8 @@
    * @since 23.0
    */
   @Beta
-  public static <O> ListenableFuture<O> submitAsync(AsyncCallable<O> callable, Executor executor) {
+  public static <O extends @Nullable Object> ListenableFuture<O> submitAsync(
+      AsyncCallable<O> callable, Executor executor) {
     TrustedListenableFutureTask<O> task = TrustedListenableFutureTask.create(callable);
     executor.execute(task);
     return task;
@@ -217,7 +225,7 @@
   @Beta
   @GwtIncompatible // java.util.concurrent.ScheduledExecutorService
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  public static <O> ListenableFuture<O> scheduleAsync(
+  public static <O extends @Nullable Object> ListenableFuture<O> scheduleAsync(
       AsyncCallable<O> callable,
       long delay,
       TimeUnit timeUnit,
@@ -274,7 +282,7 @@
    */
   @Beta
   @Partially.GwtIncompatible("AVAILABLE but requires exceptionType to be Throwable.class")
-  public static <V, X extends Throwable> ListenableFuture<V> catching(
+  public static <V extends @Nullable Object, X extends Throwable> ListenableFuture<V> catching(
       ListenableFuture<? extends V> input,
       Class<X> exceptionType,
       Function<? super X, ? extends V> fallback,
@@ -339,7 +347,7 @@
    */
   @Beta
   @Partially.GwtIncompatible("AVAILABLE but requires exceptionType to be Throwable.class")
-  public static <V, X extends Throwable> ListenableFuture<V> catchingAsync(
+  public static <V extends @Nullable Object, X extends Throwable> ListenableFuture<V> catchingAsync(
       ListenableFuture<? extends V> input,
       Class<X> exceptionType,
       AsyncFunction<? super X, ? extends V> fallback,
@@ -362,7 +370,7 @@
   @Beta
   @GwtIncompatible // java.util.concurrent.ScheduledExecutorService
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  public static <V> ListenableFuture<V> withTimeout(
+  public static <V extends @Nullable Object> ListenableFuture<V> withTimeout(
       ListenableFuture<V> delegate,
       long time,
       TimeUnit unit,
@@ -406,10 +414,11 @@
    * @since 19.0 (in 11.0 as {@code transform})
    */
   @Beta
-  public static <I, O> ListenableFuture<O> transformAsync(
-      ListenableFuture<I> input,
-      AsyncFunction<? super I, ? extends O> function,
-      Executor executor) {
+  public static <I extends @Nullable Object, O extends @Nullable Object>
+      ListenableFuture<O> transformAsync(
+          ListenableFuture<I> input,
+          AsyncFunction<? super I, ? extends O> function,
+          Executor executor) {
     return AbstractTransformFuture.create(input, function, executor);
   }
 
@@ -443,8 +452,9 @@
    * @since 9.0 (in 2.0 as {@code compose})
    */
   @Beta
-  public static <I, O> ListenableFuture<O> transform(
-      ListenableFuture<I> input, Function<? super I, ? extends O> function, Executor executor) {
+  public static <I extends @Nullable Object, O extends @Nullable Object>
+      ListenableFuture<O> transform(
+          ListenableFuture<I> input, Function<? super I, ? extends O> function, Executor executor) {
     return AbstractTransformFuture.create(input, function, executor);
   }
 
@@ -470,7 +480,7 @@
    */
   @Beta
   @GwtIncompatible // TODO
-  public static <I, O> Future<O> lazyTransform(
+  public static <I extends @Nullable Object, O extends @Nullable Object> Future<O> lazyTransform(
       final Future<I> input, final Function<? super I, ? extends O> function) {
     checkNotNull(input);
     checkNotNull(function);
@@ -530,8 +540,14 @@
    */
   @Beta
   @SafeVarargs
-  public static <V> ListenableFuture<List<V>> allAsList(ListenableFuture<? extends V>... futures) {
-    return new ListFuture<V>(ImmutableList.copyOf(futures), true);
+  public static <V extends @Nullable Object> ListenableFuture<List<V>> allAsList(
+      ListenableFuture<? extends V>... futures) {
+    ListenableFuture<List<@Nullable V>> nullable =
+        new ListFuture<V>(ImmutableList.copyOf(futures), true);
+    // allAsList ensures that it fills the output list with V instances.
+    @SuppressWarnings("nullness")
+    ListenableFuture<List<V>> nonNull = nullable;
+    return nonNull;
   }
 
   /**
@@ -551,9 +567,14 @@
    * @since 10.0
    */
   @Beta
-  public static <V> ListenableFuture<List<V>> allAsList(
+  public static <V extends @Nullable Object> ListenableFuture<List<V>> allAsList(
       Iterable<? extends ListenableFuture<? extends V>> futures) {
-    return new ListFuture<V>(ImmutableList.copyOf(futures), true);
+    ListenableFuture<List<@Nullable V>> nullable =
+        new ListFuture<V>(ImmutableList.copyOf(futures), true);
+    // allAsList ensures that it fills the output list with V instances.
+    @SuppressWarnings("nullness")
+    ListenableFuture<List<V>> nonNull = nullable;
+    return nonNull;
   }
 
   /**
@@ -566,7 +587,8 @@
    */
   @Beta
   @SafeVarargs
-  public static <V> FutureCombiner<V> whenAllComplete(ListenableFuture<? extends V>... futures) {
+  public static <V extends @Nullable Object> FutureCombiner<V> whenAllComplete(
+      ListenableFuture<? extends V>... futures) {
     return new FutureCombiner<V>(false, ImmutableList.copyOf(futures));
   }
 
@@ -579,7 +601,7 @@
    * @since 20.0
    */
   @Beta
-  public static <V> FutureCombiner<V> whenAllComplete(
+  public static <V extends @Nullable Object> FutureCombiner<V> whenAllComplete(
       Iterable<? extends ListenableFuture<? extends V>> futures) {
     return new FutureCombiner<V>(false, ImmutableList.copyOf(futures));
   }
@@ -593,7 +615,8 @@
    */
   @Beta
   @SafeVarargs
-  public static <V> FutureCombiner<V> whenAllSucceed(ListenableFuture<? extends V>... futures) {
+  public static <V extends @Nullable Object> FutureCombiner<V> whenAllSucceed(
+      ListenableFuture<? extends V>... futures) {
     return new FutureCombiner<V>(true, ImmutableList.copyOf(futures));
   }
 
@@ -605,7 +628,7 @@
    * @since 20.0
    */
   @Beta
-  public static <V> FutureCombiner<V> whenAllSucceed(
+  public static <V extends @Nullable Object> FutureCombiner<V> whenAllSucceed(
       Iterable<? extends ListenableFuture<? extends V>> futures) {
     return new FutureCombiner<V>(true, ImmutableList.copyOf(futures));
   }
@@ -639,7 +662,7 @@
   @Beta
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing, especially if we provide run(Runnable)
   @GwtCompatible
-  public static final class FutureCombiner<V> {
+  public static final class FutureCombiner<V extends @Nullable Object> {
     private final boolean allMustSucceed;
     private final ImmutableList<ListenableFuture<? extends V>> futures;
 
@@ -663,7 +686,8 @@
      *
      * <p>Canceling this future will attempt to cancel all the component futures.
      */
-    public <C> ListenableFuture<C> callAsync(AsyncCallable<C> combiner, Executor executor) {
+    public <C extends @Nullable Object> ListenableFuture<C> callAsync(
+        AsyncCallable<C> combiner, Executor executor) {
       return new CombinedFuture<C>(futures, allMustSucceed, executor, combiner);
     }
 
@@ -682,7 +706,8 @@
      * <p>Canceling this future will attempt to cancel all the component futures.
      */
     @CanIgnoreReturnValue // TODO(cpovirk): Remove this
-    public <C> ListenableFuture<C> call(Callable<C> combiner, Executor executor) {
+    public <C extends @Nullable Object> ListenableFuture<C> call(
+        Callable<C> combiner, Executor executor) {
       return new CombinedFuture<C>(futures, allMustSucceed, executor, combiner);
     }
 
@@ -699,8 +724,9 @@
      */
     public ListenableFuture<?> run(final Runnable combiner, Executor executor) {
       return call(
-          new Callable<Void>() {
+          new Callable<@Nullable Void>() {
             @Override
+            @CheckForNull
             public Void call() throws Exception {
               combiner.run();
               return null;
@@ -718,7 +744,8 @@
    * @since 15.0
    */
   @Beta
-  public static <V> ListenableFuture<V> nonCancellationPropagating(ListenableFuture<V> future) {
+  public static <V extends @Nullable Object> ListenableFuture<V> nonCancellationPropagating(
+      ListenableFuture<V> future) {
     if (future.isDone()) {
       return future;
     }
@@ -728,9 +755,9 @@
   }
 
   /** A wrapped future that does not propagate cancellation to its delegate. */
-  private static final class NonCancellationPropagatingFuture<V>
+  private static final class NonCancellationPropagatingFuture<V extends @Nullable Object>
       extends AbstractFuture.TrustedFuture<V> implements Runnable {
-    private ListenableFuture<V> delegate;
+    @CheckForNull private ListenableFuture<V> delegate;
 
     NonCancellationPropagatingFuture(final ListenableFuture<V> delegate) {
       this.delegate = delegate;
@@ -747,6 +774,7 @@
     }
 
     @Override
+    @CheckForNull
     protected String pendingToString() {
       ListenableFuture<V> localDelegate = delegate;
       if (localDelegate != null) {
@@ -779,9 +807,21 @@
    * @return a future that provides a list of the results of the component futures
    * @since 10.0
    */
+  /*
+   * Another way to express this signature would be to bound <V> by @NonNull and accept LF<? extends
+   * @Nullable V>. That might be better: There's currently no difference between the outputs users
+   * get when calling this with <Foo> and calling it with <@Nullable Foo>. The only difference is
+   * that calling it with <Foo> won't work when an input Future has a @Nullable type. So why even
+   * make that error possible by giving callers the choice?
+   *
+   * On the other hand, the current signature is consistent with the similar allAsList method. And
+   * eventually this method may go away entirely in favor of an API like
+   * whenAllComplete().collectSuccesses(). That API would have a signature more like the current
+   * one.
+   */
   @Beta
   @SafeVarargs
-  public static <V> ListenableFuture<List<V>> successfulAsList(
+  public static <V extends @Nullable Object> ListenableFuture<List<@Nullable V>> successfulAsList(
       ListenableFuture<? extends V>... futures) {
     return new ListFuture<V>(ImmutableList.copyOf(futures), false);
   }
@@ -805,7 +845,7 @@
    * @since 10.0
    */
   @Beta
-  public static <V> ListenableFuture<List<V>> successfulAsList(
+  public static <V extends @Nullable Object> ListenableFuture<List<@Nullable V>> successfulAsList(
       Iterable<? extends ListenableFuture<? extends V>> futures) {
     return new ListFuture<V>(ImmutableList.copyOf(futures), false);
   }
@@ -832,21 +872,12 @@
    * @since 17.0
    */
   @Beta
-  public static <T> ImmutableList<ListenableFuture<T>> inCompletionOrder(
+  public static <T extends @Nullable Object> ImmutableList<ListenableFuture<T>> inCompletionOrder(
       Iterable<? extends ListenableFuture<? extends T>> futures) {
-    // Can't use Iterables.toArray because it's not gwt compatible
-    final Collection<ListenableFuture<? extends T>> collection;
-    if (futures instanceof Collection) {
-      collection = (Collection<ListenableFuture<? extends T>>) futures;
-    } else {
-      collection = ImmutableList.copyOf(futures);
-    }
-    @SuppressWarnings("unchecked")
-    ListenableFuture<? extends T>[] copy =
-        (ListenableFuture<? extends T>[])
-            collection.toArray(new ListenableFuture[collection.size()]);
+    ListenableFuture<? extends T>[] copy = gwtCompatibleToArray(futures);
     final InCompletionOrderState<T> state = new InCompletionOrderState<>(copy);
-    ImmutableList.Builder<AbstractFuture<T>> delegatesBuilder = ImmutableList.builder();
+    ImmutableList.Builder<AbstractFuture<T>> delegatesBuilder =
+        ImmutableList.builderWithExpectedSize(copy.length);
     for (int i = 0; i < copy.length; i++) {
       delegatesBuilder.add(new InCompletionOrderFuture<T>(state));
     }
@@ -869,11 +900,25 @@
     return delegatesCast;
   }
 
+  /** Can't use Iterables.toArray because it's not gwt compatible */
+  @SuppressWarnings("unchecked")
+  private static <T extends @Nullable Object> ListenableFuture<? extends T>[] gwtCompatibleToArray(
+      Iterable<? extends ListenableFuture<? extends T>> futures) {
+    final Collection<ListenableFuture<? extends T>> collection;
+    if (futures instanceof Collection) {
+      collection = (Collection<ListenableFuture<? extends T>>) futures;
+    } else {
+      collection = ImmutableList.copyOf(futures);
+    }
+    return (ListenableFuture<? extends T>[]) collection.toArray(new ListenableFuture<?>[0]);
+  }
+
   // This can't be a TrustedFuture, because TrustedFuture has clever optimizations that
   // mean cancel won't be called if this Future is passed into setFuture, and then
   // cancelled.
-  private static final class InCompletionOrderFuture<T> extends AbstractFuture<T> {
-    private InCompletionOrderState<T> state;
+  private static final class InCompletionOrderFuture<T extends @Nullable Object>
+      extends AbstractFuture<T> {
+    @CheckForNull private InCompletionOrderState<T> state;
 
     private InCompletionOrderFuture(InCompletionOrderState<T> state) {
       this.state = state;
@@ -883,7 +928,15 @@
     public boolean cancel(boolean interruptIfRunning) {
       InCompletionOrderState<T> localState = state;
       if (super.cancel(interruptIfRunning)) {
-        localState.recordOutputCancellation(interruptIfRunning);
+        /*
+         * requireNonNull is generally safe: If cancel succeeded, then this Future was still
+         * pending, so its `state` field hasn't been nulled out yet.
+         *
+         * OK, it's technically possible for this to fail in the presence of unsafe publishing, as
+         * discussed in the comments in TimeoutFuture. TODO(cpovirk): Maybe check for null before
+         * calling recordOutputCancellation?
+         */
+        requireNonNull(localState).recordOutputCancellation(interruptIfRunning);
         return true;
       }
       return false;
@@ -895,6 +948,7 @@
     }
 
     @Override
+    @CheckForNull
     protected String pendingToString() {
       InCompletionOrderState<T> localState = state;
       if (localState != null) {
@@ -910,14 +964,15 @@
     }
   }
 
-  private static final class InCompletionOrderState<T> {
+  private static final class InCompletionOrderState<T extends @Nullable Object> {
     // A happens-before edge between the writes of these fields and their reads exists, because
     // in order to read these fields, the corresponding write to incompleteOutputCount must have
     // been read.
     private boolean wasCancelled = false;
     private boolean shouldInterrupt = true;
     private final AtomicInteger incompleteOutputCount;
-    private final ListenableFuture<? extends T>[] inputFutures;
+    // We set the elements of the array to null as they complete.
+    private final @Nullable ListenableFuture<? extends T>[] inputFutures;
     private volatile int delegateIndex = 0;
 
     private InCompletionOrderState(ListenableFuture<? extends T>[] inputFutures) {
@@ -937,7 +992,11 @@
 
     private void recordInputCompletion(
         ImmutableList<AbstractFuture<T>> delegates, int inputFutureIndex) {
-      ListenableFuture<? extends T> inputFuture = inputFutures[inputFutureIndex];
+      /*
+       * requireNonNull is safe because we accepted an Iterable of non-null Future instances, and we
+       * don't overwrite an element in the array until after reading it.
+       */
+      ListenableFuture<? extends T> inputFuture = requireNonNull(inputFutures[inputFutureIndex]);
       // Null out our reference to this future, so it can be GCed
       inputFutures[inputFutureIndex] = null;
       for (int i = delegateIndex; i < delegates.size(); i++) {
@@ -956,7 +1015,7 @@
 
     private void recordCompletion() {
       if (incompleteOutputCount.decrementAndGet() == 0 && wasCancelled) {
-        for (ListenableFuture<?> toCancel : inputFutures) {
+        for (ListenableFuture<? extends T> toCancel : inputFutures) {
           if (toCancel != null) {
             toCancel.cancel(shouldInterrupt);
           }
@@ -1006,7 +1065,7 @@
    * @param executor The executor to run {@code callback} when the future completes.
    * @since 10.0
    */
-  public static <V> void addCallback(
+  public static <V extends @Nullable Object> void addCallback(
       final ListenableFuture<V> future,
       final FutureCallback<? super V> callback,
       Executor executor) {
@@ -1015,7 +1074,7 @@
   }
 
   /** See {@link #addCallback(ListenableFuture, FutureCallback, Executor)} for behavioral notes. */
-  private static final class CallbackListener<V> implements Runnable {
+  private static final class CallbackListener<V extends @Nullable Object> implements Runnable {
     final Future<V> future;
     final FutureCallback<? super V> callback;
 
@@ -1074,7 +1133,8 @@
    */
   @CanIgnoreReturnValue
   // TODO(cpovirk): Consider calling getDone() in our own code.
-  public static <V> V getDone(Future<V> future) throws ExecutionException {
+  @ParametricNullness
+  public static <V extends @Nullable Object> V getDone(Future<V> future) throws ExecutionException {
     /*
      * We throw IllegalStateException, since the call could succeed later. Perhaps we "should" throw
      * IllegalArgumentException, since the call could succeed with a different argument. Those
@@ -1082,7 +1142,6 @@
      * IllegalArgumentException here, in part to keep its recommendation simple: Static methods
      * should throw IllegalStateException only when they use static state.
      *
-     *
      * Why do we deviate here? The answer: We want for fluentFuture.getDone() to throw the same
      * exception as Futures.getDone(fluentFuture).
      */
@@ -1135,8 +1194,9 @@
   @Beta
   @CanIgnoreReturnValue
   @GwtIncompatible // reflection
-  public static <V, X extends Exception> V getChecked(Future<V> future, Class<X> exceptionClass)
-      throws X {
+  @ParametricNullness
+  public static <V extends @Nullable Object, X extends Exception> V getChecked(
+      Future<V> future, Class<X> exceptionClass) throws X {
     return FuturesGetChecked.getChecked(future, exceptionClass);
   }
 
@@ -1187,7 +1247,8 @@
   @CanIgnoreReturnValue
   @GwtIncompatible // reflection
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  public static <V, X extends Exception> V getChecked(
+  @ParametricNullness
+  public static <V extends @Nullable Object, X extends Exception> V getChecked(
       Future<V> future, Class<X> exceptionClass, long timeout, TimeUnit unit) throws X {
     return FuturesGetChecked.getChecked(future, exceptionClass, timeout, unit);
   }
@@ -1227,7 +1288,8 @@
    * @since 10.0
    */
   @CanIgnoreReturnValue
-  public static <V> V getUnchecked(Future<V> future) {
+  @ParametricNullness
+  public static <V extends @Nullable Object> V getUnchecked(Future<V> future) {
     checkNotNull(future);
     try {
       return getUninterruptibly(future);
@@ -1257,7 +1319,7 @@
    * the computation -- makes sense, and if we don't convert it, the user still has to write a
    * try-catch block.
    *
-   * If you think you would use this method, let us know. You might also also look into the
+   * If you think you would use this method, let us know. You might also look into the
    * Fork-Join framework: http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html
    */
 }
diff --git a/android/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java b/android/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java
index a5e9d32..04564f3 100644
--- a/android/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java
+++ b/android/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java
@@ -23,7 +23,6 @@
 import com.google.common.base.Function;
 import com.google.common.collect.Ordering;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import com.google.j2objc.annotations.J2ObjCIncompatible;
 import java.lang.ref.WeakReference;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
@@ -35,20 +34,25 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Static methods used to implement {@link Futures#getChecked(Future, Class)}. */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class FuturesGetChecked {
   @CanIgnoreReturnValue
-  static <V, X extends Exception> V getChecked(Future<V> future, Class<X> exceptionClass) throws X {
+  @ParametricNullness
+  static <V extends @Nullable Object, X extends Exception> V getChecked(
+      Future<V> future, Class<X> exceptionClass) throws X {
     return getChecked(bestGetCheckedTypeValidator(), future, exceptionClass);
   }
 
   /** Implementation of {@link Futures#getChecked(Future, Class)}. */
   @CanIgnoreReturnValue
   @VisibleForTesting
-  static <V, X extends Exception> V getChecked(
+  @ParametricNullness
+  static <V extends @Nullable Object, X extends Exception> V getChecked(
       GetCheckedTypeValidator validator, Future<V> future, Class<X> exceptionClass) throws X {
     validator.validateClass(exceptionClass);
     try {
@@ -64,7 +68,8 @@
 
   /** Implementation of {@link Futures#getChecked(Future, Class, long, TimeUnit)}. */
   @CanIgnoreReturnValue
-  static <V, X extends Exception> V getChecked(
+  @ParametricNullness
+  static <V extends @Nullable Object, X extends Exception> V getChecked(
       Future<V> future, Class<X> exceptionClass, long timeout, TimeUnit unit) throws X {
     // TODO(cpovirk): benchmark a version of this method that accepts a GetCheckedTypeValidator
     bestGetCheckedTypeValidator().validateClass(exceptionClass);
@@ -95,12 +100,6 @@
     return GetCheckedTypeValidatorHolder.WeakSetValidator.INSTANCE;
   }
 
-  @J2ObjCIncompatible // ClassValue
-  @VisibleForTesting
-  static GetCheckedTypeValidator classValueValidator() {
-    return GetCheckedTypeValidatorHolder.ClassValueValidator.INSTANCE;
-  }
-
   /**
    * Provides a check of whether an exception type is valid for use with {@link
    * FuturesGetChecked#getChecked(Future, Class)}, possibly using caching.
@@ -109,35 +108,8 @@
    */
   @VisibleForTesting
   static class GetCheckedTypeValidatorHolder {
-    static final String CLASS_VALUE_VALIDATOR_NAME =
-        GetCheckedTypeValidatorHolder.class.getName() + "$ClassValueValidator";
-
     static final GetCheckedTypeValidator BEST_VALIDATOR = getBestValidator();
 
-    @IgnoreJRERequirement // getChecked falls back to another implementation if necessary
-    @J2ObjCIncompatible // ClassValue
-    enum ClassValueValidator implements GetCheckedTypeValidator {
-      INSTANCE;
-
-      /*
-       * Static final fields are presumed to be fastest, based on our experience with
-       * UnsignedBytesBenchmark. TODO(cpovirk): benchmark this
-       */
-      private static final ClassValue<Boolean> isValidClass =
-          new ClassValue<Boolean>() {
-            @Override
-            protected Boolean computeValue(Class<?> type) {
-              checkExceptionClassValidity(type.asSubclass(Exception.class));
-              return true;
-            }
-          };
-
-      @Override
-      public void validateClass(Class<? extends Exception> exceptionClass) {
-        isValidClass.get(exceptionClass); // throws if invalid; returns safely (and caches) if valid
-      }
-    }
-
     enum WeakSetValidator implements GetCheckedTypeValidator {
       INSTANCE;
 
@@ -184,12 +156,7 @@
      * unable to do so.
      */
     static GetCheckedTypeValidator getBestValidator() {
-      try {
-        Class<?> theClass = Class.forName(CLASS_VALUE_VALIDATOR_NAME);
-        return (GetCheckedTypeValidator) theClass.getEnumConstants()[0];
-      } catch (Throwable t) { // ensure we really catch *everything*
-        return weakSetValidator();
-      }
+      return weakSetValidator();
     }
   }
 
@@ -225,7 +192,7 @@
     @SuppressWarnings({"unchecked", "rawtypes"})
     List<Constructor<X>> constructors = (List) Arrays.asList(exceptionClass.getConstructors());
     for (Constructor<X> constructor : preferringStrings(constructors)) {
-      @NullableDecl X instance = newFromConstructor(constructor, cause);
+      X instance = newFromConstructor(constructor, cause);
       if (instance != null) {
         if (instance.getCause() == null) {
           instance.initCause(cause);
@@ -256,7 +223,7 @@
               })
           .reverse();
 
-  @NullableDecl
+  @CheckForNull
   private static <X> X newFromConstructor(Constructor<X> constructor, Throwable cause) {
     Class<?>[] paramTypes = constructor.getParameterTypes();
     Object[] params = new Object[paramTypes.length];
diff --git a/android/guava/src/com/google/common/util/concurrent/GwtFluentFutureCatchingSpecialization.java b/android/guava/src/com/google/common/util/concurrent/GwtFluentFutureCatchingSpecialization.java
index e8acf62..d29a673 100644
--- a/android/guava/src/com/google/common/util/concurrent/GwtFluentFutureCatchingSpecialization.java
+++ b/android/guava/src/com/google/common/util/concurrent/GwtFluentFutureCatchingSpecialization.java
@@ -15,6 +15,7 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtCompatible;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Hidden superclass of {@link FluentFuture} that provides us a place to declare special GWT
@@ -22,7 +23,9 @@
  * FluentFuture.catching} family of methods. Those versions have slightly different signatures.
  */
 @GwtCompatible(emulated = true)
-abstract class GwtFluentFutureCatchingSpecialization<V> extends AbstractFuture<V> {
+@ElementTypesAreNonnullByDefault
+abstract class GwtFluentFutureCatchingSpecialization<V extends @Nullable Object>
+    extends AbstractFuture<V> {
   /*
    * This server copy of the class is empty. The corresponding GWT copy contains alternative
    * versions of catching() and catchingAsync() with slightly different signatures from the ones
diff --git a/android/guava/src/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java b/android/guava/src/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java
index 4626ce9..95131ce 100644
--- a/android/guava/src/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java
+++ b/android/guava/src/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java
@@ -23,6 +23,7 @@
  * different signatures.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class GwtFuturesCatchingSpecialization {
   /*
    * This server copy of the class is empty. The corresponding GWT copy contains alternative
diff --git a/android/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java b/android/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java
deleted file mode 100644
index b557ac6..0000000
--- a/android/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2019 The Guava Authors
- *
- * 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 com.google.common.util.concurrent;
-
-@interface IgnoreJRERequirement {}
diff --git a/android/guava/src/com/google/common/util/concurrent/ImmediateFuture.java b/android/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
index 89b168b..81912f5 100644
--- a/android/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
@@ -23,19 +23,20 @@
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Implementation of {@link Futures#immediateFuture}. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 // TODO(cpovirk): Make this final (but that may break Mockito spy calls).
-class ImmediateFuture<V> implements ListenableFuture<V> {
-  static final ListenableFuture<?> NULL = new ImmediateFuture<>(null);
+class ImmediateFuture<V extends @Nullable Object> implements ListenableFuture<V> {
+  static final ListenableFuture<?> NULL = new ImmediateFuture<@Nullable Object>(null);
 
   private static final Logger log = Logger.getLogger(ImmediateFuture.class.getName());
 
-  @NullableDecl private final V value;
+  @ParametricNullness private final V value;
 
-  ImmediateFuture(@NullableDecl V value) {
+  ImmediateFuture(@ParametricNullness V value) {
     this.value = value;
   }
 
@@ -62,11 +63,13 @@
 
   // TODO(lukes): Consider throwing InterruptedException when appropriate.
   @Override
+  @ParametricNullness
   public V get() {
     return value;
   }
 
   @Override
+  @ParametricNullness
   public V get(long timeout, TimeUnit unit) throws ExecutionException {
     checkNotNull(unit);
     return get();
@@ -88,13 +91,13 @@
     return super.toString() + "[status=SUCCESS, result=[" + value + "]]";
   }
 
-  static final class ImmediateFailedFuture<V> extends TrustedFuture<V> {
+  static final class ImmediateFailedFuture<V extends @Nullable Object> extends TrustedFuture<V> {
     ImmediateFailedFuture(Throwable thrown) {
       setException(thrown);
     }
   }
 
-  static final class ImmediateCancelledFuture<V> extends TrustedFuture<V> {
+  static final class ImmediateCancelledFuture<V extends @Nullable Object> extends TrustedFuture<V> {
     ImmediateCancelledFuture() {
       cancel(false);
     }
diff --git a/android/guava/src/com/google/common/util/concurrent/InterruptibleTask.java b/android/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
index acebae4..168adf2 100644
--- a/android/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
+++ b/android/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
@@ -14,20 +14,26 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.util.concurrent.NullnessCasts.uncheckedCastNullableTToT;
+
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.j2objc.annotations.ReflectionSupport;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.AbstractOwnableSynchronizer;
 import java.util.concurrent.locks.LockSupport;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 @GwtCompatible(emulated = true)
 @ReflectionSupport(value = ReflectionSupport.Level.FULL)
+@ElementTypesAreNonnullByDefault
 // Some Android 5.0.x Samsung devices have bugs in JDK reflection APIs that cause
 // getDeclaredField to throw a NoSuchFieldException when the field is definitely there.
 // Since this class only needs CAS on one field, we can avoid this bug by extending AtomicReference
 // instead of using an AtomicReferenceFieldUpdater. This reference stores Thread instances
 // and DONE/INTERRUPTED - they have a common ancestor of Runnable.
-abstract class InterruptibleTask<T> extends AtomicReference<Runnable> implements Runnable {
+abstract class InterruptibleTask<T extends @Nullable Object>
+    extends AtomicReference<@Nullable Runnable> implements Runnable {
   static {
     // Prevent rare disastrous classloading in first call to LockSupport.park.
     // See: https://bugs.openjdk.java.net/browse/JDK-8074773
@@ -42,7 +48,6 @@
   // The thread executing the task publishes itself to the superclass' reference and the thread
   // interrupting sets DONE when it has finished interrupting.
   private static final Runnable DONE = new DoNothingRunnable();
-  private static final Runnable INTERRUPTING = new DoNothingRunnable();
   private static final Runnable PARKED = new DoNothingRunnable();
   // Why 1000?  WHY NOT!
   private static final int MAX_BUSY_WAIT_SPINS = 1000;
@@ -73,68 +78,85 @@
     } finally {
       // Attempt to set the task as done so that further attempts to interrupt will fail.
       if (!compareAndSet(currentThread, DONE)) {
-        // If we were interrupted, it is possible that the interrupted bit hasn't been set yet. Wait
-        // for the interrupting thread to set DONE. See interruptTask().
-        // We want to wait so that we don't interrupt the _next_ thing run on the thread.
-        // Note: We don't reset the interrupted bit, just wait for it to be set.
-        // If this is a thread pool thread, the thread pool will reset it for us. Otherwise, the
-        // interrupted bit may have been intended for something else, so don't clear it.
-        boolean restoreInterruptedBit = false;
-        int spinCount = 0;
-        // Interrupting Cow Says:
-        //  ______
-        // < Spin >
-        //  ------
-        //        \   ^__^
-        //         \  (oo)\_______
-        //            (__)\       )\/\
-        //                ||----w |
-        //                ||     ||
-        Runnable state = get();
-        while (state == INTERRUPTING || state == PARKED) {
-          spinCount++;
-          if (spinCount > MAX_BUSY_WAIT_SPINS) {
-            // If we have spun a lot just park ourselves.
-            // This will save CPU while we wait for a slow interrupting thread.  In theory
-            // interruptTask() should be very fast but due to InterruptibleChannel and
-            // JavaLangAccess.blockedOn(Thread, Interruptible), it isn't predictable what work might
-            // be done.  (e.g. close a file and flush buffers to disk).  To protect ourselve from
-            // this we park ourselves and tell our interrupter that we did so.
-            if (state == PARKED || compareAndSet(INTERRUPTING, PARKED)) {
-              // Interrupting Cow Says:
-              //  ______
-              // < Park >
-              //  ------
-              //        \   ^__^
-              //         \  (oo)\_______
-              //            (__)\       )\/\
-              //                ||----w |
-              //                ||     ||
-              // We need to clear the interrupted bit prior to calling park and maintain it in case
-              // we wake up spuriously.
-              restoreInterruptedBit = Thread.interrupted() || restoreInterruptedBit;
-              LockSupport.park(this);
-            }
-          } else {
-            Thread.yield();
-          }
-          state = get();
-        }
-        if (restoreInterruptedBit) {
-          currentThread.interrupt();
-        }
-        /*
-         * TODO(cpovirk): Clear interrupt status here? We currently don't, which means that an
-         * interrupt before, during, or after runInterruptibly() (unless it produced an
-         * InterruptedException caught above) can linger and affect listeners.
-         */
+        waitForInterrupt(currentThread);
       }
       if (run) {
-        afterRanInterruptibly(result, error);
+        if (error == null) {
+          // The cast is safe because of the `run` and `error` checks.
+          afterRanInterruptiblySuccess(uncheckedCastNullableTToT(result));
+        } else {
+          afterRanInterruptiblyFailure(error);
+        }
       }
     }
   }
 
+  private void waitForInterrupt(Thread currentThread) {
+    /*
+     * If someone called cancel(true), it is possible that the interrupted bit hasn't been set yet.
+     * Wait for the interrupting thread to set DONE. (See interruptTask().) We want to wait so that
+     * the interrupting thread doesn't interrupt the _next_ thing to run on this thread.
+     *
+     * Note: We don't reset the interrupted bit, just wait for it to be set. If this is a thread
+     * pool thread, the thread pool will reset it for us. Otherwise, the interrupted bit may have
+     * been intended for something else, so don't clear it.
+     */
+    boolean restoreInterruptedBit = false;
+    int spinCount = 0;
+    // Interrupting Cow Says:
+    //  ______
+    // < Spin >
+    //  ------
+    //        \   ^__^
+    //         \  (oo)\_______
+    //            (__)\       )\/\
+    //                ||----w |
+    //                ||     ||
+    Runnable state = get();
+    Blocker blocker = null;
+    while (state instanceof Blocker || state == PARKED) {
+      if (state instanceof Blocker) {
+        blocker = (Blocker) state;
+      }
+      spinCount++;
+      if (spinCount > MAX_BUSY_WAIT_SPINS) {
+        /*
+         * If we have spun a lot, just park ourselves. This will save CPU while we wait for a slow
+         * interrupting thread. In theory, interruptTask() should be very fast, but due to
+         * InterruptibleChannel and JavaLangAccess.blockedOn(Thread, Interruptible), it isn't
+         * predictable what work might be done. (e.g., close a file and flush buffers to disk). To
+         * protect ourselves from this, we park ourselves and tell our interrupter that we did so.
+         */
+        if (state == PARKED || compareAndSet(state, PARKED)) {
+          // Interrupting Cow Says:
+          //  ______
+          // < Park >
+          //  ------
+          //        \   ^__^
+          //         \  (oo)\_______
+          //            (__)\       )\/\
+          //                ||----w |
+          //                ||     ||
+          // We need to clear the interrupted bit prior to calling park and maintain it in case we
+          // wake up spuriously.
+          restoreInterruptedBit = Thread.interrupted() || restoreInterruptedBit;
+          LockSupport.park(blocker);
+        }
+      } else {
+        Thread.yield();
+      }
+      state = get();
+    }
+    if (restoreInterruptedBit) {
+      currentThread.interrupt();
+    }
+    /*
+     * TODO(cpovirk): Clear interrupt status here? We currently don't, which means that an interrupt
+     * before, during, or after runInterruptibly() (unless it produced an InterruptedException
+     * caught above) can linger and affect listeners.
+     */
+  }
+
   /**
    * Called before runInterruptibly - if true, runInterruptibly and afterRanInterruptibly will not
    * be called.
@@ -145,13 +167,20 @@
    * Do interruptible work here - do not complete Futures here, as their listeners could be
    * interrupted.
    */
+  @ParametricNullness
   abstract T runInterruptibly() throws Exception;
 
   /**
    * Any interruption that happens as a result of calling interruptTask will arrive before this
    * method is called. Complete Futures here.
    */
-  abstract void afterRanInterruptibly(@NullableDecl T result, @NullableDecl Throwable error);
+  abstract void afterRanInterruptiblySuccess(@ParametricNullness T result);
+
+  /**
+   * Any interruption that happens as a result of calling interruptTask will arrive before this
+   * method is called. Complete Futures here.
+   */
+  abstract void afterRanInterruptiblyFailure(Throwable error);
 
   /**
    * Interrupts the running task. Because this internally calls {@link Thread#interrupt()} which can
@@ -162,29 +191,59 @@
     // in this CAS, there's no risk of interrupting the wrong thread or interrupting a thread that
     // isn't currently executing this task.
     Runnable currentRunner = get();
-    if (currentRunner instanceof Thread && compareAndSet(currentRunner, INTERRUPTING)) {
-      // Thread.interrupt can throw aribitrary exceptions due to the nio InterruptibleChannel API
-      // This will make sure that tasks don't get stuck busy waiting.
-      // Some of this is fixed in jdk11 (see https://bugs.openjdk.java.net/browse/JDK-8198692) but
-      // not all.  See the test cases for examples on how this can happen.
-      try {
-        ((Thread) currentRunner).interrupt();
-      } finally {
-        Runnable prev = getAndSet(DONE);
-        if (prev == PARKED) {
-          LockSupport.unpark((Thread) currentRunner);
+    if (currentRunner instanceof Thread) {
+      Blocker blocker = new Blocker(this);
+      blocker.setOwner(Thread.currentThread());
+      if (compareAndSet(currentRunner, blocker)) {
+        // Thread.interrupt can throw arbitrary exceptions due to the nio InterruptibleChannel API
+        // This will make sure that tasks don't get stuck busy waiting.
+        // Some of this is fixed in jdk11 (see https://bugs.openjdk.java.net/browse/JDK-8198692) but
+        // not all.  See the test cases for examples on how this can happen.
+        try {
+          ((Thread) currentRunner).interrupt();
+        } finally {
+          Runnable prev = getAndSet(DONE);
+          if (prev == PARKED) {
+            LockSupport.unpark((Thread) currentRunner);
+          }
         }
       }
     }
   }
 
+  /**
+   * Using this as the blocker object allows introspection and debugging tools to see that the
+   * currentRunner thread is blocked on the progress of the interruptor thread, which can help
+   * identify deadlocks.
+   */
+  @VisibleForTesting
+  static final class Blocker extends AbstractOwnableSynchronizer implements Runnable {
+    private final InterruptibleTask<?> task;
+
+    private Blocker(InterruptibleTask<?> task) {
+      this.task = task;
+    }
+
+    @Override
+    public void run() {}
+
+    private void setOwner(Thread thread) {
+      super.setExclusiveOwnerThread(thread);
+    }
+
+    @Override
+    public String toString() {
+      return task.toString();
+    }
+  }
+
   @Override
   public final String toString() {
     Runnable state = get();
     final String result;
     if (state == DONE) {
       result = "running=[DONE]";
-    } else if (state == INTERRUPTING) {
+    } else if (state instanceof Blocker) {
       result = "running=[INTERRUPTED]";
     } else if (state instanceof Thread) {
       // getName is final on Thread, no need to worry about exceptions
diff --git a/android/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java b/android/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
index 1b84302..82f8d95 100644
--- a/android/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
+++ b/android/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
@@ -24,6 +24,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.atomic.AtomicBoolean;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Utilities necessary for working with libraries that supply plain {@link Future} instances. Note
@@ -35,6 +36,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class JdkFutureAdapters {
   /**
    * Assigns a thread to the given {@link Future} to provide {@link ListenableFuture} functionality.
@@ -49,7 +51,8 @@
    * ListenableFutureTask}, {@link AbstractFuture}, and other utilities over creating plain {@code
    * Future} instances to be upgraded to {@code ListenableFuture} after the fact.
    */
-  public static <V> ListenableFuture<V> listenInPoolThread(Future<V> future) {
+  public static <V extends @Nullable Object> ListenableFuture<V> listenInPoolThread(
+      Future<V> future) {
     if (future instanceof ListenableFuture) {
       return (ListenableFuture<V>) future;
     }
@@ -76,7 +79,8 @@
    *
    * @since 12.0
    */
-  public static <V> ListenableFuture<V> listenInPoolThread(Future<V> future, Executor executor) {
+  public static <V extends @Nullable Object> ListenableFuture<V> listenInPoolThread(
+      Future<V> future, Executor executor) {
     checkNotNull(executor);
     if (future instanceof ListenableFuture) {
       return (ListenableFuture<V>) future;
@@ -93,8 +97,8 @@
    * <p>If the delegate future is interrupted or throws an unexpected unchecked exception, the
    * listeners will not be invoked.
    */
-  private static class ListenableFutureAdapter<V> extends ForwardingFuture<V>
-      implements ListenableFuture<V> {
+  private static class ListenableFutureAdapter<V extends @Nullable Object>
+      extends ForwardingFuture<V> implements ListenableFuture<V> {
 
     private static final ThreadFactory threadFactory =
         new ThreadFactoryBuilder()
diff --git a/android/guava/src/com/google/common/util/concurrent/ListenableFuture.java b/android/guava/src/com/google/common/util/concurrent/ListenableFuture.java
index 98e31ed..cf0199a 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListenableFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListenableFuture.java
@@ -18,6 +18,7 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Future} that accepts completion listeners. Each listener has an associated executor, and
@@ -99,8 +100,32 @@
  * @author Nishant Thakkar
  * @since 1.0
  */
+/*
+ * Some of the annotations below were added after we released our separate
+ * com.google.guava:listenablefuture:1.0 artifact. (For more on that artifact, see
+ * https://github.com/google/guava/releases/tag/v27.0) This means that the copy of ListenableFuture
+ * in com.google.guava:guava differs from the "frozen" copy in the listenablefuture artifact. This
+ * could in principle cause problems for some users. Still, we expect that the benefits of the
+ * nullness annotations in particular will outweigh the costs. (And it's worth noting that we have
+ * released multiple ListenableFuture.class files that are not byte-for-byte compatible even from
+ * the beginning, thanks to using different `-source -target` values for compiling our `-jre` and
+ * `-android` "flavors.")
+ *
+ * (We could consider releasing a listenablefuture:1.0.1 someday. But we would want to look into how
+ * that affects users, especially users of the Android Gradle Plugin, since the plugin developers
+ * put in a special hack for us: https://issuetracker.google.com/issues/131431257)
+ */
 @DoNotMock("Use the methods in Futures (like immediateFuture) or SettableFuture")
-public interface ListenableFuture<V> extends Future<V> {
+/*
+ * It would make sense to also annotate this class with @ElementTypesAreNonnullByDefault. However,
+ * it makes no difference because this class is already covered by the package-level
+ * @ParametersAreNonnullByDefault, and this class declares only parameters, not return types or
+ * fields. (Not to mention that we'll be removing all @*AreNonnullByDefault annotations after tools
+ * understand .) And it's fortunate that the annotation makes no difference, because
+ * we're seeing a breakage internally when we add that annotation :)
+ *
+ */
+public interface ListenableFuture<V extends @Nullable Object> extends Future<V> {
   /**
    * Registers a listener to be {@linkplain Executor#execute(Runnable) run} on the given executor.
    * The listener will run when the {@code Future}'s computation is {@linkplain Future#isDone()
diff --git a/android/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java b/android/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
index 9f6f7e3..9fdcc53 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
@@ -25,7 +25,7 @@
 import java.util.concurrent.FutureTask;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link FutureTask} that also implements the {@link ListenableFuture} interface. Unlike {@code
@@ -41,7 +41,9 @@
  * @since 1.0
  */
 @GwtIncompatible
-public class ListenableFutureTask<V> extends FutureTask<V> implements ListenableFuture<V> {
+@ElementTypesAreNonnullByDefault
+public class ListenableFutureTask<V extends @Nullable Object> extends FutureTask<V>
+    implements ListenableFuture<V> {
   // TODO(cpovirk): explore ways of making ListenableFutureTask final. There are some valid reasons
   // such as BoundedQueueExecutorService to allow extends but it would be nice to make it final to
   // avoid unintended usage.
@@ -56,7 +58,7 @@
    * @param callable the callable task
    * @since 10.0
    */
-  public static <V> ListenableFutureTask<V> create(Callable<V> callable) {
+  public static <V extends @Nullable Object> ListenableFutureTask<V> create(Callable<V> callable) {
     return new ListenableFutureTask<V>(callable);
   }
 
@@ -70,7 +72,8 @@
    *     ListenableFutureTask.create(runnable, null)}
    * @since 10.0
    */
-  public static <V> ListenableFutureTask<V> create(Runnable runnable, @NullableDecl V result) {
+  public static <V extends @Nullable Object> ListenableFutureTask<V> create(
+      Runnable runnable, @ParametricNullness V result) {
     return new ListenableFutureTask<V>(runnable, result);
   }
 
@@ -78,7 +81,7 @@
     super(callable);
   }
 
-  ListenableFutureTask(Runnable runnable, @NullableDecl V result) {
+  ListenableFutureTask(Runnable runnable, @ParametricNullness V result) {
     super(runnable, result);
   }
 
@@ -89,6 +92,7 @@
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public V get(long timeout, TimeUnit unit)
       throws TimeoutException, InterruptedException, ExecutionException {
 
diff --git a/android/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java b/android/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
index 77fa5f7..e5aa5e3 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.concurrent.ScheduledFuture;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Helper interface to implement both {@link ListenableFuture} and {@link ScheduledFuture}.
@@ -26,4 +27,6 @@
  */
 @Beta
 @GwtCompatible
-public interface ListenableScheduledFuture<V> extends ScheduledFuture<V>, ListenableFuture<V> {}
+@ElementTypesAreNonnullByDefault
+public interface ListenableScheduledFuture<V extends @Nullable Object>
+    extends ScheduledFuture<V>, ListenableFuture<V> {}
diff --git a/android/guava/src/com/google/common/util/concurrent/ListenerCallQueue.java b/android/guava/src/com/google/common/util/concurrent/ListenerCallQueue.java
index ee6b5b9..ed8c906 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListenerCallQueue.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListenerCallQueue.java
@@ -53,6 +53,7 @@
  * #dispatch} is expected to be called concurrently, it is idempotent.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class ListenerCallQueue<L> {
   // TODO(cpovirk): consider using the logger associated with listener.getClass().
   private static final Logger logger = Logger.getLogger(ListenerCallQueue.class.getName());
@@ -123,7 +124,7 @@
 
   /**
    * A special purpose queue/executor that dispatches listener events serially on a configured
-   * executor. Each event event can be added and dispatched as separate phases.
+   * executor. Each event can be added and dispatched as separate phases.
    *
    * <p>This class is very similar to {@link SequentialExecutor} with the exception that events can
    * be added without necessarily executing immediately.
diff --git a/android/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java b/android/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java
index 469eb67..83ea759 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java
@@ -23,6 +23,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.TimeUnit;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An {@link ExecutorService} that returns {@link ListenableFuture} instances. To create an instance
@@ -36,13 +37,14 @@
     "Use TestingExecutors.sameThreadScheduledExecutor, or wrap a real Executor from "
         + "java.util.concurrent.Executors with MoreExecutors.listeningDecorator")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface ListeningExecutorService extends ExecutorService {
   /**
    * @return a {@code ListenableFuture} representing pending completion of the task
    * @throws RejectedExecutionException {@inheritDoc}
    */
   @Override
-  <T> ListenableFuture<T> submit(Callable<T> task);
+  <T extends @Nullable Object> ListenableFuture<T> submit(Callable<T> task);
 
   /**
    * @return a {@code ListenableFuture} representing pending completion of the task
@@ -56,7 +58,8 @@
    * @throws RejectedExecutionException {@inheritDoc}
    */
   @Override
-  <T> ListenableFuture<T> submit(Runnable task, T result);
+  <T extends @Nullable Object> ListenableFuture<T> submit(
+      Runnable task, @ParametricNullness T result);
 
   /**
    * {@inheritDoc}
@@ -77,7 +80,7 @@
    * @throws NullPointerException if any task is null
    */
   @Override
-  <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
+  <T extends @Nullable Object> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
       throws InterruptedException;
 
   /**
@@ -100,7 +103,7 @@
    * @throws NullPointerException if any task is null
    */
   @Override
-  <T> List<Future<T>> invokeAll(
+  <T extends @Nullable Object> List<Future<T>> invokeAll(
       Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
       throws InterruptedException;
 }
diff --git a/android/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java b/android/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java
index 959a2fc..a6be949 100644
--- a/android/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java
+++ b/android/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java
@@ -18,6 +18,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link ScheduledExecutorService} that returns {@link ListenableFuture} instances from its
@@ -29,6 +30,7 @@
  * @since 10.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface ListeningScheduledExecutorService
     extends ScheduledExecutorService, ListeningExecutorService {
 
@@ -38,7 +40,8 @@
 
   /** @since 15.0 (previously returned ScheduledFuture) */
   @Override
-  <V> ListenableScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit);
+  <V extends @Nullable Object> ListenableScheduledFuture<V> schedule(
+      Callable<V> callable, long delay, TimeUnit unit);
 
   /** @since 15.0 (previously returned ScheduledFuture) */
   @Override
diff --git a/android/guava/src/com/google/common/util/concurrent/Monitor.java b/android/guava/src/com/google/common/util/concurrent/Monitor.java
index 27ee85d..d88a8bc 100644
--- a/android/guava/src/com/google/common/util/concurrent/Monitor.java
+++ b/android/guava/src/com/google/common/util/concurrent/Monitor.java
@@ -24,7 +24,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.ReentrantLock;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A synchronization abstraction supporting waiting on arbitrary boolean conditions.
@@ -200,6 +200,7 @@
 @Beta
 @GwtIncompatible
 @SuppressWarnings("GuardedBy") // TODO(b/35466881): Fix or suppress.
+@ElementTypesAreNonnullByDefault
 public final class Monitor {
   // TODO(user): Use raw LockSupport or AbstractQueuedSynchronizer instead of ReentrantLock.
   // TODO(user): "Port" jsr166 tests for ReentrantLock.
@@ -311,7 +312,7 @@
 
     /** The next active guard */
     @GuardedBy("monitor.lock")
-    @NullableDecl
+    @CheckForNull
     Guard next;
 
     protected Guard(Monitor monitor) {
@@ -338,6 +339,7 @@
    * A linked list threaded through the Guard.next field.
    */
   @GuardedBy("lock")
+  @CheckForNull
   private Guard activeGuards = null;
 
   /**
diff --git a/android/guava/src/com/google/common/util/concurrent/MoreExecutors.java b/android/guava/src/com/google/common/util/concurrent/MoreExecutors.java
index 584e27a..eaf6501 100644
--- a/android/guava/src/com/google/common/util/concurrent/MoreExecutors.java
+++ b/android/guava/src/com/google/common/util/concurrent/MoreExecutors.java
@@ -49,6 +49,7 @@
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Factory and utility methods for {@link java.util.concurrent.Executor}, {@link ExecutorService},
@@ -60,6 +61,7 @@
  * @since 3.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class MoreExecutors {
   private MoreExecutors() {}
 
@@ -392,6 +394,12 @@
    *       (In simple cases, callers can avoid this by registering all tasks with the same {@link
    *       MoreExecutors#newSequentialExecutor} wrapper around {@code directExecutor()}. More
    *       complex cases may require using thread pools or making deeper changes.)
+   *   <li>If an exception propagates out of a {@code Runnable}, it is not necessarily seen by any
+   *       {@code UncaughtExceptionHandler} for the thread. For example, if the callback passed to
+   *       {@link Futures#addCallback} throws an exception, that exception will be typically be
+   *       logged by the {@link ListenableFuture} implementation, even if the thread is configured
+   *       to do something different. In other cases, no code will catch the exception, and it may
+   *       terminate whichever thread happens to trigger the execution.
    * </ul>
    *
    * Additionally, beware of executing tasks with {@code directExecutor} while holding a lock. Since
@@ -411,7 +419,6 @@
    * <p>This should be preferred to {@link #newDirectExecutorService()} because implementing the
    * {@link ExecutorService} subinterface necessitates significant performance overhead.
    *
-   *
    * @since 18.0
    */
   public static Executor directExecutor() {
@@ -550,6 +557,11 @@
     public final void execute(Runnable command) {
       delegate.execute(command);
     }
+
+    @Override
+    public final String toString() {
+      return super.toString() + "[" + delegate + "]";
+    }
   }
 
   @GwtIncompatible // TODO
@@ -565,13 +577,14 @@
 
     @Override
     public ListenableScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
-      TrustedListenableFutureTask<Void> task = TrustedListenableFutureTask.create(command, null);
+      TrustedListenableFutureTask<@Nullable Void> task =
+          TrustedListenableFutureTask.create(command, null);
       ScheduledFuture<?> scheduled = delegate.schedule(task, delay, unit);
-      return new ListenableScheduledTask<>(task, scheduled);
+      return new ListenableScheduledTask<@Nullable Void>(task, scheduled);
     }
 
     @Override
-    public <V> ListenableScheduledFuture<V> schedule(
+    public <V extends @Nullable Object> ListenableScheduledFuture<V> schedule(
         Callable<V> callable, long delay, TimeUnit unit) {
       TrustedListenableFutureTask<V> task = TrustedListenableFutureTask.create(callable);
       ScheduledFuture<?> scheduled = delegate.schedule(task, delay, unit);
@@ -583,7 +596,7 @@
         Runnable command, long initialDelay, long period, TimeUnit unit) {
       NeverSuccessfulListenableFutureTask task = new NeverSuccessfulListenableFutureTask(command);
       ScheduledFuture<?> scheduled = delegate.scheduleAtFixedRate(task, initialDelay, period, unit);
-      return new ListenableScheduledTask<>(task, scheduled);
+      return new ListenableScheduledTask<@Nullable Void>(task, scheduled);
     }
 
     @Override
@@ -592,10 +605,10 @@
       NeverSuccessfulListenableFutureTask task = new NeverSuccessfulListenableFutureTask(command);
       ScheduledFuture<?> scheduled =
           delegate.scheduleWithFixedDelay(task, initialDelay, delay, unit);
-      return new ListenableScheduledTask<>(task, scheduled);
+      return new ListenableScheduledTask<@Nullable Void>(task, scheduled);
     }
 
-    private static final class ListenableScheduledTask<V>
+    private static final class ListenableScheduledTask<V extends @Nullable Object>
         extends SimpleForwardingListenableFuture<V> implements ListenableScheduledFuture<V> {
 
       private final ScheduledFuture<?> scheduledDelegate;
@@ -631,7 +644,7 @@
 
     @GwtIncompatible // TODO
     private static final class NeverSuccessfulListenableFutureTask
-        extends AbstractFuture.TrustedFuture<Void> implements Runnable {
+        extends AbstractFuture.TrustedFuture<@Nullable Void> implements Runnable {
       private final Runnable delegate;
 
       public NeverSuccessfulListenableFutureTask(Runnable delegate) {
@@ -647,6 +660,11 @@
           throw Throwables.propagate(t);
         }
       }
+
+      @Override
+      protected String pendingToString() {
+        return "task=[" + delegate + "]";
+      }
     }
   }
 
@@ -666,7 +684,9 @@
    * implementations.
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  @GwtIncompatible static <T> T invokeAnyImpl(
+  @GwtIncompatible
+  @ParametricNullness
+  static <T extends @Nullable Object> T invokeAnyImpl(
       ListeningExecutorService executorService,
       Collection<? extends Callable<T>> tasks,
       boolean timed,
@@ -746,7 +766,7 @@
    * Submits the task and adds a listener that adds the future to {@code queue} when it completes.
    */
   @GwtIncompatible // TODO
-  private static <T> ListenableFuture<T> submitAndAddQueueListener(
+  private static <T extends @Nullable Object> ListenableFuture<T> submitAndAddQueueListener(
       ListeningExecutorService executorService,
       Callable<T> task,
       final BlockingQueue<Future<T>> queue) {
@@ -858,7 +878,6 @@
    * right before each task is run. The renaming is best effort, if a {@link SecurityManager}
    * prevents the renaming then it will be skipped but the tasks will still execute.
    *
-   *
    * @param executor The executor to decorate
    * @param nameSupplier The source of names for each task
    */
@@ -882,7 +901,6 @@
    * right before each task is run. The renaming is best effort, if a {@link SecurityManager}
    * prevents the renaming then it will be skipped but the tasks will still execute.
    *
-   *
    * @param service The executor to decorate
    * @param nameSupplier The source of names for each task
    */
@@ -893,7 +911,7 @@
     checkNotNull(nameSupplier);
     return new WrappingExecutorService(service) {
       @Override
-      protected <T> Callable<T> wrapTask(Callable<T> callable) {
+      protected <T extends @Nullable Object> Callable<T> wrapTask(Callable<T> callable) {
         return Callables.threadRenaming(callable, nameSupplier);
       }
 
@@ -912,7 +930,6 @@
    * right before each task is run. The renaming is best effort, if a {@link SecurityManager}
    * prevents the renaming then it will be skipped but the tasks will still execute.
    *
-   *
    * @param service The executor to decorate
    * @param nameSupplier The source of names for each task
    */
@@ -923,7 +940,7 @@
     checkNotNull(nameSupplier);
     return new WrappingScheduledExecutorService(service) {
       @Override
-      protected <T> Callable<T> wrapTask(Callable<T> callable) {
+      protected <T extends @Nullable Object> Callable<T> wrapTask(Callable<T> callable) {
         return Callables.threadRenaming(callable, nameSupplier);
       }
 
diff --git a/android/guava/src/com/google/common/util/concurrent/NullnessCasts.java b/android/guava/src/com/google/common/util/concurrent/NullnessCasts.java
new file mode 100644
index 0000000..0a0d719
--- /dev/null
+++ b/android/guava/src/com/google/common/util/concurrent/NullnessCasts.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.util.concurrent;
+
+import com.google.common.annotations.GwtCompatible;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/** A utility method to perform unchecked casts to suppress errors produced by nullness analyses. */
+@GwtCompatible
+@ElementTypesAreNonnullByDefault
+final class NullnessCasts {
+  /**
+   * Accepts a {@code @Nullable T} and returns a plain {@code T}, without performing any check that
+   * that conversion is safe.
+   *
+   * <p>This method is intended to help with usages of type parameters that have {@linkplain
+   * ParametricNullness parametric nullness}. If a type parameter instead ranges over only non-null
+   * types (or if the type is a non-variable type, like {@code String}), then code should almost
+   * never use this method, preferring instead to call {@code requireNonNull} so as to benefit from
+   * its runtime check.
+   *
+   * <p>An example use case for this method is in implementing an {@code Iterator<T>} whose {@code
+   * next} field is lazily initialized. The type of that field would be {@code @Nullable T}, and the
+   * code would be responsible for populating a "real" {@code T} (which might still be the value
+   * {@code null}!) before returning it to callers. Depending on how the code is structured, a
+   * nullness analysis might not understand that the field has been populated. To avoid that problem
+   * without having to add {@code @SuppressWarnings}, the code can call this method.
+   *
+   * <p>Why <i>not</i> just add {@code SuppressWarnings}? The problem is that this method is
+   * typically useful for {@code return} statements. That leaves the code with two options: Either
+   * add the suppression to the whole method (which turns off checking for a large section of code),
+   * or extract a variable, and put the suppression on that. However, a local variable typically
+   * doesn't work: Because nullness analyses typically infer the nullness of local variables,
+   * there's no way to assign a {@code @Nullable T} to a field {@code T foo;} and instruct the
+   * analysis that that means "plain {@code T}" rather than the inferred type {@code @Nullable T}.
+   * (Even if supported added {@code @NonNull}, that would not help, since the problem case
+   * addressed by this method is the case in which {@code T} has parametric nullness -- and thus its
+   * value may be legitimately {@code null}.)
+   */
+  @SuppressWarnings("nullness")
+  @ParametricNullness
+  static <T extends @Nullable Object> T uncheckedCastNullableTToT(@CheckForNull T t) {
+    return t;
+  }
+
+  /**
+   * Returns {@code null} cast to any type.
+   *
+   * <p>This method is intended to help with usages of type parameters that have {@linkplain
+   * ParametricNullness parametric nullness}. Sometimes, code may receive a null {@code T} but store
+   * a "null sentinel" to take its place. When the time comes to convert it back to a {@code T} to
+   * return to a caller, the code needs to a way to return {@code null} from a method that returns
+   * "plain {@code T}." This API provides that.
+   */
+  @SuppressWarnings("nullness")
+  @ParametricNullness
+  static <T extends @Nullable Object> T uncheckedNull() {
+    return null;
+  }
+
+  private NullnessCasts() {}
+}
diff --git a/android/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java b/android/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java
index ae871e0..3038ab7 100644
--- a/android/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java
+++ b/android/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java
@@ -17,19 +17,20 @@
 import static java.lang.Math.min;
 
 import java.util.concurrent.locks.LockSupport;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Works around an android bug, where parking for more than INT_MAX seconds can produce an abort
  * signal on 32 bit devices running Android Q.
  */
+@ElementTypesAreNonnullByDefault
 final class OverflowAvoidingLockSupport {
   // Represents the max nanoseconds representable on a linux timespec with a 32 bit tv_sec
   static final long MAX_NANOSECONDS_THRESHOLD = (1L + Integer.MAX_VALUE) * 1_000_000_000L - 1L;
 
   private OverflowAvoidingLockSupport() {}
 
-  static void parkNanos(@NullableDecl Object blocker, long nanos) {
+  static void parkNanos(@CheckForNull Object blocker, long nanos) {
     // Even in the extremely unlikely event that a thread unblocks itself early after only 68 years,
     // this is indistinguishable from a spurious wakeup, which LockSupport allows.
     LockSupport.parkNanos(blocker, min(nanos, MAX_NANOSECONDS_THRESHOLD));
diff --git a/android/guava/src/com/google/common/util/concurrent/ParametricNullness.java b/android/guava/src/com/google/common/util/concurrent/ParametricNullness.java
new file mode 100644
index 0000000..ebc5928
--- /dev/null
+++ b/android/guava/src/com/google/common/util/concurrent/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.util.concurrent;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/util/concurrent/Partially.java b/android/guava/src/com/google/common/util/concurrent/Partially.java
index c40ab4e..7aa16e7 100644
--- a/android/guava/src/com/google/common/util/concurrent/Partially.java
+++ b/android/guava/src/com/google/common/util/concurrent/Partially.java
@@ -32,6 +32,7 @@
  * version.
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class Partially {
   /**
    * The presence of this annotation on an API indicates that the method <i>may</i> be used with the
diff --git a/android/guava/src/com/google/common/util/concurrent/Platform.java b/android/guava/src/com/google/common/util/concurrent/Platform.java
index 94e6700..cfb96a0 100644
--- a/android/guava/src/com/google/common/util/concurrent/Platform.java
+++ b/android/guava/src/com/google/common/util/concurrent/Platform.java
@@ -15,13 +15,14 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtCompatible;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /** Methods factored out so that they can be emulated differently in GWT. */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class Platform {
   static boolean isInstanceOfThrowableClass(
-      @NullableDecl Throwable t, Class<? extends Throwable> expectedClass) {
+      @CheckForNull Throwable t, Class<? extends Throwable> expectedClass) {
     return expectedClass.isInstance(t);
   }
 
diff --git a/android/guava/src/com/google/common/util/concurrent/RateLimiter.java b/android/guava/src/com/google/common/util/concurrent/RateLimiter.java
index 99824ee..9bcf118 100644
--- a/android/guava/src/com/google/common/util/concurrent/RateLimiter.java
+++ b/android/guava/src/com/google/common/util/concurrent/RateLimiter.java
@@ -29,7 +29,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * A rate limiter. Conceptually, a rate limiter distributes permits at a configurable rate. Each
@@ -92,6 +92,7 @@
 // would mean a maximum rate of "1MB/s", which might be small in some cases.
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class RateLimiter {
   /**
    * Creates a {@code RateLimiter} with the specified stable throughput, given as "permits per
@@ -184,7 +185,7 @@
   private final SleepingStopwatch stopwatch;
 
   // Can't be initialized in the constructor because mocks don't call the constructor.
-  @NullableDecl private volatile Object mutexDoNotUseDirectly;
+  @CheckForNull private volatile Object mutexDoNotUseDirectly;
 
   private Object mutex() {
     Object mutex = mutexDoNotUseDirectly;
diff --git a/android/guava/src/com/google/common/util/concurrent/Runnables.java b/android/guava/src/com/google/common/util/concurrent/Runnables.java
index e1ebd23..5503f68 100644
--- a/android/guava/src/com/google/common/util/concurrent/Runnables.java
+++ b/android/guava/src/com/google/common/util/concurrent/Runnables.java
@@ -24,6 +24,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Runnables {
 
   private static final Runnable EMPTY_RUNNABLE =
diff --git a/android/guava/src/com/google/common/util/concurrent/SequentialExecutor.java b/android/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
index 5604175..052c7e0 100644
--- a/android/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
+++ b/android/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
@@ -31,6 +31,7 @@
 import java.util.concurrent.RejectedExecutionException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
 
 /**
  * Executor ensuring that all Runnables submitted are executed in order, using the provided
@@ -47,6 +48,7 @@
  * restarted by a call to {@link #execute}.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class SequentialExecutor implements Executor {
   private static final Logger log = Logger.getLogger(SequentialExecutor.class.getName());
 
@@ -91,7 +93,7 @@
    * Adds a task to the queue and makes sure a worker thread is running.
    *
    * <p>If this method throws, e.g. a {@code RejectedExecutionException} from the delegate executor,
-   * execution of tasks will stop until a call to this method or to {@link #resume()} is made.
+   * execution of tasks will stop until a call to this method is made.
    */
   @Override
   public void execute(final Runnable task) {
@@ -170,7 +172,7 @@
 
   /** Worker that runs tasks from {@link #queue} until it is empty. */
   private final class QueueWorker implements Runnable {
-    Runnable task;
+    @CheckForNull Runnable task;
 
     @Override
     public void run() {
diff --git a/android/guava/src/com/google/common/util/concurrent/Service.java b/android/guava/src/com/google/common/util/concurrent/Service.java
index 2c6cdab..0999a30 100644
--- a/android/guava/src/com/google/common/util/concurrent/Service.java
+++ b/android/guava/src/com/google/common/util/concurrent/Service.java
@@ -53,6 +53,7 @@
  */
 @DoNotMock("Create an AbstractIdleService")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface Service {
   /**
    * If the service state is {@link State#NEW}, this initiates service startup and returns
@@ -175,61 +176,28 @@
    */
   enum State {
     /** A service in this state is inactive. It does minimal work and consumes minimal resources. */
-    NEW {
-      @Override
-      boolean isTerminal() {
-        return false;
-      }
-    },
+    NEW,
 
     /** A service in this state is transitioning to {@link #RUNNING}. */
-    STARTING {
-      @Override
-      boolean isTerminal() {
-        return false;
-      }
-    },
+    STARTING,
 
     /** A service in this state is operational. */
-    RUNNING {
-      @Override
-      boolean isTerminal() {
-        return false;
-      }
-    },
+    RUNNING,
 
     /** A service in this state is transitioning to {@link #TERMINATED}. */
-    STOPPING {
-      @Override
-      boolean isTerminal() {
-        return false;
-      }
-    },
+    STOPPING,
 
     /**
      * A service in this state has completed execution normally. It does minimal work and consumes
      * minimal resources.
      */
-    TERMINATED {
-      @Override
-      boolean isTerminal() {
-        return true;
-      }
-    },
+    TERMINATED,
 
     /**
      * A service in this state has encountered a problem and may not be operational. It cannot be
      * started nor stopped.
      */
-    FAILED {
-      @Override
-      boolean isTerminal() {
-        return true;
-      }
-    };
-
-    /** Returns true if this state is terminal. */
-    abstract boolean isTerminal();
+    FAILED,
   }
 
   /**
diff --git a/android/guava/src/com/google/common/util/concurrent/ServiceManager.java b/android/guava/src/com/google/common/util/concurrent/ServiceManager.java
index e5c5e14..2e1c21a 100644
--- a/android/guava/src/com/google/common/util/concurrent/ServiceManager.java
+++ b/android/guava/src/com/google/common/util/concurrent/ServiceManager.java
@@ -118,6 +118,7 @@
  * @since 14.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ServiceManager implements ServiceManagerBridge {
   private static final Logger logger = Logger.getLogger(ServiceManager.class.getName());
   private static final ListenerCallQueue.Event<Listener> HEALTHY_EVENT =
@@ -595,9 +596,9 @@
         // N.B. There will only be an entry in the map if the service has started
         for (Entry<Service, Stopwatch> entry : startupTimers.entrySet()) {
           Service service = entry.getKey();
-          Stopwatch stopWatch = entry.getValue();
-          if (!stopWatch.isRunning() && !(service instanceof NoOpService)) {
-            loadTimes.add(Maps.immutableEntry(service, stopWatch.elapsed(MILLISECONDS)));
+          Stopwatch stopwatch = entry.getValue();
+          if (!stopwatch.isRunning() && !(service instanceof NoOpService)) {
+            loadTimes.add(Maps.immutableEntry(service, stopwatch.elapsed(MILLISECONDS)));
           }
         }
       } finally {
diff --git a/android/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java b/android/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java
index a9300a6..7ae430e 100644
--- a/android/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java
+++ b/android/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java
@@ -26,6 +26,7 @@
  * {@code servicesByState()} to return {@code ImmutableMultimap}.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 interface ServiceManagerBridge {
   ImmutableMultimap<State, Service> servicesByState();
 }
diff --git a/android/guava/src/com/google/common/util/concurrent/SettableFuture.java b/android/guava/src/com/google/common/util/concurrent/SettableFuture.java
index 1c220e6..893161e 100644
--- a/android/guava/src/com/google/common/util/concurrent/SettableFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/SettableFuture.java
@@ -16,7 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link ListenableFuture} whose result can be set by a {@link #set(Object)}, {@link
@@ -33,17 +33,19 @@
  * @since 9.0 (in 1.0 as {@code ValueFuture})
  */
 @GwtCompatible
-public final class SettableFuture<V> extends AbstractFuture.TrustedFuture<V> {
+@ElementTypesAreNonnullByDefault
+public final class SettableFuture<V extends @Nullable Object>
+    extends AbstractFuture.TrustedFuture<V> {
   /**
    * Creates a new {@code SettableFuture} that can be completed or cancelled by a later method call.
    */
-  public static <V> SettableFuture<V> create() {
+  public static <V extends @Nullable Object> SettableFuture<V> create() {
     return new SettableFuture<V>();
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean set(@NullableDecl V value) {
+  public boolean set(@ParametricNullness V value) {
     return super.set(value);
   }
 
diff --git a/android/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java b/android/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
index 9d0b81b..5a1969e 100644
--- a/android/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
+++ b/android/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
@@ -34,6 +34,8 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A TimeLimiter that runs method calls in the background using an {@link ExecutorService}. If the
@@ -45,6 +47,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class SimpleTimeLimiter implements TimeLimiter {
 
   private final ExecutorService executor;
@@ -85,11 +88,14 @@
     InvocationHandler handler =
         new InvocationHandler() {
           @Override
-          public Object invoke(Object obj, final Method method, final Object[] args)
+          @CheckForNull
+          public Object invoke(
+              Object obj, final Method method, @CheckForNull final @Nullable Object[] args)
               throws Throwable {
-            Callable<Object> callable =
-                new Callable<Object>() {
+            Callable<@Nullable Object> callable =
+                new Callable<@Nullable Object>() {
                   @Override
+                  @CheckForNull
                   public Object call() throws Exception {
                     try {
                       return method.invoke(target, args);
@@ -113,7 +119,7 @@
     return interfaceType.cast(object);
   }
 
-  private <T> T callWithTimeout(
+  private <T extends @Nullable Object> T callWithTimeout(
       Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit, boolean amInterruptible)
       throws Exception {
     checkNotNull(callable);
@@ -143,7 +149,8 @@
 
   @CanIgnoreReturnValue
   @Override
-  public <T> T callWithTimeout(Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
+  public <T extends @Nullable Object> T callWithTimeout(
+      Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException, InterruptedException, ExecutionException {
     checkNotNull(callable);
     checkNotNull(timeoutUnit);
@@ -164,7 +171,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public <T> T callUninterruptiblyWithTimeout(
+  public <T extends @Nullable Object> T callUninterruptiblyWithTimeout(
       Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException, ExecutionException {
     checkNotNull(callable);
diff --git a/android/guava/src/com/google/common/util/concurrent/SmoothRateLimiter.java b/android/guava/src/com/google/common/util/concurrent/SmoothRateLimiter.java
index d78d7da..ca78905 100644
--- a/android/guava/src/com/google/common/util/concurrent/SmoothRateLimiter.java
+++ b/android/guava/src/com/google/common/util/concurrent/SmoothRateLimiter.java
@@ -22,14 +22,15 @@
 import java.util.concurrent.TimeUnit;
 
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class SmoothRateLimiter extends RateLimiter {
   /*
    * How is the RateLimiter designed, and why?
    *
-   * The primary feature of a RateLimiter is its "stable rate", the maximum rate that is should
-   * allow at normal conditions. This is enforced by "throttling" incoming requests as needed, i.e.
-   * compute, for an incoming request, the appropriate throttle time, and make the calling thread
-   * wait as much.
+   * The primary feature of a RateLimiter is its "stable rate", the maximum rate that it should
+   * allow in normal conditions. This is enforced by "throttling" incoming requests as needed. For
+   * example, we could compute the appropriate throttle time for an incoming request, and make the
+   * calling thread wait for that time.
    *
    * The simplest way to maintain a rate of QPS is to keep the timestamp of the last granted
    * request, and ensure that (1/QPS) seconds have elapsed since then. For example, for a rate of
diff --git a/android/guava/src/com/google/common/util/concurrent/Striped.java b/android/guava/src/com/google/common/util/concurrent/Striped.java
index c9ba772..fc8bcd8 100644
--- a/android/guava/src/com/google/common/util/concurrent/Striped.java
+++ b/android/guava/src/com/google/common/util/concurrent/Striped.java
@@ -14,6 +14,8 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.collect.Lists.newArrayList;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -21,7 +23,6 @@
 import com.google.common.base.Preconditions;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.MapMaker;
 import com.google.common.math.IntMath;
 import com.google.common.primitives.Ints;
@@ -40,6 +41,7 @@
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A striped {@code Lock/Semaphore/ReadWriteLock}. This offers the underlying lock striping similar
@@ -82,6 +84,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class Striped<L> {
   /**
    * If there are at least this many stripes, we assume the memory usage of a ConcurrentMap will be
@@ -136,26 +139,26 @@
    * @return the stripes corresponding to the objects (one per each object, derived by delegating to
    *     {@link #get(Object)}; may contain duplicates), in an increasing index order.
    */
-  public Iterable<L> bulkGet(Iterable<?> keys) {
-    // Initially using the array to store the keys, then reusing it to store the respective L's
-    final Object[] array = Iterables.toArray(keys, Object.class);
-    if (array.length == 0) {
+  public Iterable<L> bulkGet(Iterable<? extends Object> keys) {
+    // Initially using the list to store the keys, then reusing it to store the respective L's
+    List<Object> result = newArrayList(keys);
+    if (result.isEmpty()) {
       return ImmutableList.of();
     }
-    int[] stripes = new int[array.length];
-    for (int i = 0; i < array.length; i++) {
-      stripes[i] = indexFor(array[i]);
+    int[] stripes = new int[result.size()];
+    for (int i = 0; i < result.size(); i++) {
+      stripes[i] = indexFor(result.get(i));
     }
     Arrays.sort(stripes);
     // optimize for runs of identical stripes
     int previousStripe = stripes[0];
-    array[0] = getAt(previousStripe);
-    for (int i = 1; i < array.length; i++) {
+    result.set(0, getAt(previousStripe));
+    for (int i = 1; i < result.size(); i++) {
       int currentStripe = stripes[i];
       if (currentStripe == previousStripe) {
-        array[i] = array[i - 1];
+        result.set(i, result.get(i - 1));
       } else {
-        array[i] = getAt(currentStripe);
+        result.set(i, getAt(currentStripe));
         previousStripe = currentStripe;
       }
     }
@@ -177,8 +180,8 @@
      * be garbage collected after locking them, ending up in a huge mess.
      */
     @SuppressWarnings("unchecked") // we carefully replaced all keys with their respective L's
-    List<L> asList = (List<L>) Arrays.asList(array);
-    return Collections.unmodifiableList(asList);
+    List<L> asStripes = (List<L>) result;
+    return Collections.unmodifiableList(asStripes);
   }
 
   // Static factories
@@ -435,7 +438,7 @@
    */
   @VisibleForTesting
   static class SmallLazyStriped<L> extends PowerOfTwoStriped<L> {
-    final AtomicReferenceArray<ArrayReference<? extends L>> locks;
+    final AtomicReferenceArray<@Nullable ArrayReference<? extends L>> locks;
     final Supplier<L> supplier;
     final int size;
     final ReferenceQueue<L> queue = new ReferenceQueue<L>();
diff --git a/android/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java b/android/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
index f09ed4e..1027f3c 100644
--- a/android/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
+++ b/android/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -25,6 +26,7 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.atomic.AtomicLong;
+import javax.annotation.CheckForNull;
 
 /**
  * A ThreadFactory builder, providing any combination of these features:
@@ -45,12 +47,13 @@
  */
 @CanIgnoreReturnValue
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ThreadFactoryBuilder {
-  private String nameFormat = null;
-  private Boolean daemon = null;
-  private Integer priority = null;
-  private UncaughtExceptionHandler uncaughtExceptionHandler = null;
-  private ThreadFactory backingThreadFactory = null;
+  @CheckForNull private String nameFormat = null;
+  @CheckForNull private Boolean daemon = null;
+  @CheckForNull private Integer priority = null;
+  @CheckForNull private UncaughtExceptionHandler uncaughtExceptionHandler = null;
+  @CheckForNull private ThreadFactory backingThreadFactory = null;
 
   /** Creates a new {@link ThreadFactory} builder. */
   public ThreadFactoryBuilder() {}
@@ -162,7 +165,8 @@
       public Thread newThread(Runnable runnable) {
         Thread thread = backingThreadFactory.newThread(runnable);
         if (nameFormat != null) {
-          thread.setName(format(nameFormat, count.getAndIncrement()));
+          // requireNonNull is safe because we create `count` if (and only if) we have a nameFormat.
+          thread.setName(format(nameFormat, requireNonNull(count).getAndIncrement()));
         }
         if (daemon != null) {
           thread.setDaemon(daemon);
diff --git a/android/guava/src/com/google/common/util/concurrent/TimeLimiter.java b/android/guava/src/com/google/common/util/concurrent/TimeLimiter.java
index b841517..0883bcc 100644
--- a/android/guava/src/com/google/common/util/concurrent/TimeLimiter.java
+++ b/android/guava/src/com/google/common/util/concurrent/TimeLimiter.java
@@ -22,6 +22,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Imposes a time limit on method calls.
@@ -34,6 +35,7 @@
 @DoNotMock("Use FakeTimeLimiter")
 @GwtIncompatible
 @SuppressWarnings("GoodTime") // should have java.time.Duration overloads
+@ElementTypesAreNonnullByDefault
 public interface TimeLimiter {
 
   /**
@@ -97,7 +99,8 @@
    * @since 22.0
    */
   @CanIgnoreReturnValue
-  <T> T callWithTimeout(Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
+  <T extends @Nullable Object> T callWithTimeout(
+      Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException, InterruptedException, ExecutionException;
 
   /**
@@ -120,7 +123,7 @@
    * @since 22.0
    */
   @CanIgnoreReturnValue
-  <T> T callUninterruptiblyWithTimeout(
+  <T extends @Nullable Object> T callUninterruptiblyWithTimeout(
       Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException, ExecutionException;
 
diff --git a/android/guava/src/com/google/common/util/concurrent/TimeoutFuture.java b/android/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
index a91bf67..219a098 100644
--- a/android/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
+++ b/android/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
@@ -24,7 +24,8 @@
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@code Futures#withTimeout}.
@@ -34,8 +35,9 @@
  * interrupted and cancelled if it times out.
  */
 @GwtIncompatible
-final class TimeoutFuture<V> extends FluentFuture.TrustedFuture<V> {
-  static <V> ListenableFuture<V> create(
+@ElementTypesAreNonnullByDefault
+final class TimeoutFuture<V extends @Nullable Object> extends FluentFuture.TrustedFuture<V> {
+  static <V extends @Nullable Object> ListenableFuture<V> create(
       ListenableFuture<V> delegate,
       long time,
       TimeUnit unit,
@@ -71,16 +73,16 @@
    * write-barriers).
    */
 
-  @NullableDecl private ListenableFuture<V> delegateRef;
-  @NullableDecl private ScheduledFuture<?> timer;
+  @CheckForNull private ListenableFuture<V> delegateRef;
+  @CheckForNull private ScheduledFuture<?> timer;
 
   private TimeoutFuture(ListenableFuture<V> delegate) {
     this.delegateRef = Preconditions.checkNotNull(delegate);
   }
 
   /** A runnable that is called when the delegate or the timer completes. */
-  private static final class Fire<V> implements Runnable {
-    @NullableDecl TimeoutFuture<V> timeoutFutureRef;
+  private static final class Fire<V extends @Nullable Object> implements Runnable {
+    @CheckForNull TimeoutFuture<V> timeoutFutureRef;
 
     Fire(TimeoutFuture<V> timeoutFuture) {
       this.timeoutFutureRef = timeoutFuture;
@@ -152,6 +154,7 @@
   }
 
   @Override
+  @CheckForNull
   protected String pendingToString() {
     ListenableFuture<? extends V> localInputFuture = delegateRef;
     ScheduledFuture<?> localTimer = timer;
diff --git a/android/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java b/android/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
index 3115502..a2c2115 100644
--- a/android/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
+++ b/android/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
@@ -21,7 +21,8 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executors;
 import java.util.concurrent.RunnableFuture;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link RunnableFuture} that also implements the {@link ListenableFuture} interface.
@@ -30,14 +31,16 @@
  * performance reasons.
  */
 @GwtCompatible
-class TrustedListenableFutureTask<V> extends FluentFuture.TrustedFuture<V>
+@ElementTypesAreNonnullByDefault
+class TrustedListenableFutureTask<V extends @Nullable Object> extends FluentFuture.TrustedFuture<V>
     implements RunnableFuture<V> {
 
-  static <V> TrustedListenableFutureTask<V> create(AsyncCallable<V> callable) {
+  static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(
+      AsyncCallable<V> callable) {
     return new TrustedListenableFutureTask<V>(callable);
   }
 
-  static <V> TrustedListenableFutureTask<V> create(Callable<V> callable) {
+  static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(Callable<V> callable) {
     return new TrustedListenableFutureTask<V>(callable);
   }
 
@@ -50,7 +53,8 @@
    *     result, consider using constructions of the form: {@code ListenableFuture<?> f =
    *     ListenableFutureTask.create(runnable, null)}
    */
-  static <V> TrustedListenableFutureTask<V> create(Runnable runnable, @NullableDecl V result) {
+  static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(
+      Runnable runnable, @ParametricNullness V result) {
     return new TrustedListenableFutureTask<V>(Executors.callable(runnable, result));
   }
 
@@ -61,7 +65,7 @@
    * <p>{@code volatile} is required for j2objc transpiling:
    * https://developers.google.com/j2objc/guides/j2objc-memory-model#atomicity
    */
-  private volatile InterruptibleTask<?> task;
+  @CheckForNull private volatile InterruptibleTask<?> task;
 
   TrustedListenableFutureTask(Callable<V> callable) {
     this.task = new TrustedFutureInterruptibleTask(callable);
@@ -73,7 +77,7 @@
 
   @Override
   public void run() {
-    InterruptibleTask localTask = task;
+    InterruptibleTask<?> localTask = task;
     if (localTask != null) {
       localTask.run();
     }
@@ -89,7 +93,7 @@
     super.afterDone();
 
     if (wasInterrupted()) {
-      InterruptibleTask localTask = task;
+      InterruptibleTask<?> localTask = task;
       if (localTask != null) {
         localTask.interruptTask();
       }
@@ -99,8 +103,9 @@
   }
 
   @Override
+  @CheckForNull
   protected String pendingToString() {
-    InterruptibleTask localTask = task;
+    InterruptibleTask<?> localTask = task;
     if (localTask != null) {
       return "task=[" + localTask + "]";
     }
@@ -121,17 +126,19 @@
     }
 
     @Override
+    @ParametricNullness
     V runInterruptibly() throws Exception {
       return callable.call();
     }
 
     @Override
-    void afterRanInterruptibly(V result, Throwable error) {
-      if (error == null) {
-        TrustedListenableFutureTask.this.set(result);
-      } else {
-        setException(error);
-      }
+    void afterRanInterruptiblySuccess(@ParametricNullness V result) {
+      TrustedListenableFutureTask.this.set(result);
+    }
+
+    @Override
+    void afterRanInterruptiblyFailure(Throwable error) {
+      setException(error);
     }
 
     @Override
@@ -164,12 +171,13 @@
     }
 
     @Override
-    void afterRanInterruptibly(ListenableFuture<V> result, Throwable error) {
-      if (error == null) {
-        setFuture(result);
-      } else {
-        setException(error);
-      }
+    void afterRanInterruptiblySuccess(ListenableFuture<V> result) {
+      setFuture(result);
+    }
+
+    @Override
+    void afterRanInterruptiblyFailure(Throwable error) {
+      setException(error);
     }
 
     @Override
diff --git a/android/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java b/android/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java
index c0c2600..a1add8b 100644
--- a/android/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java
+++ b/android/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java
@@ -29,6 +29,7 @@
  * @since 8.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class UncaughtExceptionHandlers {
   private UncaughtExceptionHandlers() {}
 
diff --git a/android/guava/src/com/google/common/util/concurrent/UncheckedExecutionException.java b/android/guava/src/com/google/common/util/concurrent/UncheckedExecutionException.java
index 3dde737..713f4a6 100644
--- a/android/guava/src/com/google/common/util/concurrent/UncheckedExecutionException.java
+++ b/android/guava/src/com/google/common/util/concurrent/UncheckedExecutionException.java
@@ -15,7 +15,7 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtCompatible;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Unchecked variant of {@link java.util.concurrent.ExecutionException}. As with {@code
@@ -33,22 +33,29 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class UncheckedExecutionException extends RuntimeException {
+  /*
+   * Ideally, this class would have exposed only constructors that require a non-null cause. We
+   * might try to move in that direction, but there are complications. See
+   * https://github.com/jspecify/nullness-checker-for-checker-framework/blob/61aafa4ae52594830cfc2d61c8b113009dbdb045/src/main/java/com/google/jspecify/nullness/NullSpecTransfer.java#L789
+   */
+
   /** Creates a new instance with {@code null} as its detail message. */
   protected UncheckedExecutionException() {}
 
   /** Creates a new instance with the given detail message. */
-  protected UncheckedExecutionException(@NullableDecl String message) {
+  protected UncheckedExecutionException(@CheckForNull String message) {
     super(message);
   }
 
   /** Creates a new instance with the given detail message and cause. */
-  public UncheckedExecutionException(@NullableDecl String message, @NullableDecl Throwable cause) {
+  public UncheckedExecutionException(@CheckForNull String message, @CheckForNull Throwable cause) {
     super(message, cause);
   }
 
   /** Creates a new instance with the given cause. */
-  public UncheckedExecutionException(@NullableDecl Throwable cause) {
+  public UncheckedExecutionException(@CheckForNull Throwable cause) {
     super(cause);
   }
 
diff --git a/android/guava/src/com/google/common/util/concurrent/UncheckedTimeoutException.java b/android/guava/src/com/google/common/util/concurrent/UncheckedTimeoutException.java
index a09a970..8e30fca 100644
--- a/android/guava/src/com/google/common/util/concurrent/UncheckedTimeoutException.java
+++ b/android/guava/src/com/google/common/util/concurrent/UncheckedTimeoutException.java
@@ -15,7 +15,7 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.compatqual.NullableDecl;
+import javax.annotation.CheckForNull;
 
 /**
  * Unchecked version of {@link java.util.concurrent.TimeoutException}.
@@ -24,18 +24,19 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public class UncheckedTimeoutException extends RuntimeException {
   public UncheckedTimeoutException() {}
 
-  public UncheckedTimeoutException(@NullableDecl String message) {
+  public UncheckedTimeoutException(@CheckForNull String message) {
     super(message);
   }
 
-  public UncheckedTimeoutException(@NullableDecl Throwable cause) {
+  public UncheckedTimeoutException(@CheckForNull Throwable cause) {
     super(cause);
   }
 
-  public UncheckedTimeoutException(@NullableDecl String message, @NullableDecl Throwable cause) {
+  public UncheckedTimeoutException(@CheckForNull String message, @CheckForNull Throwable cause) {
     super(message, cause);
   }
 
diff --git a/android/guava/src/com/google/common/util/concurrent/Uninterruptibles.java b/android/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
index 4f46780..a33ba82 100644
--- a/android/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
+++ b/android/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
@@ -33,6 +33,7 @@
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Utilities for treating interruptible operations as uninterruptible. In all cases, if a thread is
@@ -43,6 +44,7 @@
  * @since 10.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Uninterruptibles {
 
   // Implementation Note: As of 3-7-11, the logic for each blocking/timeout
@@ -193,7 +195,9 @@
    * @throws CancellationException if the computation was cancelled
    */
   @CanIgnoreReturnValue
-  public static <V> V getUninterruptibly(Future<V> future) throws ExecutionException {
+  @ParametricNullness
+  public static <V extends @Nullable Object> V getUninterruptibly(Future<V> future)
+      throws ExecutionException {
     boolean interrupted = false;
     try {
       while (true) {
@@ -231,8 +235,9 @@
   @CanIgnoreReturnValue
   @GwtIncompatible // TODO
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  public static <V> V getUninterruptibly(Future<V> future, long timeout, TimeUnit unit)
-      throws ExecutionException, TimeoutException {
+  @ParametricNullness
+  public static <V extends @Nullable Object> V getUninterruptibly(
+      Future<V> future, long timeout, TimeUnit unit) throws ExecutionException, TimeoutException {
     boolean interrupted = false;
     try {
       long remainingNanos = unit.toNanos(timeout);
diff --git a/android/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java b/android/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
index 217e0a7..03c08cc 100644
--- a/android/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
+++ b/android/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
@@ -29,6 +29,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An abstract {@code ExecutorService} that allows subclasses to {@linkplain #wrapTask(Callable)
@@ -42,6 +43,7 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class WrappingExecutorService implements ExecutorService {
   private final ExecutorService delegate;
 
@@ -53,7 +55,7 @@
    * Wraps a {@code Callable} for submission to the underlying executor. This method is also applied
    * to any {@code Runnable} passed to the default implementation of {@link #wrapTask(Runnable)}.
    */
-  protected abstract <T> Callable<T> wrapTask(Callable<T> callable);
+  protected abstract <T extends @Nullable Object> Callable<T> wrapTask(Callable<T> callable);
 
   /**
    * Wraps a {@code Runnable} for submission to the underlying executor. The default implementation
@@ -79,7 +81,8 @@
    *
    * @throws NullPointerException if any element of {@code tasks} is null
    */
-  private <T> ImmutableList<Callable<T>> wrapTasks(Collection<? extends Callable<T>> tasks) {
+  private <T extends @Nullable Object> ImmutableList<Callable<T>> wrapTasks(
+      Collection<? extends Callable<T>> tasks) {
     ImmutableList.Builder<Callable<T>> builder = ImmutableList.builder();
     for (Callable<T> task : tasks) {
       builder.add(wrapTask(task));
@@ -94,7 +97,7 @@
   }
 
   @Override
-  public final <T> Future<T> submit(Callable<T> task) {
+  public final <T extends @Nullable Object> Future<T> submit(Callable<T> task) {
     return delegate.submit(wrapTask(checkNotNull(task)));
   }
 
@@ -104,31 +107,33 @@
   }
 
   @Override
-  public final <T> Future<T> submit(Runnable task, T result) {
+  public final <T extends @Nullable Object> Future<T> submit(
+      Runnable task, @ParametricNullness T result) {
     return delegate.submit(wrapTask(task), result);
   }
 
   @Override
-  public final <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
-      throws InterruptedException {
+  public final <T extends @Nullable Object> List<Future<T>> invokeAll(
+      Collection<? extends Callable<T>> tasks) throws InterruptedException {
     return delegate.invokeAll(wrapTasks(tasks));
   }
 
   @Override
-  public final <T> List<Future<T>> invokeAll(
+  public final <T extends @Nullable Object> List<Future<T>> invokeAll(
       Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
       throws InterruptedException {
     return delegate.invokeAll(wrapTasks(tasks), timeout, unit);
   }
 
   @Override
-  public final <T> T invokeAny(Collection<? extends Callable<T>> tasks)
+  public final <T extends @Nullable Object> T invokeAny(Collection<? extends Callable<T>> tasks)
       throws InterruptedException, ExecutionException {
     return delegate.invokeAny(wrapTasks(tasks));
   }
 
   @Override
-  public final <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
+  public final <T extends @Nullable Object> T invokeAny(
+      Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
       throws InterruptedException, ExecutionException, TimeoutException {
     return delegate.invokeAny(wrapTasks(tasks), timeout, unit);
   }
diff --git a/android/guava/src/com/google/common/util/concurrent/WrappingScheduledExecutorService.java b/android/guava/src/com/google/common/util/concurrent/WrappingScheduledExecutorService.java
index 4ab700f..48f23c1 100644
--- a/android/guava/src/com/google/common/util/concurrent/WrappingScheduledExecutorService.java
+++ b/android/guava/src/com/google/common/util/concurrent/WrappingScheduledExecutorService.java
@@ -20,6 +20,7 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An abstract {@code ScheduledExecutorService} that allows subclasses to {@linkplain
@@ -31,6 +32,7 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class WrappingScheduledExecutorService extends WrappingExecutorService
     implements ScheduledExecutorService {
   final ScheduledExecutorService delegate;
@@ -46,7 +48,8 @@
   }
 
   @Override
-  public final <V> ScheduledFuture<V> schedule(Callable<V> task, long delay, TimeUnit unit) {
+  public final <V extends @Nullable Object> ScheduledFuture<V> schedule(
+      Callable<V> task, long delay, TimeUnit unit) {
     return delegate.schedule(wrapTask(task), delay, unit);
   }
 
diff --git a/android/guava/src/com/google/common/xml/ElementTypesAreNonnullByDefault.java b/android/guava/src/com/google/common/xml/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..b4fb4e3
--- /dev/null
+++ b/android/guava/src/com/google/common/xml/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.xml;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/android/guava/src/com/google/common/xml/ParametricNullness.java b/android/guava/src/com/google/common/xml/ParametricNullness.java
new file mode 100644
index 0000000..a476558
--- /dev/null
+++ b/android/guava/src/com/google/common/xml/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.xml;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/android/guava/src/com/google/common/xml/XmlEscapers.java b/android/guava/src/com/google/common/xml/XmlEscapers.java
old mode 100755
new mode 100644
index b25fcfc..a1c637c
--- a/android/guava/src/com/google/common/xml/XmlEscapers.java
+++ b/android/guava/src/com/google/common/xml/XmlEscapers.java
@@ -30,7 +30,6 @@
  * non-ASCII characters to their numeric entity replacements. These XML escapers provide the minimal
  * level of escaping to ensure that the output can be safely included in a Unicode XML document.
  *
- *
  * <p>For details on the behavior of the escapers in this class, see sections <a
  * href="http://www.w3.org/TR/2008/REC-xml-20081126/#charsets">2.2</a> and <a
  * href="http://www.w3.org/TR/2008/REC-xml-20081126/#syntax">2.4</a> of the XML specification.
@@ -41,6 +40,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class XmlEscapers {
   private XmlEscapers() {}
 
diff --git a/android/guava/src/com/google/common/xml/package-info.java b/android/guava/src/com/google/common/xml/package-info.java
old mode 100755
new mode 100644
diff --git a/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java b/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
old mode 100755
new mode 100644
index 475cabb..9e5f173
--- a/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
+++ b/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
@@ -30,7 +30,7 @@
  * determining whether a given domain name is an effective top-level domain (public suffix).
  *
  * <p>Because this class is used in GWT, the data members are stored in a space-efficient manner.
- * {@see TrieParser}.
+ * See {@link TrieParser}.
  *
  * @since 16.0
  */
@@ -42,7 +42,7 @@
   /** If a hostname is contained as a key in this map, it is a public suffix. */
   public static final ImmutableMap<String, PublicSuffixType> EXACT =
       TrieParser.parseTrie(
-          "a&0&0trk9--nx?27qjf--nx?e9ebgn--nx?nbb0c7abgm--nx??1&2oa08--nx?apg6qpcbgm--nx?hbbgm--nx?rdceqa08--nx??2&8ugbgm--nx?eyh3la2ckx--nx?qbd9--nx??3&2wqq1--nx?60a0y8--nx??4x1d77xrck--nx?6&1f4a3abgm--nx?2yqyn--nx?3np8lv81qo3--nx?5b06t--nx?axq--nx?ec7q--nx?lbgw--nx??883xnn--nx?9d2c24--nx?a&a?it??b!.&gro?lim?moc?t&en?opsgolb,?ude?vog??abila?c?ihsot?m?n??c!.&b&a?m?n??c&b?g?q??ep?fn?k&s?y??ln?no?oc,pi-on,sn?t&n?opsgolb,?un?ysrab,?i&ma?r&emarp?fa??sroc??naiva?s??d&ats?n&eit?oh??om?sa?tl??eg?f&c?ob??g!emo?naripi?oy??hskihs?i&cnal?dem?hs?k!on??sa!.snduolc,??jnin?k&aso?dov?ede?usto??l!.&c,gro?m&oc?yn,?ofni?r&ep?nb,?t&en?ni??ude?vog??irgnahs?le&nisiuc?rbmuder???m!.&ca?gro?oc?sserp?ten?vog??ahokoy?e00sf7vqn--nx?m??n!.&ac?cc?eman?gro?ibom?loohcs?moc?ni?o&c?fni?rp??r&d?o??s&u?w??vt?xm??av?is?olecrab?tea??p!.&bog?ca?d&em?ls??g&ni?ro??mo&c?n??oba?ten?ude??c?g7hyabgm--nx?ra!.&461e?6pi?iru?nru?rdda-ni?siri???s??q!.&eman?gro?hcs?lim?mo&c?n,?t&en?opsgolb,?ude?vog???r&az?emac?f4a3abgm--nx?n!d5uhf8le58r4w--nx??u&kas?tan???s!.&bup?dem?gro?hcs?moc?ten?ude?vog??ac!.uban.iu,?iv??t&ad?elhta?led?oyot??u!.&a&cinniv?emirc?i&hzhziropaz?stynniv??s&edo?sedo??tlay?vatlop??bs?cc,d&argovorik?o!roghzu??tl,?e&hzhziropaz?nvir?t??f&i?ni,?g&l?ro??hk?i&stvinrehc?ykstynlemhk??k&c?m?s&nagul?t&enod?ul??v&iknarf-onavi?orteporp&end?ind?????l&iponret?opotsa&bes?ves??p??m&k?oc?s?yrk??n&c?d?i?osrehk?v?ylov??o&c,nvor??p&d?p,z??r&c?imotihz?k?ymotyhz??sk?t&en?l?z??ude?v:c?e&alokin?ik??i&alokym?hinrehc?krahk?vl?yk??k?l?o&g!inrehc??krahk??r?,y&ikstinlemhk?mus?s&akrehc?sakrehc?tvonrehc???z&ib,u????v!aj?bb?et?iv??waniko?x&a?iacal??yogan?z&.&bew?c&a?i&n?rga???gro?l&im?oohcs??m&on?t??o&c!.topsgolb,?gn??radnorg?sin?t&en?la??ude?vog?wal??zip???b&00ave5a9iabgm--nx?1&25qhx--nx?68quv--nx?e2kc1--nx??2xtbgm--nx?3&b2kcc--nx?jca1d--nx??4&6&1rfz--nx?qif--nx??96rzc--nx??7w9u16qlj--nx?88uvor--nx?a&0dc4xbgm--nx?c?her?n?ra?t??b!.&erots?gro?moc?o&c?fni??ten?ude?v&og?t??zib??a??c&j?s??d&hesa08--nx?mi??ec?g?l!.&gro?moc?ten?ude?vog??m??s!.&gro?moc?ten?ude?vog???tc-retarebsnegmrev--nx?u&lc!.&elej,snduolc,y&nop,srab,??smas??p!.ysrab,??wp-gnutarebsnegmrev--nx??c&1&1q54--nx?hbgw--nx??2e9c2czf--nx?4&4ub1km--nx?a1e--nx?byj9q--nx?erd5a9b1kcb--nx??8&4xx2g--nx?c9jrb2h--nx??9jr&b&2h--nx?54--nx?9s--nx??c&eg--nx?h3--nx?s2--nx???a!.&gro?lim?moc?ten?ude?vog??3a09--nx!.&ca1o--nx?gva1c--nx?h&ca1o--nx?za09--nx??ta1d--nx?ua08--nx???da??b&a?b?ci?f76a0c7ylqbgm--nx?sh??c!.&eugaelysatnaf,gnipparcs,liamwt,revres-emag,s&nduolc,otohpym,seccaptf,?xsc,?0atf7b45--nx?a1l--nx??e!.&21k?bog?dem?gro?lim?m&oc?yn,?nif?o&fni?rp??ten?ude?vog??beuq?n?smoc??fdh?i&l&buperananab?ohtac??n&agro?ilc?osanap??tic??l!.&gro?m&oc?yn,?oc?ten?ude?vog?yo,?l??m!.&mt?ossa??p1akcq--nx??n!.&mon?ossa??i?p??relcel?s!.&gro?moc?ten?ude?vog??c??t!.&e&m,w,?hc,?s?w??v!.&e0,gro?lim?mo&c?n,?ten?ude?v&g:.d,,og???q??wp?yn??d&2urzc--nx?3&1wrpk--nx?c&4b11--nx?9jrcpf--nx???5xq55--nx?697uto--nx?75yrpk--nx?9ctdvkce--nx?a!.mon?d?er?olnwod??b2babgm--nx?c!.vog?g9a2g2b0ae0chclc--nx??e&m!bulc??r!k??sopxe?timil?w??fc?g!.&mon,ude?vog???h&d3tbgm--nx?p?t??i!.&ased?bew?ca?etrof,hcs?lim?o&c!.topsgolb,?g??ro?sepnop?ten?ym?zib??ar?b?ordna?p?rdam??l&iub?og?row??m!.&ed,ot,pj,t&a,opsgolb,???n&a&b?l!.citats:.&setis,ved,?,lohwen?raas???ob?uf??o&of?rp??r&a&c&tiderc?yalcrab??ugnav??ef506w4b--nx?k!.&oc,ude,?jh3a1habgm--nx??of??s!.&dem?gro?moc?ofni?ten?ude?v&og?t???m!kcrem???t!.topsgolb,excwkcc--nx?l??uolc!.&atcepsrep,citsalej.piv,drayknil,elej,nworu,r&epolroov,opav,?xelpciffart,??za5cbgn--nx??e&1&53wlf--nx?7a1hbbgm--nx?ta3kg--nx??2a6a1b6b1i--nx?3ma0e1cvr--nx?418txh--nx?707b0e3--nx?a!.&ca?gro?hcs?lim?mon,oc?t&en?opsgolb,?vog??09--nx??b!.&ca?gnitsohbew,topsgolb,?ortal?ut!uoy???c&a&lp!.oc,?ps!.&lla4sx,rebu,slootiknil,tsafym,?artxe??sla??i!ffo??n&a&d?iler?nif?rusni!efil?srelevart???eics!.oby,??rofria??d!.&1sndnyd,42pi-nyd,7erauqs,amil4,brb-ni,decalpb,e&daregtmueart,mohsnd,nihcamyek,?hcierebsnoissuksid,keegnietsi,lsd-ni,moc,n&-i-g-o-l,aw-ym,esgnutiel,i&emtsi,lreb-n&i,yd,??oitatsksid-ygolonys,pv&-n&i,yd,?nyd,??orp-ytinummoc,p&h21,iog:ol,,?r&e&ntrapdeeps.remotsuc,su&-lautriv,lautriv,?t&adpusnd,tub-ni,uor-ym,?vres&-e&bucl,mohym,?bew-emoh:.nyd,,luhcs,??ogiv-&niem,ym,??s&d-&onys,ygolonys,?nd&-&dd,nufiat,sehcsimanyd,tenretni,yard,?isoc.nyd,ps,yard,?oper-&nvs,tig,?sndd:.&nyd,sndnyd,?,?topsgolb,vresi-&niem,tset,?xi2,y&awetag-&llawerif,ym,?srab,tic-amil,?zten&mitbel,sadtretteuf,??a&lg?rt!.oby,??i&s&doow?ruoyno??ug?wnoitan??nil?on--nx??e!.&bil?dem?eif?gro?irp?kiir?moc!.topsgolb,?pia?ude?vog??ei?ffoc?gg?r&f?ged???f&a&c?s??il!tem???g!.&gro?lim?mo&c?n,?t&en?vp??ude?vog??a&f?gtrom?p!.&kselp,sndp,ycvrp,??rots?yov??elloc?na&hcxe?ro??roeg?ug??i!.&myn,topsgolb,vog??tilop?v&bba?om???j!.&gro?oc?ten???k!.&c&a?s??e&m?n??ibom?mon,o&c!.topsgolb,?fni?g??ro??i&b?l?n???l&a&dmrif?s!.rof,rof???b&a?i&b?dua???c&aro?ric??dnik?g!oog??i&bom?ms??l&asal?erauqa??ppa?uhcs?yts!efil???m!.&4&32i,pct,?66c,ailisarb,b&dnevar,g-raegelif,?ca?duolcsd,e&d-raegelif,i&-raegelif,lpad:.tsohlacol,,?pcm,?g&ro?s-raegelif,?hctilg,k&catsegde,uoc,?myn,noitatsksid,o&bmoy,c!ku,?t&nigol,poh,??p&ion,j-raegelif,ohbew,?r&aegelif,ofsnd,?s&dym,ndd,ti??t&en?s&acdnuos,ohon,??u&a-raegelif,de?tcn,?v&irp?og??y&golonys,olpedew,srab,??a&g?n!.&reh.togrof,sih.togrof,???em?i&rp?twohs??orhc?w??n!goloc?i&lno!.ysrab,?w??o!.&derno:.gnigats,,knilemoh,rof,?hp?latipac?ts&der?e&gdirb?rif???z!.&66duolc,amil,sh,???ruoblem??om?p!.&bog?gro?lim?m&o&c?n??yn,?t&en?opsgolb,?ude??irg?yks??r!.&mo&c?n??ossa?topsgolb,?a&c!htlaeh??pmoc?wtfos??bc?eh?if?ots!.erawpohs,?taeht?u&ces?sni?t&inruf?necca??za???s!.&a?b!ibnal?rofmok??c!a??d!b?n&arb?ubroflanummok???e?f!noc,?g!ro??h!f??i!trap??k!shf??l?m!oc,t??n!mygskurbrutan??o?p!p??r?s!serp??t!opsgolb,?u?vhf?w?x!uvmok??y?z??a&c?el?hc??i&er?urc??nesemoh?roh?uoh??t&a&d?ts&e!laer??lla???is!.&areduolc,e&lej,nilnigol,retnim,winmo,?k&rowtenoilof,wnf,?laicosnepo,n&eyb,oyc,?spvtsaf,xulel,ysrab,?bew??ov?ra?t&ioled?ol??utitsni??u&lb?qi&nilc?tuob???v!.&21e?b&ew?og??ce&r?t??erots?gro?lim?m&oc?rif??o&c?fni??stra?t&en?ni??ude?vog??as?e3gerb2h--nx?i&l?rd?ssergorp??ol??w&kct--nx?r??xul??f&0f3rkcg--nx?198xim--nx?280xim--nx?7vqn--nx?a!.&gro?mo&c?n,?ten?ude?vog???b!.vog?wa9bgm--nx??c!.topsgolb,a1p--nx?ns??ea1j--nx?fo?g?iam?l&a1d--nx?og??n!.&bew?cer?erots?m&oc?rif??ofni?re&hto?p??stra?ten???orp?p!.&gro?moc?ude???rus?t!w??vd7ckaabgm--nx?w??g&2&4wq55--nx?8zrf6--nx??3&44sd3--nx?91w6j--nx!.&a5wqmg--nx?d&22svcw--nx?5xq55--nx??gla0do--nx?m1qtxm--nx?vta0cu--nx????455ses--nx?5mzt5--nx?69vqhr--nx?7&8a4d5a4prebgm--nx?rb2c--nx??a!.&gro?mo&c?n??oc?ten??vd??b!.&0?1?2?3?4?5?6?7?8?9?a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t!opsgolb,?u?v?w?x?y!srab,?z???c!b?za9a0cbgm--nx??e!.&eman?gro?ics?lim?moc!.topsgolb,?nue?ten?ude?vog??a??g!.&ayc,gro?lenap:.nomead,,oc?saak,ten???i&a?v??k!.&g&olb,ro??ku,lim?moc?oi,pj,su,ten?ude?v&og?t,???m!.&drp?gro?lim?m&o&c?n??t??oc?ude?vog??pk??n!.&dtl,eman?gro?hcs?i!bom??l&im?oc,?m&oc!.topsgolb,?rif,?neg,ogn,ten?ude?vog??aw?i!b!mulp??car?d&art?dew??h&sif?tolc??k&iv?oo&b?c???ls?n&aelc?iart??p!pohs??re&enigne?tac??t&ad?ekram?hgil?lusnoc?neg?ov?soh!.tfarcnepo,?tebdaerps??vi&g?l???o!s??u&rehcisrev?smas?tarebsnegömrev???o&d?lb?og!.duolc,??r&2n084qlj--nx?ebmoolb?o!.&77ndc.c:sr,,a&remacytirucesym,t&neimip,sivretla,?z,?bew-llams,d&ab-yrev-si,e&sufnocsim,vas-si,?nuof-si,oog-yrev-si,uolc&arfniarodef,mw,??e&a,cin-yrev-si,grof&loot,peh,?l&as-4-ffuts,poeparodef,?m&-morf,agevres,ohruoyslles,?n&ozdop,uma.elet,?r&ehwongniogyldlob,iwym,uces-77ndc.nigiro.lss,?t&adidnac-a-si,is&-ybboh,golb,???fehc-a-si,golbymdaer,k&eeg-a&-si,si,?h,nut,?l&i&amwt,ve-yrev-si,?lawerif&-ym,ym,?sd-ni,?m&acssecca,edom-elbac,?n&af&blm,cfu,egelloc,lfn,s&citlec-a-si,niurb-a-si,tap-a-si,?xos-a-si,?o&itatsksid,rviop,?pv-ni,?o&jodsnd,tp&az,oh,??p&i&-on,fles,?o&hbew,tksedeerf,?tf&e&moh,vres,?ym,??r&e&gatop,ppepteews,su-xunil-a-si,?gmtrec,vdmac,?s&a&ila&nyd,snd,?nymsd,?b&alfmw,bevres,?dylimaf,eirfotatophcuoc,gulku,j,koob-daer,ltbup,nd&-won,deerf,emoh,golb,kcud,mood,nyd:.&emoh,og,?,ps,rvd,tog,uolc,?s&a-skcik,ndd,?tnemhcattaomb,u,?t&ce&jorparodef.&duolc,gts.so.ppa,so.ppa,?riderbew,?e&ews-yrev-si,nretni&ehtfodne,fodne,??hgink-a-si,igude,oi-allizom,s&ixetn&od,seod,?o&h-emag,l-si,?rifyam,??ue:.&a&-q,c,?cm,dc,e&b,d,e,i,m,s,?g&b,n,?hc,i&f,s,?k&d,m,s,u,?l&a,i,n,p,?n&c,i,?o&n,r,ssa,?pj,r&f,g,h,k,t,?s&e,i:rap,,u,?t&a,en,i,l,m,ni,p,?u&a,de,h,l,r,?vl,y&c,m,?z&c,n,??,vresnyd,x&inuemoh,unilemoh,?y&limafxut,srab,???ub&mah?oj???s!.&gro?moc?rep?t&en?opsgolb,?ude?vog??gb639j43us5--nx??t?u!.&c&a?s??en?gro?mo&c?n,?o&c?g??ro?topsgolb,??v!.&mon,ta,?a1c--nx??wsa08--nx??h&0ee5a3ld2ckx--nx?4wc3o--nx!.&a&2xyc3o--nx?3j0hc3m--nx?ve4b3c0oc21--nx??id1kzuc3h--nx?l8bxi8ifc21--nx?rb0ef1c21--nx???8&8yvfe--nx?a7maabgm--nx??b!.&gro?moc?ten?ude?vog??mg??c!.&7erauqs,amil4,duolc-drayknil,gniksnd,ph21,sndtog,topsgolb,wolf.enigneppa,xi2,ytic-amil,?aoc?et?ir!euz??r&aes!errecnac??uhc??sob?taw!s???d0sbgp--nx?f&2lpbgm--nx?k??g!.&gro?lim?moc?ude?vog???iesac?m!a1j--nx??ocir?p!.&gro?i?lim?moc?ogn?ten?ude?vog???s!.&g&nabhsah,ro??l&im?xv,?m&oc?roftalp.&cb,su,tne,ue,??ten?vog?won,yolpedew,?a&c?nom??i&d?f?ri???t!.&ca?enilno,im?ni?o&c?g??pohs,ro?ten??iaf!.oby,?laeh?orxer?ra&ba?e???vo!.lopdren,?zb??i&3tupk--nx?7a0oi--nx?a!.&ffo?gro?mo&c?n,?ten?uwu,?1p--nx?bud?dnuyh?tnihc??b!.&gro?moc?oc?ro?ude??ahduba?o!m!.&duolcsd,ysrab,???s??c!.&ayb-tropora--nx?ca?d&e?m??esserp?gro?ln,moc?nif,o&c?g?ssa??ro?t&en?ni?roporéa??ude?vuog??cug?t??d&dk?ua??e&bhf--nx?piat??f!.&aw5-nenikkh--nx,dnala?iki,mroftalpduolc.if,nenikkäh,retnecatad.saap,topsgolb,yd,?onas??g!.&d&om?tl??gro?moc?ude?vog???h&c&atih?ra??s&abodoy?ibustim???juohs?k!.&gro?moc?ofni?ten?ude?vog?zib??b4gc--nx?iw?nisleh?s?uzus??l!.&aac,m&on,yn,?topsgolb,?drahcir?iamsi??maim?n!.&b&ew?og??ca?gro?lim?mo&c?n??ni?o&c?fni??pp?t&en?ni??ude?zib??airpic?i&hgrobmal?m??re??om?rarref?s!.&egaptig,mon,topsgolb,?ed??t&aresam?i&c?nifni??rahb?tagub??ut?v!.&21k?gro?moc?oc?ten???wik?xa&rp?t??yf??j&6pqgza9iabgm--nx?8da1tabbgl--nx?b!.&ossa?topsgolb,uaerrab?vuog???d?f!.&ca?eman?gro?lim?moc?o&fni?rp??ten?vog?zib???nj?s?t!.&bew?c&a?in??eman?gro?lim?mo&c?n,?o&c?g??t&en?ni?set??ude?vog?zib???yqx94qit--nx??k&8uxp3--nx?924tcf--nx?arfel?c&a&bdeef?lb??ebdnul?ilc?reme?ud??d!.&erots,ger,mrif,oc,topsgolb,zib,?t??e&es?samet??h!.&a&4ya0cu--nx?5wqmg--nx??b3qa0do--nx?cni,d&2&2svcw--nx?3rvcl--nx??5xq55--nx?tl,?g&a0nt--nx?la0do--nx?ro??i&050qmg--nx?7a0oi--nx?xa0km--nx??m&1qtxm--nx?oc?yn,?npqic--nx?t&en?opsgolb,?ude?v&di?og?ta0cu--nx??xva0fz--nx?人&个?個?箇??司公?府政?絡&網?网??織&組?组??织&組?组??络&網?网??育&敎?教???n??i&tsob?vdnas??l!.&bew?c&a?os??dtl?gro?hcs?letoh?moc?nssa?ogn?prg?t&en?ni??ude?vog??at?cd?is??m!.&eman?fni?gro?mo&c?n,?t&en?opsgolb,?ude?vog???n&ab!cfdh?etats?mmoc?t&en?fos??u??i!.gn,l!.&noyc,pepym,??p???oob?p!.&b&ew?og??gro?kog?m&af?oc??nog?ofni?pog?sog?ten?ude?vog?zib???row!.&fo,ot,?ten!.&htumiza,o&c,vra,??doof???s!.&myn,topsgolb,??t?u!.&c&a?lp??d&om?tl??e&cilop?m??gro!.&gul:g,,sgul,??nnoc,o&c!.&bunsorter.tsuc,e&lddiwg,n&ilnoysrab,ozgniebllew,??krametyb.&hd,mv,?pi-on,t&fihsreyal.j,opsgolb,?vres-hn,ysrab,??rpoc,?shn?t&en?nmyp,?vog!.eci&ffoemoh,vres,??ysrab,???l&04sr4w--nx?a!.&gro?lim?mo&c?n,?t&en?opsgolb,?ude?vog??bolg?c?ed?g!el??i&c&nanif!.oc,lpl??os??romem?tnedurp??n&if?oitanretni??t&i&gid!.sppaduolc:.nodnol,,?p&ac?soh???ned?ot??utum!nretsewhtron???c!.&bog?lim?mon,oc?samednerpa?topsgolb,vog???dil?e&datic?n&ahc?nahc!gnikooc?levart?rehtaew???t!ni?ria?tam??vart??f&8f&pbgo--nx?tbgm--nx??a?n??g!.&gro?mo&c?n,?oc?ten?ude?xx,zib,??h&d?op??i!.&21k?ca?fdi?gro?inum?oc!.topsgolb,?ten?vog??a&f?m&e?g?toh???m?r?xil??l&a&b&esab?t&eksab!.&sua,zn,??oof!.fo,???c?mt??e&d?hs??ihmailliw?j??m!.&esserp?gro?moc?ten?ude?v&og?uog????n!.&n&iemodleeutriv,o&med,rtsic,??oc,retsulc-gnitsoh,topsgolb,wsma,yalphk,?o??o&a?btuf?l!.gmo,?o&c!.ed,?hcs!.gn,??rit?u??p!.&a&cin&diws?gel??d&g,ortso?urawon??i&dem?mraw?nydg,?k&elo&guld?rtso??slopolam?tsu?ytsyrut??l&ip?o&kzs?w&-awolats?oksnok????n&img?zcel,?rog&-ai&bab?nelej??j?z??syn?tsaim?w&a&l&eib?i?o??zsraw??o&namil?tainop,??z&eiwolaib?mol???c&e&iw&alselob?o&nsos?rtso???le&im?zrogz???orw,p??d&em,ia?ragrats??e&c&i&lrog?w&ilg,o&hc&arats?orp??klop?tak????yzreibok??i&csjuoniws?ksromop?saldop??l&ahdop?opo??napokaz,tatselaer?z&romop?swozam???g&alble?ezrbo&lok?nrat??ro??hcyzrblaw?i&csomohcurein?grat?klawus??k&e&rut?walcolw??in&byr?diws,sark,?le?o&nas?tsylaib??rob&el?lam??s&als?jazel?nadg,puls?rowezrp???l&colw?e&r?vart??i&am?m???m&o&c?dar?n?tyb??s&g?iruot??t!a???n&a&gaz?nzop,?i&bul?cezczs?lbul,molow?nok?zd&eb?obeiws???uleiw?y&tzslo?z&rtek?seic????o&c,fni?k&celo?zdolk??lkan?n&leim?pek?t&uk?yzczs??z&copo?eing?rowaj???rga?tua?w&ejarg?ogarm???p&e&eb,lks??klwwortso?ohs??romophcaz?sos?t&aiwop?en?opos,ra,sezc??ude?v&irp?og!.&a&p?s!w???bni&p?w??ci?dtiw?essp?fiw?g&imu?u??hiiw?m&igu?rio?u!o???nds?o&ks?p!pu??s?wtsorats??p&a?sp!mk?pk?wk??u&m?p??wk?z??r&ksw?s??s&i?oiw?u?zu??talusnok?w&gzr?i&p?rg?w??m?opu?u!imzw???zouw????w&a&l&corw?sizdow??w??o&golg?k&ark,ul?zsurp??r&az?gew??t&rabul,sugua??z&coks?sezr????xes?y&buzsak?d&azczseib?ikseb??hcyt?n&jes?lod-zreimizak??pal?r&ogt?uzam??walup?zutrak??z&am-awar?c&aprak?iwol?zsogdyb??dalezc?ib?s&i&lak?p??uklo????l??r&as?f?s??s!.&gro?moc?ten?ude?vog???t!.vog??ubnatsi?x3b689qq6--nx?yc5rb54--nx??m&00tsb3--nx?1qtxm--nx?981rvj--nx?a!.&aayn,enummoc?gro?moc?o&c?idar,ken,?t&en?opsgolb,??c!bew??dretsma?e&rts?t!.&citsalej,esruocsid,???fma?rirhs?xq--nx??b!.&gro?moc?ten?ude?vog??i??c!.&moc?oc?ten?vog???d!.&gro?moc?ten?ude?vog???f!.&gro?moc?oidar,ten?ude??i??g!vu96d8syzf--nx??h?i!.&ca?gro?mo&c?n,?o&c!.&clp?dtl???r,?t&en?t??vt??k?rbg4--nx??k!.&drp?e&rianiretev?sserp??gro?lim?m&o&c?n??t??nicedem?ossa?pooc?s&eriaton?neicamrahp?sa??ude?v&og?uog????l&if?ohkcots??o!.&dem?gro?m&oc?uesum??o&c?rp??ten?ude?vog??b?c!.&2aq,3pmevres,a&c&-morf,ir&bafno,fa,??g&-morf,oy-sehcaet,?i-morf,m&-morf,all&-a-si,amai,??p&-morf,c-a-si,?r&emacytirucesym,odih,?s,tadtsudgniht,v-morf,w-morf,z,?b&dnevarym,ew&-sndnyd,draiw.segap,ottad,?g,ildts.ipa,?c&amytirucesemoh,d-morf,esyrcs,itsalej.omed,n&-morf,vym,?p&kroweht,ytirucesemoh,?q,rievres,s-morf,?d&aerotffuts,e&calpb,ifitrec-&si,ton-si,?llortnocduolc,rewopenignepw,?i&-morf,rgevissam.saap,?m-morf,n&-morf,abeht-htiw-si,?s-morf,uolc&-noitatsyalp,hr,meaeboda,panqym:-&ahpla,ved,?,smetsystuo,ved&j,pw,??wetomer,?e&butuoyhtiw,ciffo-sndnyd,d:-morf,o&celgoog,n&il.srebmem,neve.&1-&su,ue,?2-&su,ue,?3-&su,ue,?4-&su,ue,????,erf&-sndnyd,sndd,?filflahevres,gnahcxeevres,i&hcet-a-si,p-sekil,?k&auqevres,irtsretnuocevres,?l&bitpa-no,googhtiw,?m&agevres,ina-otni-si,oh-&sndnyd,ta-sndnyd,??n&-morf,ilnoysrab,og-si,?r&alfduolcyrt,ihcec,uzanoppanex,?srun-a-si,t&i&nuarepo,s&-ybboh,aloy,tipohs,??omer-sndnyd,ysgolb,?v&als-elcibuc-a-si,i&lsndd,tavresnoc-a-si,??z&amkcar,eelg,iig,??fehc-a-si,g&ni&gats-swennwot,ksndd,robsikrow,?o&fgp,lb&-sndnyd,sihtsetirw,???h&n-morf,o-morf,?i&fiwehtno,h-morf,kiw-sndnyd,m-morf,pdetsoh,r-morf,w-morf,z&ihcppa,nilppa,??jn-morf,k&a&-morf,erfocsic,?cils-si,eeg&-a&-si,si,?sndd,?h,latsnaebcitsale:.&1-&htuos-pa,lartnec-&ac,ue,?ts&ae&-&as,su,?ht&ron-pa,uos-pa,??ew-&su,ue,vog-su,???2-ts&ae&-su,ht&ron-pa,uos-pa,??ew-&su,ue,??3-ts&aehtron-pa,ew-ue,??,o-morf,r&adhtiwtliub,ow&-&sndnyd,ta-sndnyd,?ten-orehkcats,??u,?l&a&-morf,colottad,rebil-a-si,?f-morf,i&-morf,am-sndnyd,?l&ecelffaw,uf-ytnuob:.a&hpla,teb,?,?ppmswa,ru-&elpmis,taen,?ssukoreh,xegap,?m&n-morf,pml.ppa,rofererac-htlaeh,sacrasevres,uirarret-yltsaf,?n&a&cilbuper-a-si,f&-sllub-a-si,racsan-a-si,?i&cisum-a-si,ratrebil-a-si,??c,dcxirtrepmi,eerg-a-si,i-morf,m-morf,o&ehtnaptog,isam-al-a-tse,rtap-el-tse,s&iam-al-a-tse,replausunu,??pj,t-morf,?o&bordym,c,jodsnd,m-morf,n:iloxip,,ttadym,?p&2pevres,aelutym,i&-sndnyd,fles,ogol,ruoy&esol,hctid,?ymteg,?pa&-rettalp,anis:piv,,esaberif,k1,lortnocduolc,oifilauq,r&aegyks,oetem:.ue,,?tnorfegap,ukoreh,?t&fevres,thevres,??r&a:-morf,tskcor-a-si,,b,e&d&ivorpnwo,ner&.ppa,no,??e&bevres,nigne-na-si,?ggolb-a-si,h&caet-a-si,pargotohp-a-si,?krow-drah-a-si,n&gised-a-si,ia&rtlanosrep-a-si,tretne-na-si,??p&acsdnal-a-si,eekkoob-a-si,?retac-a-si,subq,tn&ecysrab,iap-a-si,uh-a-si,?vres&-&ki.duolcj,s&ndnyd,pvtsaf,??inim,nmad,sak,?y&alp-a-si,wal-a-si,?zilibomdeepsegap,?g,k,mgrp.nex,o&-morf,sivdalaicnanif-a-si,t&c&a-na-si,od-a-si,?susaym,??p-morf,u&as-o-nyd,eugolb-nom-tse,omuhevres,??s&a&apod,ila&nyd,snd,?nymsd,?bbevres,ci&p&-sndnyd,evres,?tcatytiruces,?dylimaf,e&cived-anelab,itilitu3,lahw-eht-sevas,mag-otni-si,tyskciuq,?i&ht2tniop,pa&elgoog,tneltneg,??k&-morf,aerf-ten,colbpohsym,?m&-morf,cxolb,?n&d&-pmet,dyard,golb,mood,tog,?kselp,nyd,ootrac-otni-si,?o&-xobeerf,xobeerf,?ppatneg,r&ac-otni-si,etsohmaerd,?s&e&l-rof-slles,rtca-na-si,?ibodym,?tsaeb-cihtym.&azno,ilay,remotsuc,sv,toleco,x:n&ihps,yl,?,?u,wanozama.&1-&htuos-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??la&nretxe-3s,rtnec-&ac&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????ts&ae&-&as&-&3s,etisbew-3s,?.kcatslaud.3s,?su:-etisbew-3s,.kcatslaud.3s,,?ht&ron-pa&-&3s,etisbew-3s,?.kcatslaud.3s,?uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-&3s,etisbew-3s,?.kcatslaud.3s,?vog-su-&3s,spif-3s,????2-ts&ae&-su&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ht&ron-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????3&-tsew-ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,??s,???t&arcomed-a-si,c-morf,eel&-si,rebu-si,?m-morf,n&atnuocca-na-si,e&duts-a-si,r-ot-ecaps,tnocresu&buhtig,elbavresbo.citats,pl,???ops&edoc,golb,ppa,?s&i&hcrana-&a-si,na-si,?laicos-a-si,pareht-a-si,tra-na-si,xetn&od,seod,??oh&piym,sfn,??u&-morf,nyekcoh-asi,?v-morf,?u&-rof-slles,4,e,h,oynahtretramssi,r:ug-a-si,,?v&n-morf,w-morf,?w&ozok,ww100,?x&bsbf.sppa,em,i&nuemoh,rtrepmi,?obaniateb,t-morf,unilemoh,?y&a&bnx:.&2u,lacol-2u,?,lerottad,wetag-llawerif,?dnacsekil,k&-morf,niksisnd,?rotceridevitcaym,u:goo,,w-morf,x&alagkeeg,orphsilbup,???inu??m!.&dna,rof,??or?tsla??p!.nwo,?raf!.jrots,etats??s?t!.&gro?lim?mo&c?n??oc?ten?ude?vog???u&esum!.&a&92chg-seacinumocelet-e-soierroc--nx?atnav?c&i&aduj?rfatsae??rollam??d&anac?enomaledasac?irolf??e&raaihpledalihp?srednu??g&hannavas?oonattahc??hamo?i&auhsu?bmuloc!hsitirb??dem?groeg?hpledalihp?l&artsua?etalif??n&igriv?rofilac??ssur?tsonod??ksa&la?rben??l&lojal?q-snl--nx?uossim!trof???m&a&bala?nap??enic?o&m?r???n&a&cirema?idni??edasap?ilorachtuos?olecrab??r&abrabatnas?ezzivs??su?t&nalta?osennim??zalp??c&dnotgnihsaw?ebeuq?i&depolcycne?ficap?hpargonaeco?lbup?sum?t&carporihc?lec?naltadim??vu??yn??d&a&dhgab?etsmraf?m?orliar??i&rdam?ulegnedleeb??leif?n&a!l&gne?nif?ragyduj?t&ocs?rop??yram???u&brofsdgybmeh?osdnaegami???r&augria?ofxo???e&c&a&l&ap?phtrib??ps??n&a&lubma?tsiser??e&fedlatsaoc?gilletni?ics!foyrotsih????pein?rof??d&nukneklov?revasem??e&rt?tsurt??f&atnas?ildliw??g&a&lliv?tireh!lanoitan???dirbmac?rog??i&cnum?nollaw??koorbrehs?l&ab?bib?cycrotom?i&ssim?txet??oks?tsac??m&affollah?it!iram??utsoc??n&golos?ilno?recul??r&a&uqs?waled!foetats???i&hs&acnal?kroy?pmahwen??otsih??omitlab?ut&an?cetihcra?inruf?luc!irga?su???vuol??s&abatad?iacnarf?sius?uoh!lum???t&a&locohc?rak?ts!e!yrtnuoc!su?????imesoy?tevroc??u&qihpargonaeco?velleb??vit&caretni?omotua???f&iuj?ohgrub??g&n&i&dliub?ginerevmuesum?kiv?lahw?nim?peekemit?vil??ulmmastsnuk??orf?r&ebnrats?u&b&ierf?le?m&ah?uan??ram?s&mailliw!lainoloc??naitsirhc?retepts??zlas??ob&irf?mexul?????h&atu?c&raeser?sirotsih?uot??g&ea1h--nx?rubsttip??si&tirb?wej??t&laeh?ro&n?wtrof??uo&mnom?y????i&d6glbhbd9--nx?iawah?k&nisleh?s??lad!rodavlas??sissa?tannicnic??k&c&nivleeg?olc!-dna-hctaw?dnahctaw???fj?inebis?l&is?ofron??na&rfenna?t??oorbnarc?r&am&ned?reiets??oy!wen????l&a&ci&dem?golo&eahcra?meg?oz??natob?rotsih??ertnom?iromem?noita&cude?n??oc?rutluc?trop?utriv?van??e&nurb?s&ab?surb??utriv??i&artnogero?sarb??l&a&besab?hsnoegrus??e&hs?rdnevle??i&b?m!dniw????o&bup?ohcs?tsirb???m&a&dretsma?ets?h&netlehc?rud???ct?elas!urej??l&if?ohkcots?u??raf?silanruoj?u&esumyrotsihlarutan?ira&tenalp?uqa??terobra???n&a&c!irema!evitan???gihcim?i&dni?tpyge??mfoelsi?wehctaksas??e&d&alokohcs?ews?rag!cinatob?lacinatob?s&nerdlihc?u????gahnepoc?hcneum?laftsew?ppahcsnetewruutan?r&dlihc?ednaalv?hu!dnutamieh???sseig??gised!dn&atra?utsnuk???h&ab!nesie??ojts??i&lreb?tsua??l&eok?ocnil??n&ob?urbneohcs??o&dnol?gero?i&s&iv&dnadnuos?elet??nam??t&a&c&inummoc?ude!tra???dnuof?erc?i&cossa?va??kinummokelet?nissassa?r&belectsevrah?oproc?tsulli??silivic?t&nalp?s??vres&erp?noclatnemnorivne??zilivic??c&elloc?if-ecneics??ibihxe???ri?s&dnah?imaj?reffej?sral??t&erbepac?nilc?sob???r&e&b?dom?tsew?uab?zul??obredap??vahnebeok?wot??o&2a6v-seacinumoc--nx?ablib?c&edtra?ixemwen?sicnarfnas??elap?g&a&cihc?to??eidnas??i&cadnuf?diserp?ratno??llecitnom?mitiram?nirot?r&htna?ienajedoir???pohskrow?qari?r&aw!dloc?livic??dd?e&b&ma?yc??irrac?llimsiwel?naksiznarf?papswen?t&aeht?exe?nec!ecneics?larutluc?muesum?tra??s&ehc&nam?or??neum??upmoc???ia!nepo??obal?u&asonid?obal?takirak???s&a&l&g?l&ad?eh???xet??di&k?pardnarg??e&cneics!larutan??dnal?hcsi&deuj?rotsih!nizidem?rutan??selhcs??itinamuh?l&aw?egnasol?l&e&rutansecneics?xurb??iasrev???r&e&em?ugif??tsac??suohcirotsih?u&en?q&adac?itna!nacirema?su????õçacinumoc!elet-e-soierroc???gnirpsmlap?htab?i&lopanaidni?rap?uoltnias?xa??l&essurb?lod??mraeriflanoitan?n&a&blats?l??erdlihc?oi&snam?tacinummoc!elet-dna-stsop???äl??re&dnalf?lttes?mraf?nim?tnececneics??s&alg?erp??t&farc!dnastra??nalp?olip?ra!e&nif?vitaroced!su???su?xuaeb???u&b!muloc??cric???t&agilltrop?cejorp?dats?e&esum?kramnaidni??iorted?ne&m&elttes?norivne?piuqemraf??vnoc??oped?r&a!drib?enif?gttuts?hsiwej?kcor?n&acirema?ootrac??tamsa?yraropmetnoc??op&aes?snart?wen??ufknarf??s&a&cdaorb?octsae??ewhtuos?ilayol?nuk?r&ohnemled?uhlyram??urt???u&a&bgreb?etalpodaroloc??rmyc??w&ocsom?rn??x&esse?ineohp?nam?tas??y&a&bekaepasehc?w&etag?liar???camrahp?doc?e&hsub?l&ekreb?l&av!eniwydnarb??ort???n&dys?om??rrus?s&nreug?rejwen???golo&e&ahcra?g??motne?nh&cet?te??oz?po&rhtna?t??roh??hpargotohp?l&etalihp?imaf??m&edaca?onortsa??n&atob?yn??ps?r&a&ropmetnoc?tilim??e&diorbme?llag!tra??vocsid??lewej?nosameerf?otsih!dnaecneics?ecneics?gnivil!su??la&col?rutan??retupmoc?su??tsudnidnaecneics??spelipe?t&eicos!lacirotsih??i&nummoc?srevinu??nuoc???z&arg?iewhcs?nil?ojadab?urcatnas??моки?םילשורי???rof??z!.&ca?gro?hcs?lim?moc?o&c?fni??ten?ude?vog?zib????n&315rmi--nx?a&brud?cilbuper?f?grompj?hkaga?idraug?m?ol?ssin?u&hix?qna??varac?yalo??b!.&gro?moc?oc,ten?ude?vog??c??c!.&ah?bh?c&a?s??d&5xq55--nx?g?s?uolctnatsni,?eh?g&la0do--nx?ro??h&a?q?s??i&7a0oi--nx?h??j&b?f?t?x?z??kh?l&h?im?j??m&n?oc!.swanozama.&1-htron-nc.3s,be.1-&htron-nc,tsewhtron-nc,????n&h?l?s?y??om?qc?s&g?j??ten?ude?vog?wt?x&g?j?n?s??z&g?x??司公?絡網?络网??b??d&g!.ypnc,?ka??e&drag?erg?fuak?gawsklov?hctik?i&libommi?w??m!.rof,?po?r!ednaalv??sier?ves??g!.&ca?gro?moc?ten?ude?vog??is&ed!.ssb,?irev???h!.&bog?cc,gro?lim?mo&c?n,?ten?ude???i!.&bew,c&a?in??dni?gro?lim?mrif?neg?oc?s&er?nduolc,?t&en?opsgolb,?ude?vog?ysrab,?elknivlac?griv?ks?lreb?p!ul??v?w?x??k!.&gro?ten?ude?vog???l&eok?ocnil??m!.&cyn,gro?myn,ude?vog???o&dnol!.&fo,ni,??i&hsaf!.&fo,no,??n&o?utiderc??siv!orue??t&a&cude!.oc,?dnuof?tsyalp??c&etorp?u&a?rtsnoc?????kin?las?mrom?nac?p&q?uoc??s&iam?nhojcs?pe?scire??t&ron?sob??zama??p!.&gro?oc?ten?ude?vog??k??r&e&c?yab??op!.eidni,??s!.&gro?moc?osrep?t&opsgolb,ra??ude?v&inu?uog????t!.&dni?esnefed?gro?ltni?m&oc!nim??siruot??n&erut?if??o&fni?srep??sn&e?r??t&an?en!irga?ude??rnr??unr?vog??m??u&f?r!.&bdnevar,lper,sh,tnempoleved,??stad?xamay?y??v!.&ca?eman?gro?htlaeh?moc?o&fni?rp??t&en?ni?opsgolb,?ude?vog?zib???wo&rc?t!epac????o&76i4orfy--nx?a!.&bp?de?go?oc?ti?vg??boat??b!.&a&ci&sum?tilop??i&c&arcomed?neic??golo&ce?ncet??m&edaca?onoce??rt&ap?sudni??vilob??n&egidni?icidem??serpme?tsiver?vitarepooc??b&ew?og??dulas?e&rbmon?tr&a?op&ed?snart????g&olb?ro??ikiw?l&a&noi&canirulp?seforp??rutan??im??moc?o&fni?lbeup?rga?tneimivom??saiciton?t&askt?en?ni??ude?vt??h?iew?olg??c!.&bew?cer?dr&c,rac,?gro?ipym,l&im?per,?m&o&c!.topsgolb,?n??rif?udon,?ofni?s&egap&dael,l,?tra??t&4n,en?ni??ude?vog??a?e!vi??in?mara?s&edarb?ic???d!.&b&ew?og??dls?gro?lim?moc?t&en?ra??ude?vog??agoba?if?zd7acbgm--nx??e&c?d&iv?or??morafla??f!ni!.&e&g&delwonk-fo-l&errab,lerrab,?ellocevoli,?ht-skorg,rom-rof-ereh,tadpusn:d,,?llatiswonk,macrvd,ofni-v,p&i&-on,fles,?ohbew,?ruo-rof,s&iht-skorg,nd&-cimanyd,nyd,uolc,??tsrifyam,ysrab,zmurof,???g&el?n!am?ib???hwsohw?i!.&35nyd,8302,a&minifed,tad-b,?b&altig,uhtig,?c&inone:.remotsuc,,zh,?d&in,u&olc&iaznab.ppa,noitacilppa,ropav,?rd,??e&civedniser,donppad.sndnyd,egipa,lej,nilnigol,sufxob,t&isnoehtnap,newtu,??gni&gatsniser.secived,tsohytsoh,?k&orgn,ramytefasresworb,?m&oc?udon,?nyded,p&opilol,pa&-arusah,cs,enalpkcab,??r&evres&cisab,lautriv,?ial.sppa,?s&codehtdaer,nemeis-om,pparevelc,tacdnas,?t&enotorp,i&belet,detfihs,kecaps,?raedon.egats,sudgniht.&cersid.tsuc,dorp.tsuc,gnitset.tsuc,ved.tsuc,??vgib.0ku,whs,x&bslprbv.g,cq,?y&olpedew,srab,??b?d&ar?u&a?ts???j?r?syhp??j!.&eman?gro?hcs?lim?moc?ten?ude?vog???ll&ag?o??m!.&gro?moc?ten?ude?vog??g?il?mi?orp??n!.&a&0&b-ekhgnark--nx?c-iehsrgev--nx?g-lksedlig--nx?k-negnanvk--nx??1&p-nedragy--nx?q-&asierrs--nx?grebsnt--nx?lado-rs--nx?n&egnidl--nx?orf-rs--nx??regnayh--nx?ssofenh--nx??r-datsgrt--nx?s-ladrjts--nx?v-y&senner--nx?vrejks--nx???3g-datsobegh--nx?4&5-&dnaleprj--nx?goksnerl--nx?tednalyh--nx??6-neladnjm--nx?s-&antouvachb--nx?impouvtalm--nx??y-&agrjnevvad--nx?ikhvlaraeb--nx???7k-antouvacchb--nx?8&k-rekie-erv--nx?l-ladrua-rs--nx?m-darehsdrk--nx??a!.sg??bct-eimeuvejsemn--nx?d&do?iisevvad?lov?narts?uas??f&1-&l--nx?s--nx??2-h--nx??g&10aq0-ineve--nx?av?ev?lot?r&ajn&evvad?u??ájn&evvad?u????h?iz-lf--nx?j&ddadab?sel??k&el?hoj&sarak?šárák??iiv&ag&na&el?g??ŋ&ael?ág???ran???l&f?lahrevo?o&ms?s??sennev?t-&ilm--nx?tom--nx??u&-edr--nx?s??øms??muar?n&0-tsr--nx?2-dob--nx?5-&asir--nx?tals--nx??a&r!-i-om?f?t??t??douvsatvid?kiv?m&os?øs??n&od?ød??ra?sen?t&aouvatheig?ouv&a&c&ch&ab?áb??h&ab?áb???n??i&ag?ág??sa&mo?ttvid??án???z-rey--nx?ær&f?t???o&p-&ladr--nx?sens--nx??q-nagv--nx?r-asns--nx?s-kjks--nx?v-murb--nx?w-&anr&f--nx?t--nx??ublk--nx???ppol?q&0-t&baol--nx?soum--nx?veib--nx??x-&ipphl--nx?r&embh--nx?imph--nx???y-tinks--nx??r&f-atsr--nx?g-&an&ms--nx?nd--nx??e&drf--nx?ngs--nx??murs--nx?netl--nx?olmb--nx?sorr--nx??h-&a&lms--nx?yrf--nx??emjt--nx??i&-&lboh--nx?rsir--nx?y&d&ar--nx?na--nx??ksa--nx?lem--nx?r&ul--nx?yd--nx????stu??j-&drav--nx?rolf--nx?sdav--nx??kua?l-&drojf--nx?lares--nx??m-tlohr--nx?n-esans--nx?olf?p-sdnil--nx?s-ladrl--nx?tih?v-rvsyt--nx??s&a&ns?ons??i&ar?er&dron?r&os?øs???ár??la&g?h??mor!t??sir?uf?åns??t&koulo&nka?ŋká??la?p-raddjb--nx?r-agrjnu--nx?s&aefr&ammah?ámmáh??orf?r&o?ø???u-vreiks--nx??u&h-dnusel--nx?i-&drojfk--nx?vleslm--nx??j-ekerom--nx?k-rekrem--nx?u-&dnalr--nx?goksr--nx?sensk--nx??v-nekyr--nx?w-&k&abrd--nx?ivjg--nx??oryso--nx??y-y&dnas--nx?mrak--nx?n&art--nx?nif--nx??reva--nx??z-smort--nx??v!.sg?ledatskork?reiks??wh-antouvn--nx?x&9-dlofts--nx.aoq-relv--nx?d-nmaherk--nx?f-dnalnks--nx?h-neltloh--nx?i-drgeppo--nx?j-gve&gnal--nx?lreb--nx??m-negnilr--nx?n-drojfvk--nx??y&7-ujdaehal--nx?8-antouvig--nx?b-&dlofrs--nx?goksmr--nx?kivryr--nx?retslj--nx??e-nejsom--nx?f-y&krajb--nx?re&dni--nx?tso--nx??stivk--nx??g-regark--nx?orf?ørf??z9-drojfstb--nx??b&25-akiivagael--nx?53ay7-olousech--nx?a&iy-gv--nx?le-tl&b--nx?s--nx??n0-ydr--nx??c&0-dnal-erdns--nx?z-netot-erts--nx??g&g-regnarav-rs--nx?o-nejssendnas--nx??ju-erdils-ertsy--nx?nj-dnalh-goksrua--nx?q&q-ladsmor-go-erm--nx.&ari-yreh--nx?ednas??s-neslahsladrjts--nx???ca&4s-atsaefrmmh--nx?8m-dnusynnrb--nx?il-tl--nx?le-slg--nx?n5-rdib--nx?op-drgl--nx?uw-ynnrb--nx??d&a&qx-tggrv--nx?reh!nnivk?sd&ork?ørk??uas??ts&e&bi?kkar?llyh?nnan??g&ort?ørt??k&alf?irderf??levev?mirg?obeg&ah?æh??r&ah?ejg????barm-jdddb--nx?ie!rah?s&etivk?ladman???lof&r&os?øs??ts&ev.ednas?o.relav?ø.relåv???n&a&l&-erd&n&os?øs??ron??adroh.so?dron.&a&g5-b--nx?ri-yreh--nx??ob?y&oreh?øreh??øb??e&m!lejh??pr&oj?øj??vi??gyb?n&aks?åks??o&h-goksrua?rf??r&o?ua?ø??tros?øh-goksrua??rts!e&devt?lab?mloh???s&ellil?naitsirk?rof???u&l!os??s!d&im?lejt??e&guah?l&a?å???kkoh?lavk?naitsirk?r&af?eg&e?ie???tef?y&onnorb?ønnørb?????r&a&blavs!.sg??g&eppo?la???o&j&f&a!dniv?k?vk??die?e&dnas?kkelf??llins?r&iel?ots??s&lab?t&ab?åb??yt??å!k??ævk??les??ts??åg&eppo?lå???ureksub.sen??e&ayb-yrettn--nx?d&ar?lom?r&of?øf??år??g&gyr?nats??i&meuv&ejsem&aan?åån??sekaal??rjea??j&d&ef?oks??les??k&er&aom?åom??hgna&ark?årk??iregnir?kot!s??s&ig?uaf???l&bmab?kyb?l&av?ehtats??oh??m&it?ojt?øjt??n&arg?g&os?øs??meh?reil?te?ummok?yrb??r&dils-erts&ev?y&o?ø???ua?vod??sa&ans?åns??t&robraa?spaav??urg??f&62ats-ugsrop--nx?a&10-ujvrekkhr--nx?7k-tajjrv-attm--nx??o!.sg?h??s!.sg??v!.sg???g&5aly-yr&n--nx?v--nx??a&llor?ve&gnal?lreb???n&av!snellu??org??oks&die?m&or?ør??ner&ol?øl??r&o?ø???r&eb!adnar?edyps?s&die?elf?gnok?n&ot?øt????obspras??uahatsla?åve&gnal?lreb???h&0alu-ysm--nx?7&4ay8-akiivagg--nx?5ay7-atkoulok--nx??a!.sg???i&e&hsr&agev?ågev??rf??k&h&avlaraeb?ávlaraeb??s??lm&a?å??mpouvtal&am?ám??pph&al?ál??rrounaddleid?ssaneve?ššáneve??j&0aoq-ysgv--nx?94bawh-akhojrk--nx??k&a&b&ord?ørd??jks?lleis??iv!aklejps?l&am?evs?u??mag?nel?ojg?r&a&l?n??epok?iel?y&or?ør???s&ah?kel?om??øjg??kabene?ojsarak?ram&deh.&aoq-relv--nx?rel&av?åv??so??e&let.&ag5-b--nx?ob?øb??ra???åjks??l&a!d&anrus?d&numurb?ron??e&gnard?nte?s&meh?sin??ttin??g&is?nyl??kro?l&em?l&ejfttah?of??u&ag-ertdim?s???n&am?era?gos?i&b?nroh?r??kos?nus?oj??o-&dron?r&os?øs???ppo?r&a!l?nram??e&gne?l?v??is?o&jts?ts??u&a-&dron?r&os?øs???h??å?æl?øjts??s&e&jg?nivk?ryf??kav?mor-go-er&om.&ednas?yoreh??øm.&ednas?yøreh???uag??t&las?rajh?suan??v&l&a?e-rots??u-go-eron??yt??ksedlig?res&a?å???bib&eklof?seklyf??es!dah??h!.sg??i&m?syrt??l&ejf?ov&etsua?gnit?ksa?sdie???n!.sg??o!.sg?boh?g?h??r!.sg??å!ksedlig??øboh??m&a&rah?vk??f!.sg??h!.sg??i&e&h&dnort?rtsua?ssej??rkrejb??ksa??ol?t!.sg??u&dom?esum?r&ab?drejg?evle?os?uh?æb?øs??ttals???n&a&g&av?okssman?åv??jlis?or?r&g?rev???e&d&do&sen?ton??lah?r&agy&o?ø??ojfsam???g&iets?n&a&l&as?lab??n&avk?ævk??t&arg?ddosen??v&al?essov???i&d&ol?øl??l&ar?ær???yl??reb??iks?k&srot?y&or?ør???l&a&d&gnos?n&er?ojm?øjm??om??tloh??ug?åtloh??mmard?ojs&om?sendnas??ppolg?s&lahsladr&ojts?øjts??o??t&o&l?t-erts&ev?o?ø???roh?øl??vly&kkys?nav??yam-naj!.sg??øjs&om?sendnas???g&orf?ujb??i&dnaort?vnarg??kob?ladendua?maherk&a?å??n&it?urgsrop??orf-&dron?r&os?øs???r&aieb?evats??sfev?uaks?yrts??o&6axi-ygvtsev--nx?c,d&ob?rav??ievs?kssouf?l&m&ob?øb??ous&adna?ech&ac?áč???so!.sg???msdeks?niekotuak?r&egark?olf?y&oso?øso???s&dav?mort???p&ed?p&akdron?elk???r&a&d&dj&ab?áb??iab??jtif?luag?mah?vsyt??e&gn&a&k&iel?ro??merb?n&at?mas??rav-r&os?øs??srop?talf?v&ats?el??y&oh?øh???ivsgnok??il?jkniets?k&a&nvej?rem?s&gnir?nellu???ie-er&den?v&o?ø???ram?sa?årem??la&jf?vh??m&b&ah?áh??mahellil??nnul?ts&l&oj?øj??ul??y&o?ø???imp&ah?áh??m!.sg??osir?t!.sg??ádiáb?ævsyt?øsir??s&adnil?en&dnas?e&dga?k&ri&b?k??som??ve??me&h?jg??nroh-go-ejve?s&a?ednil?k&o?ø??of?yt?å??tsev??gv?hf?igaval?o&r&or?ør??sman??so&fen&oh?øh??m?v??uh&lem?sreka.sen??å!dnil???t&a&baol?g&aov?grav??jjr&av-attam?áv-attám??l&a&b?s??ás??soum?ts?v&eib?our???e&dnaly&oh?øh??f?s&nyt?rokomsdeks?sen??vtpiks??in&aks?áks??loh&ar?år??n!.sg??o&m&a?å??psgolb,?s!.sg?efremmah?or?ør??terdi?á&baol?ggráv?lá&b?s??soum?veib???u&b!.sg?alk?e&dna?gnir?nner??les?ælk??dra&b?eb??g&nasrop?vi?ŋásrop??j&daehal&a?á??jedub?v&arekkhar?árekkhár???ksiouf?n&diaegadvoug?taed???v&irp?lesl&am?åm???y&b&essen?nart?sebel?tsev??o&d&ar?na!s??or??gavtsev?k&rajb?sa??lem?mrak?n&art?n&if?orb???r&a&mah?n?v??e&dni?t&so?ton??va??ul?yd??s&am?enner?gav?lrak?tivk??vrejks??ø&d&ar?na!s??ør??gåvtsev?k&rajb?sa??lem?mrak?n&art?n&if?ørb???r&e&dni?t&so?tøn??va??ul?yd?æ&n?v???s&enner?gåv?tivk?åm??vrejks???á&slág?tlá?vreiks??å&gåv?h?jddådåb?lf??ø&d&ob?rav??r&egark?olf??s&dav?mort????aki?i&sac?tal??u??o&b?f?g?hay?o?ttat??r!.&cer?erots?gro?m&o&c?n??rif?t?yn,?o&c,fni??pohs,stra?t&n?opsgolb,?www??e&a!.&a&ac?cgd?idem??bulc!orea??ci&ffartria?taborea??e&cn&a&l&lievrus-ria?ubma??netniam?rusni??erefnoc??gnahcxe?mordorea?ni&gne?lria?zagam??rawtfos??gni&d&art?ilg!arap?gnah???l&dnahdnuorg?ledom??noollab?retac?sael?t&lusnoc?uhcarap??vidyks??hcraeser?l&anruoj?euf?icnuoc?ortnoc!-ciffart-ria???n&gised?oi&nu?t&a&cifitrec?ercer?gi&tsevni-tnedicca?van??i&cossa!-regnessap??valivic??redef??cudorp?neverp-tnedicca????ograc?p&ihsnoipmahc?uorg!gnikrow???r&e&dart?enigne?korb?niart?trahc??o&htua?tacude???s&citsigol?e&civres?r??krow?serp!xe??tnega??t&farcr&ia?otor??hgil&f?orcim??liubemoh?n&atlusnoc?e&duts?m&esuma?n&iatretne?revog??piuqe????olip?ropria?si&lanruoj?tneics???w&erc?ohs??y&cnegreme?dobper?tefas????rref?z??p!.&a&aa?ca?pc??dem?ecartsnd.icb,gne?r&ab?uj??snduolc,t&acova?cca?hcer??wal?ysrab,???s!.&em?gro?hcs,moc?ten?ude?vog???t!.&116,ayo,gro?lim?moc?nayn,sulpnpv,t&cennockciuq.tcerid,en??ude?v&dr,og???o&hp?m?v?yk??tol?ua??v&iv?lov??xas?ykot??p&a&ehc?g?m?s??cj?eej?g!.&gro?ibom?moc?ossa?ppa,ten?ude???i&r!.nalc,?v?z??j!.&a&3&5xq6f--nx?xqi0ostn--nx??5wtb6--nx?85uwuu--nx?9xtlk--nx?bihc!.&a&bihciakoy?don?ma&him?ye&ragan?tat???r&a&bom?gan?hihci??u&agedos?kas?ustak???s&os?ufomihs??t&amihcay?iran??w&a&g&im&anah?o??omak??kihci?zustum??ihsak??y&agamak?imonihci???e&akas?nagot??i&azni?esohc?h&asa?s&abanuf?ohc???ka&to?zok??musi?orihs?r&akihabihsokoy?o&dim?tak??ukujuk??usihs??nano&hc?yk??o&d&iakustoy?ustam??hsonhot?k&a&rihs?t??iba??nihsaran?sobimanim?tas&arihsimao?imot??uhc?yihcay??u&kujno?s&ayaru?t&imik?tuf???zarasik????g&as!.&a&gas?m&a&tamah?yik??ihsak??rat?t&a&gatik?hatik??ira!ihsin????e&kaira?nimimak??i&akneg?g&aruyk?o??h&c&amo?uo??siorihs??kaznak?modukuf?ra&gonihsoy?mi???nezih?u&k&at?ohuok??s&ot?tarak?????ihs!.&a&kok?m&a&hagan?yirom??ihsakat??rabiam?wagoton??e&miharot?nokih??houyr?i&azaihsin?esok?kustakat?moihsagih??na&mihcahimo?nok??o&hsia?mag?t&asoyot?ok?tir???us&ay?t&asuk?o??????k&aso!.&a&d&awihsik?eki??k&a&noyot?s&akaayahihc?oihsagih???oadat?uziak??m&ayas!akaso??odak??r&a&bustam?wihsak??ediijuf??t&akarih?i&k?us???wag&ayen?odoyihsagih???e&son?tawanojihs??honim?i&akas?h&cugirom?s&ayabadnot?i&a&kat?t??n??oyimusihsagih???k&a&rabi?sim??ustakat??muzi?r&ijat?otamuk???nan&ak?n&ah?es???o&ay?n&a&ganihcawak?simuzi?tak??eba?ikibah?oyot??t&anim?iad?omamihs??uhc??ust&oimuzi?tes????ou&kuf!.&a&d&amay?eos??g&no?ok?usak??hiku?k&awayim?uzii??ma&kan?y&asih?im???rawak?t&a&gon?ka&h?num?t???umo??wa&g&a&kan?nay?t??ias??ko!rih???y&ihsa?usak???e&m&ay?uruk??taruk?us??i&a&nohs?raihcat??goruk?h&cukuf?s&a&gih?hukuy??in???k&a&gako?muzim??iust?o?ustani??m&anim?otihsoynihs?u??r&ogo?ugasas??usu??ne&siek?zu&b?kihc???o&gukihc?h&ak?ot?ukihc??j&ono?ukihc??kayim?nihsukihc?to?uhc??u&fiazad?gnihs?stoyot????zihs!.&a&bmetog?d&amihs?eijuf?ihsoy?omihs??kouzihs?mihsim?ra&biah?honikam??tawi?wa&g&ekak?ukik??kijuf??yimonijuf??i&a&ra?sok??hcamirom?juf?kaz&eamo?ustam??ma&nnak?ta??nukonuzi?orukuf??nohenawak?o&nosus?ti??u&stamamah?z&a&mun?wak??i!ay?i&hs&agih?in??manim??mihs????????m&a&tias!.&a&d&ihsoy?ot?usah??k&a&dih?sa??o&arihs?s???m&a&tias?y&as?o&rom?tah??ustamihsagih???i&hsagurust?jawak??uri??ni?wa&g&e&ko?man??ikot?o??k&ara?i&hsoy?mak???ru?zorokot??y&a&g&amuk?ihsok?otah??kuf??imo??ziin??e&bakusak?ogawak?sogo?ttas?zokoy??i&baraw?h&cugawak?s&oyim?ubustam???iroy?k&ato?ihs?u&k?stawi???m&akoyr?i&hsoy?juf??uziimak???naznar?o&dakas?ihsay?jnoh?n&a&go?nim??imijuf?nah?oy??r&ihsayim?otagan??t&asim!ak??igus?omatik??zak??u&bihcihc!ihsagih??sonuok?ynah????y&ak&aw!.&a&d&ira?notimak??kadih?ma&h&arihs?im??y&a&kaw?tik??oduk???ru&ustakihcan?y??sauy?wa&g&a&dira?zok??orih??konik??yok?zok??e&banat?dawi??i&garustak?jiat?mani??naniak?o&bog?nimik?t&asim?omihs&ah?uk????ugnihs???o!.&a&jos?koasak?m&ay&ako?ust??ihsayah??r&abi?ukawaihsin??wi&aka?nam???e&gakay?kaw??i&gan?h&cu&kasa?otes??sahakat??k&asim?ihsaruk??miin??n&anemuk?ezib??o&hsotas?jnihs?n&amat?imagak??ohs?uhcibik?????ot!.&a&damay?got?koakat?may&etat?ot??nahoj?riat?waki&inakan?reman???eb&ayo?oruk??i&h&asa?ciimak?sahanuf??kuzanu?m&an&i?ot??ih???nezuyn?otnan?u&hcuf?stimukuf?z&imi?ou???????ihs&o&gak!.&a&m&ayuok?ihsogak??si?yonak??e&banawak?n&at&akan?imanim??uka??tomoonihsin??i&adnesamustas?k&azarukam?oih??m&ama?uzi??usuy??nesi?o&knik?os?tomustam??uzimurat???rih!.&a&ka&n?s??m&ayukuf?i&hsorihihsagih?j&ate?imakikaso????r&a&bohs?h&ekat?im???es??tiak?wiad??e&kato?ruk??i&h&ci&akustah?mono?nihs??s&inares?oyim???manimasa?uk??negokikesnij?o&gnoh?namuk??uhcuf????uk&ot!.&a&bihci?mi&hsu&kot?stamok??m??wagakan??egihsustam?i&gum?h&coganas?soyim??kijaw?m&anim?uzia??ukihsihs??nan&a?iak??o&nati?turan????uf!.&a&batuf?m&a&to?y&enak?irok???ihs&im?ukuf??os?uko??r&aboihsatik?uganat??ta&katik?mawak?rih??w&a&g&akus?emas?uy??k&a&mat?rihs?sa??ihsi??nah??ohs???e&gnabuzia?iman?ta&d?tii???i&adnab?enet?hs&agih?iimagak??k&a&wi?zimuzi??ubay??minuk?r&ook?ustamay???nihsiat?o&g&etomo?ihsin?nan?omihs??no!duruf?rih??rihsawani?ta&may?simuzia???u&rahim?stamakawuzia?zia&ihsin?nay???????nug!.&a&bawak?doyihc?k&anna?oi&hsoy?juf?mot???m&ayakat?ustagaihsagih??n&ihsatak?nak??r&ahonagan?nak?o?u&kati?mamat???t&amun?inomihs?o??w&akubihs?iem?ohs???i&hsa&beam?yabetat??kas&akat?esi??m&akanim?uzio??ogamust?rodim??o&jonakan?n&eu?oyikust??tnihs??u&komnan?stasuk?yrik?????ran!.&a&bihsak?d&akatotamay?u!o???guraki?m&ay&atik&imak?omihs??irokotamay??oki??ra&hihsak?n??wa&geson?knet???e&kayim?ozamay?sog?ustim??i&a&rukas?wak??garustak?h&ciomihs?sinawak??jo?ka&mnak?toruk??makawak?nos?r&net?otakat?ugeh???o&d&na?oyo??gnas?jnihs?nihsoy!ihsagih??tomarawat?yrok????t&ag&amay!.&a&dihsio?k&atarihs?ourust??may&a&kan?rum??enak?onimak??rukho?ta&ga&may?nuf??hakat?kas??wa&g&ekas?orumam??ki&hsin?m??z&anabo?enoy?ot???zuy??e&agas?bonamay?dii?nihsagih?o??i&a&gan?nohs??h&asa?sinawak??nugo??o&dnet?jnihs?ynan??ukohak???iin!.&a&ga?k&ium?oagan??munou!imanim??t&a&bihs?giin??ioy??w&a&gioti?kikes?zuy??irak??yijo??e&kustim?mabust??i&aniat?hcamakot?kaz&awihsak?omuzi??m&a&gat?karum??o???n&anust?esog??o&das?ihcot?jnas?k&ihay?oym??mak?naga?ries??u&ories?steoj?????i&ka!.&a&go?k&asok?oimak??t&ago!rihcah??ika!atik???w&aki?oyk???e&mojog?natim?suranihsagih?t&ado?okoy???i&hsoyirom?magatak?naokimak??nesiad?o&hakin?jnoh!iruy??nuzak?rihson?tasi&juf?m??yjnoh??u&kobmes?oppah????o!.&a&dakatognub?m&asah?ihsemih??su?t&ekat?i&h?o????e&onokok?ustimak??i&jih?k&asinuk?ias?usu??mukust??onoognub?u&fuy?juk?ppeb?suk??????wa&ga&k!.&a&mihsoan?rihotok?waga&kihsagih?ya???emaguram?i&j&nonak?ustnez??kunas?monihcu??o&hsonot?nnam?yotim??u&st&amakat?odat??zatu????nak!.&a&dustam?kus&okoy?tarih??maz?nibe?r&a&gihsaimanim?h&esi?imagas??wa&do?guy???u&im?kamak???tikamay?wa&k&ia?oyik?umas??sijuf??yimonin??e&nokah?saya??i&akan?esiak?gusta?hsuz?kasagihc?o?ukust??o&nadah?sio?tamay?????kihsi!.&a&danihcu?gak?kihs?mijaw?t&abust?ikawak??wazanak??i&gurust?hcionon?mon?ukah??nasukah?o&anan?ton!akan???u&kohak?stamok?z&imana?us?????niko!.&a&han?m&arat?ijemuk?uru??n&e&dak?zi??no??ra&hihsin?rih??wa&kihsi?niko??yehi?zonig??e&osaru?seay??i&hsagih?jomihs?k&a&gihsi?not??ihsakot??m&a&ginuk?kihsug?maz??igo?otekat??nuga!noy???n&a&moti?timoy?wonig??i&jikan?k???o&gan?jnan?tiad&atik?imanim???u&botom?kusug&akan!atik??imot??rab&anoy?eah???????c&204ugv--nx?462a0t7--nx?678z7vq5d--nx?94ptr5--nx?a??d&17sql1--nx?3thr--nx?5&20xbz--nx?40sj5--nx??7&87tlk--nx?ptlk--nx??861ti4--nx?a?e??e&16thr--nx?5&1a4m2--nx?9ny7k--nx??im!.&a&bot?k&asustam?uzus??m&a&him?y&emak?im???ihs??nawuk?wi&em?k???e&bani?ogawak?si!imanim???i&arataw?gusim?h&asa?ciakkoy??k&a&mat?sosik?t??iat??raban??o&dat?hik?n&amuk?ihseru?o&du?mok????ust???mihe!.&a&m&a&h&ataway?iin??yustam??ij&awu?imak???taki!man???ebot?i&anoh?kasam?rabami??n&ania?egokamuk?oot??o&jias?kihcu?nustam?uhcukokihs?yi!es???u&kohik?zo????n!.&nriheg,teniesa.resu,?amihs!.&a&d&amah?ho?usam??kustay?m&a?ihsoni&hsin?ko???wakih??e&namihs?ustam??i&g&aka?usay??konikak?mikih??nannu?o&mu&kay?zi!ihsagih?uko???nawust?tasim??u&stog?yamat?????tawi!.&a&bahay?d&amay?on??koirom?t&a&honat?katnezukir??imus??w&as&ijuf?uzim??ihs???e&hon&i&hci?n??uk??tawi??i&a&duf?murak?wak??h&custo?si&amak?ukuzihs???j&oboj?uk??k&a&m&anah?uzuk??sagenak??esonihci??m&akatik?uzia&rih?wi????o&kayim?no&rih?t??tanufo??uhso????g&3zsiu--nx?71qstn--nx?l??h&03pv23--nx?13ynr--nx?22tsiu--nx?61qqle--nx??i&54urkm--nx?g&ayim!.&a&dukak?m&a&goihs?kihs??ihsustam!ihsagih??unawi??r&awago?iho??ta&bihs?rum??w&a&gano?kuruf??iat??y&imot?ukaw???e&mot?nimes??i&hsiorihs?ka&monihsi?s&awak?o???mak?r&ataw?o&muram?tan????o&az?jagat?t&asim?omamay???u&fir?k&irnasimanim?uhsakihcihs?????ihcot!.&a&g&a&h?kihsa??ust??kom?m&ay&o?usarak??unak??r&a&boihsusan?watho??iho?ukas??t&akihsin?iay??wa&konimak?zenakat??y&imonustu?oihs???e&iiju?kustomihs?nufawi??i&akihci?g&etom?ihcot?on???o&k&ihsam?kin??nas?sioruk?tab??u&bim?san?????h&c&ia!.&a&dnah?m&a!h&akat?im??yuni??ihs&ibot?ust???r&a&hat?tihs??ik?u&ihsagih?kawi???t&ihc?o&k?yot???wa&koyot?zani??yi&monihci?rak???e&inak?k&aoyot?usa??manokot?noyot??i&a&gusak?kot?sia??eot?h&asairawo?cugo?s&ahoyot?oyim???k&a&mok?zako??ihssi??motay?rogamag??n&an&ikeh?ok??ihssin??o&got?ihsin?jna?rihsnihs?suf?tes??u&bo?raho?s&oyik?takihs??yrihc?zah????ok!.&a&dusay?kadih?mayotom?r&ah&im?usuy??umakan??sot!ihsin??wa&g&atik?odoyin??k&as?o????i&esieg?hco!k??jamu?k&a!sus??usto??ma&gak?k??rahan??o&mukus?n&i?ust!ihsagih???torum?yot!o???u&koknan?zimihsasot????ugamay!.&a&m&ayukot?ihso??toyot??e&bu?subat??i&gah?kesonomihs?nukawi?rakih??nanuhs?otagan?u&ba?foh?otim?stamaduk?uy?????sanamay!.&a&dihsoyijuf?mayabat?r&ahoneu?ustakihsin??w&a&k&ayah?ijuf??suran??ohs???egusok?i&ak?h&cimakan?s&anamay?od???k&asarin?u&feuf?sto????o&k&akanamay?ihcugawakijuf??nihso?t&asimawakihci?ukoh??uhc??spla-imanim?u&b&nan?onim??fok?hsok?rust?????ka&rabi!.&a&bukust?gok?kan!ihcatih??m&a&sak?timo?wi??ihsak?ustomihs??ni?r&a&hihcu?way??u&agimusak?ihcust???t&ag&amay?eman??oihcatih??w&ag&arukas?o??os??yi&moihcatih?rom???e&bomot?dirot?not?tadomihs??i&a&k&as?ot??rao??esukihc?gahakat?h&asa?catih??k&a&rabi?saguyr??ihsani?uy??ma?rukustamat??o&dnab?giad?him?kati?rihsijuf?soj?t&asorihs?im??yihcay??u&fius?kihsu?simak????sagan!.&a&m&abo?ihsust??natawak?r&abamihs?u&mo?ustam???wijihc?yahasi??i&akias?hies?k&asagan?i??masah??neznu?o&besas?darih?t&eso?og!imaknihs????ust&igot?onihcuk?uf????zayim!.&a&biihs?guyh?k&oebon?ustorom??mihsuk?r&emihsin?uatik??ta&katik?mim??wag&atik?odak??ya??e&banakat?sakog??i&hsayabok?kaza&kat?yim??m&animawak?ot&inuk?nihs????nanihcin?o&j&ik?onokayim??n&ibe?ust??tias??urahakat????ro&moa!.&a&dawot?turust?wasim??e&hon&ihc&ah?ihs??nas?og?ukor??sario??i&anarih?ganayati?hsioruk?jehon?kasorih?makihsah?nawo?r&amodakan?omoa???o&gnihs?kkat??u&ragust?stum????ttot!.&a&r&ahawak?uotok??sa&kaw?sim???egok?irottot?nanihcin?o&ganoy?nih?tanimiakas??u&bnan?z&ay?ihc??????ukuf!.&a&deki?gurust?ma&bo?h&akat?im??yustak??sakaw??eabas?i&akas?ho?jiehie?ukuf??nezihce!imanim??ono????k&26rtl8--nx?4&3qtr5--nx?ytjd--nx??522tin--nx?797ti4--nx??l33ussp--nx?m&11tqqq--nx?41s3c--nx??n&30sql1--nx?65zqhe--nx?n7p7qrt0--nx??o&131rot--nx?7qrbk--nx?c?diakkoh!.&a&deki?gakihset?hcebihs?k&adih?u&fib?narihs???m&ayiruk?hot?ihs&orihatik?ukuf??oras?usta??r&ib&a!ka??o?uruf??ozo?u&gakihsagih?oyot???sakim?ta&gikust?mun??w&a&ga&k&an?uf??nus!imak???k&aru?i&h&asa?sagih??kat?mak??omihs?um??zimawi??ine?oyk??yot??e&a&mustam?nan??b&a&kihs?yak??o&noroh?to???ian?k&ihsam?ufoto??nakami?ppoko!ihsin??sotihc?tad!okah??uonikat??i&a&bib?mokamot?n&a&k&kaw?oroh??wi??eomak?ihsatu?okik?usta&moruk?sakan????eib?h&c&ioy?u&bmek?irihs???s&ase?ekka?oknar?uesom???jufirihsir?k&amamihs?i&at?n???m&atik?otoyot??oa&kihs?rihs??r&a&hs?kihsi?mot??ihs&aba?ir??otarib???n&a&hctuk?rorum?se?tokahs??uber??o&kayot?m&ire?ukay??naruf!ima&k?nim???orih?r&ih&ibo?suk??o&bah?h&i&b?hsimak??sa??pnan?yan??umen??t&asoyik?eko?ukoh???u&bassa?kotnihs?m&assaw?uo??pp&akiin?en&ioto?nuk??ip??rato?s&akat?t&eb&e?i&a?hs!a??robon??m&e?o&m?takan???no&h?tamah??o&mik?s?t??u&kir?ppihc?st???onihsnihs?ufuras??uaru??yru!koh??zimihs!ok?????g!oyh!.&a&bmat?dnas?gusak?k&at?o&oyot?y??uzarakat??m&ayasas?irah??wa&g&ani?okak??k&i&hci?mak??oy???yi&hsa?monihsin???i&asak?hs&aka?i&at?nawak???j&awa!imanim??emih??k&a&goa?s&agama?ukuf??wihsin??i&hsog?m???mati?oia?rogimak??n&annas?esnonihs??o&gasa!kat??ka?n&ikat?o?ustat??rihsay?sihs?tomus?yas??u&bay?gnihs?????nagan!.&a&bukah?d&a&w?yim??e&ki?u??ii??k&a&s&ay?uki??zus??ihsoo?ousay??m&ay&akat?ii??i&hsukufosik?jii??ukihc??n&i!hsetat??uzii??r&ah?ugot??saim?t&agamay?oyim??w&a&g&a&kan?n??o??kustam?ziurak??onim!imanim??u&koo?s!omihs????ya&ko?rih???e&akas?nagamok?subo??i&gakat?h&asa?c&a!mo!nanihs???uonamay??sukagot??k&a&kas?mimanim?to??ia&atik?imanim??oa?uzihcom??m&akawak?ijuf?o!t???r&ato?ijoihs?omakat???n&ana?esnoawazon??o&hukas?n&a&gan?kan??i&hc?muza??ustat??romok?si&gan?k??tomustam??u&k&as?ohukihc??stamega????to&mamuk!.&a&gamay?rahihsin?sukama!imak??tamanim??enufim?i&hcukik?k&ihsam?u??nugo!imanim??romakat??o&ara?rihsustay?sa?t&amay?om&amuk?us??u!koyg???yohc??u&sagan?zo????yk!.&a&bmatoyk?k&ies?oemak?uzaw??mayi&h&cukuf?sagih??muk??nihsamay?rawatiju?t&away?ik???e&ba&nat!oyk??ya??di?ni??i&ju?kazamayo?manim??natnan?o&gnatoyk?kum?mak?rihsamayimanim?y&gakan?ka&koagan?s??oj???u&ruziam?z&ayim?ik??????wtc1--nx?ykot!.&a&d&i&hcam?mus??oyihc??k&atim?ihsustak??m&a&t!uko??yarumihsa&gih?sum???i&hs&agoa?ika?o!t??uzuok??ren???r&a&honih?wasago??iadok?umah??ssuf?t&ik?o??wa&g&anihs?ode??k&ara?ihcat???y&agates?ubihs???e&amok?donih?m&o?urukihsagih??soyik??i&enagok?gani?h&ca&da?tinuk??sabati??j&nubukok?oihcah??manigus??o&huzim?jihcah?n&akan?ih!sasum??urika??rugem?t&a&mayihsagih?nim??iat?ok??uhc?yknub??u&fohc?hcuf?kujnihs?????r&2xro6--nx?g?o??s&9nvfe--nx?xvp4--nx??t&netnocresu,opsgolb,?u&4rvp8--nx?fig!.&a&d&eki?ih??kimot?m&ayakat?ihsah??ne?raha&gi&kes?makak??sak??taga&may?tik??wa&g&ibi?ustakan??karihs!ihsagih????e&katim?uawak??i&gohakas?hc&apna?uonaw??k&ago?es?ot??m&anuzim?ijat??nak?urat??nanig?o&dog?jug?makonim?nim?roy?sihcih??u&fig?s&otom?t&amasak?oay???????x5ytlk--nx?yu6d27srjd--nx?z72thr--nx?井福?京東?分大?取鳥?口山?城&宮?茨??媛愛?山&富?岡?歌和??岡&福?静??島&児鹿?広?徳?福??崎&宮?長??川&奈神?石?香??庫兵?形山?手岩?木栃?本熊?根島?梨山?森青?潟新?玉埼?田秋?知&愛?高??縄沖?良奈?葉千?賀&佐?滋??道海北?都京?重三?野長?阜岐?阪大?馬群???k!.&art?gro?moc?per?ude?vog???l&eh?l??m!ac?j??nd?o&g?h&pih?s!.ysrab,??lnud?oc?t!.&lldtn,snd-won,???pa!.&0mroftalp,arusah,bew,enilnigol,lecrev,nur:.a,,t&ibelet,xenw,?yfilten,??ra&a?hs??u&ekam?llag?org!.esruocsid,cts?kouk?nayalo???vsr?xece4ibgm--nx??q&a!3a9y--nx??g?i!.&gro?lim?moc?ten?ude?vog???m?se??r&a!.&acisum?bog?gro?lim?moc!.topsgolb,?rut?t&en?ni??ude?vog??4d5a4prebgm--nx?b?c?eydoog?los?t&at?s!uen???ugaj??b!.&21g?a&b&a&coros?iuc??itiruc??cnogoas?dicerapa?gniram?i&naiog?ramatnas??n&erom?irdnol??op?p&acam?irolf?ma&j?s???rief?tsivaob??b!aj?ib?mi?sb??c&ba?e&r?t??js?sp?t!e???d&em?mb?n&f?i??rt??e&dnarganipmac?ficer?ht?llivnioj?rdnaotnas??f&dj?ed?gg?n&e?i???g&e&l!.&a&b,m,p,?bp,c&a,s,?e&c,p,s,?fd,gm,ip,jr,la,ma,nr,o&g,r,t,?p&a,s,?r&p,r,?s&e,m,r,?tm,??s??l&s?z??n&c?e?o??ol!b?f?v??pp?ro??hvp?i&du?kiw?nana?oretin?r&c?eurab??sp?te?xat??l&at&an?rof??el?im?sq??m&a?da?e&gatnoc?leb??f?ic?oc!.topsgolb,??nce?o&ariebir?c&e?narboir?saso??d&o?ranreboas??e&g?t??i&b?dar?ecam?r??rp?t&a?erpoir???p&er?m!e?t??ooc?pa?se??qra?r&af?ga?o&davlas?j??tn?ut??s&a&ixac?mlap?nipmac??ed?u&anam?j?m???t&am?e&d?n?v??nc?o&f?n??ra?sf??u&caug9?de?ja?rg??v&da?ed?og!.&a&b?m?p??bp?c&a?s??e&c?p?s??fd?gm?ip?jr?la?ma?nr?o&g?r?t??p&a?s??r&p?r??s&e?m?r??tm???rs?t??xiv?z&hb?ls?o&c?f?????c!.&as?ca?de?if?o&c?g??ro???e&bew?ccos?dnik?e&b?n&igne?oip??rac??gni&arg?rheob??h&cor?sok?t&aew?orb???itnorf?k&col?o&p?rb???l&aed?ffeahcs??mal?nes?pinuj?t&a&eht?rebsnegömrev??law?nec?s&acnal?nom?ubkcolb??upmoc??v&o&c&sid?tfiws??rdnal??resbo??wulksretlow?ywal?zifp??f!.&aterg?bew-no,drp?e&c&itsuj-reissiuh?narf-ne-setsitned-sneigrurihc,?rianiretev??i&cc?rgabmahc??m&o&c?n??t??n&eicamrahp?icedem??ossa?s&e&lbatpmoc-strepxe?riaton?tsitned-sneigrurihc?uova??o&-x&bf,obeerf,?x&bf,obeerf,???t&acova?o&or-ne,psgolb,?r&epxe-ertemoeg?op!orea????vuog??avc7ylqbgm--nx?s??g!.&gro?m&oc?yn,?t&en?opsgolb,?ude?vog???h!.&e&erf,man??mo&c?rf??topsgolb,zi??ur??i!.&a&61f4a3abgm--nx?rf4a3abgm--nx??ca?di?gro?hcs?oc?ten?vog?نار&يا?یا???a&h?per??ew?lf??k!.&c&a?s??e&n?p?r??gk?iggnoeyg?kub&gn&oeyg?uhc??noej??l&im?uoes??man&gn&oeyg?uhc??noej??n&as&lu?ub??o&e&hcni?jead??wgnag???o&c?g??ro?s&e?h?m??topsgolb,u&gead?j&ej?gnawg????cilf??l!.&gro?moc?ten?ude?vog???m!.&topsgolb,vog???n!.&gro?moc?ofni?ten?ude?vog?zib???o&htua?odtnorf?t&c&a?od??laer???p!.&alsi?ca?eman?forp?gro?moc?o&fni?rp??t&en?se??ude?vog?zib???s?t!.&21k?bew?cn!.vog??eman?gro?kst?l&e&b?t??im?op??moc!.topsgolb,?neg?ofni?pek?rd?sbb?ten?ude?v&a?og?t??zib??f?m??ubad?vd??s&8sqif--nx?9zqif--nx?a!.vog?birappnb?gev?lliv?mtsirhc?s??b!.&ew,gro?moc?ten?ude?vog??c?oj?s?u??c&i&hparg?p?t&sigolyrrek?ylana???od??d&a?d?l?n&iwriaf?omaid??oogemoh?rac??e!.&bog?gro?mo&c!.topsgolb,?n??ude??civres!.enilnigol,?d&d2bgm--nx?oc??h&ctaw?guh??i&lppus?rtsudni?treporp!yrrek???jaiv?l&aw?cycrotom?etoh?gnis?pats??m&ag?oh?reh??nut?ohs?picer?r&it?ut&cip!.7331,?nev???s!i&rpretne?urc??ruoc??taicossa?vig??g!nidloh??h5c822qif--nx?i!.&ekacpuc,gro?moc?t&en?ni?opsgolb,?ude?vog??a09--nx?nnet?rap?targ??k&c&or!.&ecapsbew,snddym,ytic-amil,??us??hxda08--nx?row??l!.&c&a?s??ed,gro?o&c?fni??ten?ude?vog?zib??a&ed?tner??e&ssurb?toh!yrrek???lahsram?m?oot??m!.&bal,gro?moc?ten?ude?vog??b?etsys!.tniopthgink,?ialc??n&a&f?gorf?ol??egassap?i&a&grab?mod??giro??o&it&acav?cudorp?ulos??puoc???o&dnoc?geuj?leuv?ppaz?t&ohp?ua???p!.&ces?gro?moc?olp?ten?ude?vog??i&hsralohcs?lihp?t??u??r!.&au,ca?gro?mon,ni?oc?topsgolb,ude?vog?xo,?a&c?p?tiug??c?e&dliub?erac?gor?levart?mraf?n&niw?trap??wolf??ot&cartnoc?omatat??pj?uot??s!.&gro?moc?ten?ude?vog?zib??alg?e&n&isub!.oc,?tif??rp!xe!nacirema???xnal??iws??t&a&e&b?ytic??ob??ek&cit?ram??fig?h&cay?gilf??n&atnuocca?e&mt&rapa?sevni??ve!.oc,???rap??u!.&a&c!.&21k?bil?cc???g!.&21k?bil?cc???i!.&21k?bil?cc???l!.&21k?bil?cc???m!.&21k!.&hcorap?rthc?tvp???bil?cc???p!.&21k?bil?cc???si?v!.&21k?bil?cc???w!.&21k?bil?cc????c&d!.&21k?bil?cc???n!.&21k?bil?cc???s!.&21k?bil?cc????d&ef?i!.&21k?bil?cc???m!.&21k?bil?cc???n!.&bil?cc???s!.&bil?cc???urd,?e&d!.&21k?bil,cc???las-4-&dnal,ffuts,?m!.&21k?bil?cc???n!.&21k?bil?cc????h&n!.&21k?bil?cc???o!.&21k?bil?cc????i&h!.&bil?cc???m!.&21k?bil?c&c?et??goc?n&eg?otae??robra-nna?sum?tsd?wanethsaw???nd?r!.&bil?cc???v!.&21k?bil?cc???w!.&21k?bil?cc????jn!.&21k?bil?cc???k&a!.&21k?bil?cc???o!.&21k?bil?cc????l&a!.&21k?bil?cc???f!.&21k?bil?cc???i!.&21k?bil?cc????mn!.&21k?bil?cc???n&afflog,i!.&21k?bil?cc???m!.&21k?bil?cc???sn?t!.&21k?bil?cc????o&c!.&21k?bil?cc???m!.&21k?bil?cc???ttniop,?p&ion,rettalp,?r&a!.&21k?bil?cc???o!.&21k?bil?cc???p!.&21k?bil?cc????s&a!.&21k?bil?cc???dik?k!.&21k?bil?cc???m!.&21k?bil?cc???nd&deerf,uolc,??t&c!.&21k?bil?cc???m!.&21k?bil?cc???u!.&21k?bil?cc???v!.&21k?bil?cc????ug!.&21k?bil?cc???v&n!.&21k?bil?cc???w!.cc???x&ohparg,t!.&21k?bil?cc????y&b-si,k!.&21k?bil?cc???n!.&21k?bil?cc???w!.&21k?bil?cc????za!.&21k?bil?cc????ah!uab??bria?col?e!.ytrap.resu,?ineserf?lp?xe&l?n???vt?w!.&66duolc,gro?moc?s&ndnyd,tepym,?ten?ude?vog??a?e&iver?n??odniw??y&alcrab?cam?ot???t&0srzc--nx?a!.&amil4,ca!.hts??gni&liamerutuf,tsoherutuf,?o&c!.topsgolb,?fni,?ph21,r&euefknuf.neiw,o??v&g?irp,?xi2,ytic-amil,zib,?c?e!s??hc?if?l!asite??mami?rcomed??b!.&gro?moc?ten?ude?vog??b?gl??c&atnoc?e&les?rid!txen????dimhcs?e!.&eman?gro?moc?ofni?ten?ude?vog?zib??b?em?grat?id?k&circ?ram??n!.&0&002cilc,rab,?1rab,2rab,5inu,6vnyd,7&7ndc.r,erauqs,?a&l&-morf,moob,?minifed,remacytirucesym,tadsyawla,z,?b&boi,g,lyltsaf:.pam,,?c&inagro-gnitae,paidemym,?d&ecalpb,nab-eht-ni,uolc&meaeboda,nievas.citsalej,xednay:.e&garots,tisbew,?,??e&cnarusnihtlaehezitavirp,gdirbtib,ht-no-eciffo,l&acsnoom,ibom-eruza,?m&ecnuob,ohtanyd,tcerider,?nozdop,rehurht,s,tis-repparcs,zamkcar,?f&aeletis,crs.&cos,resu,?ehc-a-si,?g&ni&reesnes,tsohnnylf,?olbevres,?k&eeg-a&-si,si,?u,?l&acolottad,iamwt,s&d-ni,s-77ndc,??m&ac&asac,ih,?urofniem,?n&a&f&agp,lhn,?ibed,?dcduabkcalb,i,pv-ni,?o&c-morf,jodsnd,rp-ytinummoc,ttadym,?p&i&-&etsef,on,?emoh,fles,nwo,?j,mac-dnab-ta,o&-oidar-mah,hbew,?pa&duolc,egde,?tfe&moh,vres,?usnd,?r&e&tsulcyduolc,vres-xnk,?vdslennahc:.u,,?s&a&ila&nyd,snd,?nymsd,?bbevres,dylimaf,e&suohsyub,t&isbeweruza,ys,??kekokohcs,n&d&-won,d,golb,npv,?oitcnufduolc,?s&a-skcik,ecca&-citats,duolc,???t&adies,ceffeym,e&nretnifodne,smem,?farcenimevres,i-&ekorb,s&eod,lles,teg,??n&essidym,orfduolc,?r0p3l3t,s&ixetnod,ohgnik,??u&h,nyd,r,?x&inuemoh,spym,tsale.1ots-slj,unilemoh,?y&awetag-llawerif,ffijduolc,ltsaf.&dorp.&a,labolg,?lss.&a,b,labolg,?pam,slteerf,?n&-morf,ofipi,?srab,tieduolc,?z&a-morf,tirfym,???p?tcip?v??f&ig?o&l?sorcim???g!.&bog?dni?ed,g&olb,ro??lim?mo&c?n,?ot,ten?ude???h!.&dem?gro?l&er?op??m&oc?rif??o&fni?rp?s&rep?sa???po&hs?oc??t&en?luda?ra??ude?vuog???i!.&a&2n-loritds--nx?7e-etsoaellav--nx?8&c-aneseclrof--nx?i-lrofanesec--nx??at?b?c!cul??dv?i&blo&-oipmet?oipmet??cserb?drabmol?g&gof?urep??l&gup?i&cis?me&-oigger?oigger???uig&-&aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf???aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf????n&a&brev?cul?pmac?tac??idras?obrac&-saiselgi?saiselgi??resi??otsip?r&b&alac!-oigger?oigger??mu??dna&-&attelrab-inart?inart-attelrab??attelrabinart?inartattelrab?ssela??epmi?ugil??tnelav&-obiv?obiv??vap?z&e&nev?ps&-al?al???irog???l&iuqa!l??leib??m&or?rap??n!acsot?e&dom?is?sec&-&ilrof?ìlrof??ilrof?ìlrof???g&amor&-ailime?ailime??edras?olob??i&ssem?tal??ne!var??o&cna?merc?rev?vas???oneg?p?r!a&csep?rr&ac&-assam?assam??ef??von??etam?tsailgo!-lled?lled???s!ip?sam&-ararrac?ararrac??u&caris?gar???t!a&cilisab?recam??resac?soa!-&d&-&ellav?lav??ellav?lav??ellav??d&-&ellav?lav??ellav?lav??ellav??te&lrab&-&airdna-inart?inart-airdna??airdnainart?inartairdna??ssinatlac???udap?v!o&dap?neg?tnam???zn&airb&-a&lled-e-aznom?znom??a&lledeaznom?znom??eaznom??e&c&aip?iv??soc?top??om???b&-&23,46,61,?3c-lorit-ds-onitnert--nx?be-etsoa&-ellav--nx?dellav--nx??c!f-anesec-lrof--nx?m-lrof-anesec--nx??he-etsoa-d-ellav--nx?m!u??o2-loritds-nezob--nx?sn-loritds&-nasl&ab--nx?ub--nx??nitnert--nx??v!6-lorit-dsnitnert--nx?7-loritds&-nitnert--nx?onitnert--nx???z&r-lorit-ds&-nitnert--nx?onitnert--nx??s-loritds-onitnert--nx???c&f?is?l?m?p?r?v??d&p?u!olcnys,??e&c!cel?inev?nerolf??f?g!ida&-&a&-onitnert?onitnert??otla!-onitnert?onitnert???a&-onitnert?onitnert??otla!-on&azlob?itnert??onitnert????hcram?l?m!or??n&idu?o&n&edrop?isorf??torc???p?r?s&erav?ilom??t!nomeip?s&eirt?oa!-&d-e&ellav?éllav??e&ellav?éllav???de&ellav?éllav??e&ellav?éllav?????v?znerif??g&a?b?f?il?o?p?r?up?vf??hc?i&b?c?dol?f?l!lecrev?opan?rof&-anesec?anesec???m?n&a&part?rt&-attelrab-airdna?attelrabairdna???imir?ret??p?r!a&b?ilgac?ssas???s!idnirb??t&ei&hc?r??sa??v??l&a!c??b?c?o&m?rit&-&d&eus&-&nitnert?onitnert??nitnert?onitnert??us&-&nitnert?onitnert??nitnert?onitnert??üs&-&nitnert?onitnert??nitnert?onitnert???s&-onitnert?onitnert???d&eus!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??us&-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??üs!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert???s&-onitnert?onitnert?????m&ac?f?i?ol?r??n&a!lim?sl&ab?ub???b?c?e!v?zob??irut?m!p??p?r?t??o&a!v??b!retiv??c!cel??enuc?g!ivor??i&dem&-onadipmac?onadipmac??pmet&-aiblo?aiblo??rdnos?zal??l?m!a&greb?ret??oc?re&f?lap???n!a&dipmac&-oidem?oidem??lim?tsiro?zlob??ecip&-ilocsa?ilocsa??i&bru&-orasep?orasep??lleva?rot?tnert??r&elas?ovil??ulleb??p?r!a&sep&-onibru?onibru??znatac??oun??s!ivert?sabopmac??t!arp?e&nev?ssorg??n&arat?e&girga?rt?veneb????zz&era?urba???p&a?s?t??qa?r&a!m?s??b!a??c?f?g?k?me?o?p?s?t?v??s&a&b?iselgi&-ainobrac?ainobrac???b?c?elpan?i?m?ot?s?t?v??t&a?b?c?l?m?nomdeip?o!psgolb,?p?v??u&de?l?n?p??v&a?og?p?s?t?v??y&drabmol?ellav&-atsoa?atsoa??licis?nacsut??z&al?b?c?p??ìlrof&-anesec?anesec???derc?er?f!.sulptp,?m!r??utni??je3a3abgm--nx?kh?l!.&myn,topsgolb,vog??uda??m!.&gro?moc!.topsgolb,?ten?ude???n&a&morockivdnas?ruatser?tnuocca??e&g?m&eganam!.retuor,?piuqe??r??i!.ue?m?opdlog??opud?uocsid??o&b?cs!.vog,?d?g?h?j?oferab?p&edemoh?s???p!.&emon?gro?lbup?m&oc?yn,?t&en?ni?opsgolb,?ude?vog???r&a!m&law?s???epxe?op&er?pus!.ysrab,?s???s!.&adaxiabme?e&motoas?picnirp?rots??gro?lim?mo&c?n,?o&c?dalusnoc?hon,?ten?ude?vog??a&cmoc?f??e&b?padub?r?uq??i!rolf?tned??o&h!.&duolc&p,rim,?e&lej,tiseerf,?flah,s&pvtsaf,seccaduolc,?tsafym,??p!sua???urt??t!.&eman?gro?ibom?levart?m&oc?uesum??o&c?fni?r&ea?p???pooc?sboj?t&en?ni??ude?vog?zib??ayh?n?o!bba?irram???uognah?xen?y?ztej??u&2&5te9--nx?yssp--nx??a!.&a&s?w??civ?d&i?lq??fnoc?gro?moc!.topsgolb,?nsa?ofni?sat?t&ca?en?n??ude!.&a&s?w??ci&lohtac?v??dlq?sat?t&ca?n??wsn!.sloohcs????vog!.&a&s?w??civ?dlq?sat???wsn?zo??ti??c!.&fni?gro?moc?ten?ude?vog??i??d&e!.tir.segap-tig,?iab??e!.&dcym,enozgniebllew,noitatsksid,odagod.citsalej,snd&ps,uolc,?ysrab,??g!.&bew?gro?m&aug?oc??ofni?ten?ude?vog???h!.&0002?a&citore?idem?kitore??edszot?gro?ilus?letoh?m&alker?lif?t?urof??naltagni?o&c?ediv?fni?levynok?nisac??pohs?rarga?s&a&kal?zatu??emag?wen??t&lob?opsgolb,rops??virp?xe&s?zs??ytic?zsagoj??os?sut??l!.&myn,topsgolb,??m!.&ca?gro?moc?oc?ro?ten?vog???n!.&duolcesirpretne,eni&esrem,m,?mon,tenkcahs,uwu,?em!.ysrab,??o&ggnaw?y!c???r!.&a&i&kymlak,rikhsab,vodrom,?yegyda,?bps,ca,eniram,g&bc,nitsohurger.citsalej,ro,?ianatsuk,k&ihclan,s&m,rogitayp,??li&amdlc.bh,m,?moc,natsegad,onijym,pp,ri&b,dcm:.spv,,midalv,?s&ar,itym,?t&en,ni,opsgolb,set,?u&4an,de,?vo&g,n,?ynzorg,zakvakidalv,?myc?p?ug??s!.&a&d&golov,nagarak,?gulak,i&groeg,kymlak,lerak,nemra,rikhsab,ssakahk,vodrom,zahkba,?lut,rahkub,vut,yegyda,znep,?bps,da&baghsa,rgonilest,?gunel,i&anatsuk,hcos,ovan,ttailgot,?k&alhsygnam,ihclan,s&legnahkra,m,n&a&mrum,yrb,?i&buytka,nbo,??tiort,vorkop,??l&ocarak,ybmaj,?myn,na&gruk,jiabreza,ts&egad,hkazak-&htron,tsae,???ovonavi,r&adonsark,imidalv,?t&enxe,nek&hsat,mihc,??vo&hsalab,n,?ynzorg,z&akvakidalv,emret,??t&amok?i&juf?masih????v!.&em,g&olb,ro??moc?nc,ten?ude?ved,??ykuyr??v&b?c!.topsgolb,?ed!.&enilnigol,lecrev,ppa-rettalp,srekrow,vr&esi,uc,?ylf,??ih?l!.&di?fnoc?gro?lim?mo&c?n,?nsa?ten?ude?vog???m!.&eman?gro?lim?m&oc?uesum??o&fni?r&ea?p???pooc?t&en?ni??ude?vog?zib???o&g?m??rt?s!.&bog?der?gro?moc?ude???t!.&bew-eht-no,naht-&esrow,retteb,?sndnyd,?d?gh?i?won??uqhv--nx??w&a!.moc?hs?l??b!.&gro?oc???c!.&gro?moc?ten?ude??cp??e&iver!.oby,?n?s??g?k!.&bme?dni?gro?moc?ten?ude?vog???m!.&ca?gro?m&oc?uesum??oc?pooc?t&en?ni??ude?vog?zib??b??o&csom?h!s??n?w??p!.&344x,de?en?mon,o&c?g??ro?snduolc,ualeb???r!.&ca?gro?lim?oc?pooc?ten?vog??n??t!.&a46oa0fz--nx?b&82wrzc--nx?ulc??emag?gro?l&im?ru,?m&oc!.reliamym,?yn,?t&en?opsgolb,?ude?v&di?og?ta0cu--nx??zibe?業商?織組?路網???z!.&ca?gro?lim?oc?vog????x&a!.&cm,eb,gg,s&e,u,?tac,ue,yx,?t??c!.&hta,ofni,vog???e&d&ef?nay??ma!nab??rof?s??ilften?jt?m!.&bog?gro?m&oc?yn,?t&en?opsgolb,?ude??g?ma2ibgy--nx??o&b!x??f?rex!ijuf???rbgn--nx?s!.&myn,vog???x&am&jt?kt??x???y&4punu--nx?7rr03--nx?a&d!i&loh?rfkcalb??ot??g?lp?p!ila??rot?ssin?wdaorb??b!.&fo?lim?m&oc!.topsgolb,?yn,?vog??ab?gur??c!.&ca?dtl?eman?gro?m&oc!.&ecrofelacs.j,topsgolb,??t??orp?s&egolke?serp??t&en?nemailrap??vog?zib??amrahp?nega??d&dadog?uts??e&kcoh?ltneb?n&dys?om?rotta??snikcm??g!.&eb,gro?m&oc?yn,?oc?ten?ude?vog??olonhcet!.oc,?rene??hpargotohp?id?k!.&gro?moc?ten?ude?vog??s??l!.&clp?d&em?i??gro?hcs?moc?ten?ude?vog??f?imaf!nacirema??l&a?il??ppus??m!.&eman?gro?lim?moc?t&en?opsgolb,?ude?vog??edaca!.laiciffo,?ra??n&a&ffit?pmoc!ylimafa???os??o&j?s??p!.&gro?lim?moc?pooc?ten?ude?vog???r&e&corg?grus?llag?viled??lewej?otcerid?tnuoc?uxul??s!.&gro?lim?moc?ten?ude?vog??pil??t&efas?i&c!.gn,?ledif?n&ifx?ummoc!.&bdnevar,murofym,???r&ahc?uces??srevinu??laer?r&ap!.oby,?eporp??uaeb??u!.&bug?gro?lim?mo&c!.topsgolb,?n,?ten?ude??b!tseb???van!dlo??xes??z&a!.&eman?gro?lim?moc?o&fni?rp??pp?t&en?ni??ude?vog?zib???b!.&az,gro?m&o&c?n,?yn,?ten?ude?vog???c!.&4e,inum.duolc.&rsu,tlf,?m&laer,urtnecatem.motsuc,?oc,topsgolb,??d!.&gro?lop?moc?ossa?t&en?ra??ude?vog???ib!.&duolcsd,e&ht-rof,mos-rof,rom-rof,?izoj,lpb,nafamm,p&i&-on,fles,?ohbew,tfym,?retteb-rof,snd&nyd,uolc,?xro,?g??k!.&gro?lim?m&oc?yn,?ten?ude?vog???m!.&ca?gro?lim?oc?ten?ude?v&da?og????n!.&asq-irom--nx?ca?gro?htlaeh?i&r&c?o&am?ām???wi!k???keeg?l&im?oohcs??myn,neg?oc!.topsgolb,?t&en?nemailrap?vog???a!niflla???rawhcs?s!.&ca?gro?oc???t!.&c&a?s??e&m?n??ibom?l&etoh?im??o&c?fni?g??ro?vt???u!.&gro?moc?oc?ten??rwon??yx!.&etisgolb,gnitfarc,otpaz,ppahf,??zub??λε?υε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур?тйас?фр?юе?յահ?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?ي&رحبلا?طسلف???ه&ارمه?يدوعسلا??وكمارا?يبظوبا?ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ວາລ?ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ン&ゾマア?ョシッァフ??业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?販通?车汽众大?逊马亚?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
+          "a&0&0trk9--nx?27qjf--nx?e9ebgn--nx?nbb0c7abgm--nx??1&2oa08--nx?apg6qpcbgm--nx?hbbgm--nx?rdceqa08--nx??2&8ugbgm--nx?eyh3la2ckx--nx?qbd9--nx??3&2wqq1--nx?60a0y8--nx??4x1d77xrck--nx?6&1f4a3abgm--nx?2yqyn--nx?3np8lv81qo3--nx?5b06t--nx?axq--nx?ec7q--nx?lbgw--nx??883xnn--nx?9d2c24--nx?a&a?it??b!.&gro?lim?moc?sr,t&en?opsgolb,?ude?vog??abila?c?ihsot?m?n??c!.&b&a?m?n??c&b?g?q??ep?fn?k&s?y??ln?no?oc,p&i-on,ohsdaerpsym,?sn?t&n?opsgolb,?un?ysrab,?i&ma?r&emarp?fa??sroc??naiva?s??d&ats?n&eit?oh??om?sa?tl??eg?f&c?ob??g!emo?naripi?oy??hskihs?i&cnal?dem?hs?k!on??sa!.snduolc,??jnin?k&aso?dov?ede?usto??l!.&c,gro?moc?ofni?r&ep?nb,?t&en?ni??ude?vog??irgnahs?le&nisiuc?rbmuder???m!.&ca?gro?oc?sserp?ten?vog??ahokoy?e00sf7vqn--nx?m??n!.&ac?cc?eman?gro?ibom?loohcs?moc?ni?o&c?fni?rp??r&d?o??s&u?w??vt?xm??av?is?olecrab?tea??p!.&bog?ca?d&em?ls??g&ni?ro??mo&c?n??oba?ten?ude??c?g7hyabgm--nx?ra!.&461e?6pi?iru?nru?rdda-ni?siri???s??q!.&eman?gro?hcs?lim?moc?t&en?opsgolb,?ude?vog???r&az?emac?f4a3abgm--nx?n!d5uhf8le58r4w--nx??u&kas?tan???s!.&bup?dem?gro?hcs?moc?ten?ude?vog??ac!.uban.iu,?iv??t&ad?elhta?led?oyot??u!.&a&cinniv?emirc?i&hzhziropaz?stynniv??s&edo?sedo??tlay?vatlop??bs?cc,d&argovorik?o!roghzu??tl,?e&hzhziropaz?nvir?t??f&i?ni,?g&l?ro??hk?i&stvinrehc?ykstynlemhk??k&c?m?s&nagul?t&enod?ul??v&iknarf-onavi?orteporp&end?ind?????l&iponret?opotsa&bes?ves??p??m&k?oc?s?yrk??n&c?d?i?osrehk?v?ylov??o&c,nvor??p&d?p,z??r&c?imotihz?k?ymotyhz??sk?t&en?l?z??ude?v:c?e&alokin?ik??i&alokym?hinrehc?krahk?vl?yk??k?l?o&g!inrehc??krahk??r?,xc,y&ikstinlemhk?mus?s&akrehc?sakrehc?tvonrehc???z&ib,u????v!aj?bb?et?iv??waniko?x&a?iacal??yogan?z&.&bew?c&a?i&n?rga???gro?l&im?oohcs??m&on?t??o&c!.topsgolb,?gn??radnorg?sin?t&en?la??ude?vog?wal??zip???b&00ave5a9iabgm--nx?1&25qhx--nx?68quv--nx?e2kc1--nx??2xtbgm--nx?3&b2kcc--nx?jca1d--nx??4&6&1rfz--nx?qif--nx??96rzc--nx??7w9u16qlj--nx?88uvor--nx?a&0dc4xbgm--nx?c?her?n?ra?t??b!.&erots?gro?moc?o&c?fni??ten?ude?v&og?t??zib??a??c&j?s??d&hesa08--nx?mi??g?l!.&gro?moc?ten?ude?vog??m??s!.&gro?moc?ten?ude?vog???tc-retarebsnegmrev--nx?u&lc!.&elej,snduolc,y&nop,srab,??smas??p!.ysrab,??wp-gnutarebsnegmrev--nx??c&1&1q54--nx?hbgw--nx??2e9c2czf--nx?4&4ub1km--nx?a1e--nx?byj9q--nx?erd5a9b1kcb--nx??8&4xx2g--nx?c9jrb2h--nx??9jr&b&2h--nx?54--nx?9s--nx??c&eg--nx?h3--nx?s2--nx???a!.&gro?lim?moc?rrd,ten?ude?vog??3a09--nx!.&ca1o--nx?gva1c--nx?h&ca1o--nx?za09--nx??ta1d--nx?ua08--nx???da??b&a?b?ci?f76a0c7ylqbgm--nx?sh??c!.&eugaelysatnaf,gnipparcs,liamwt,revres-emag,s&nduolc,otohpym,seccaptf,?xsc,?0atf7b45--nx?a1l--nx??e!.&21k?bog?dem?gro?lim?moc?nif?o&fni?rp??ten?ude?vog??beuq?n?smoc??fdh?i&l&buperananab?ohtac??n&agro?ilc?osanap??sum?tic??l!.&gro?moc?oc?ten?ude?vog?yo,?l??m!.&mt?ossa??p1akcq--nx??n!.&mon?ossa??i?p??relcel?s!.&gro?moc?ten?ude?vog??c??t!.&e&m,w,?hc,?s?w??v!.&e0,gro?lim?moc?ten?ude?v&g:.d,,og???q??wp?yn??d&2urzc--nx?3&1wrpk--nx?c&4b11--nx?9jrcpf--nx???5xq55--nx?697uto--nx?75yrpk--nx?9ctdvkce--nx?a!.mon?d?er?olnwod??b2babgm--nx?c!.vog?g9a2g2b0ae0chclc--nx??e&m!bulc??r!k??sopxe?timil?w??fc?g!.&ude?vog???h&d3tbgm--nx?p?t??i!.&ased?bew?ca?etrof,golbw,hcs?lim?o&c!.topsgolb,?g??palf,r&egolb,o??sepnop?ten?ym?zib??ar?b?ordna?p?rdam??l&iub?og?row??m!.&ed,ot,pj,t&a,opsgolb,???n&a&b?l!.citats:.&setis,ved,?,raas???ob?uf??o&of?rp??r&a&c&tiderc?yalcrab??ugnav??ef506w4b--nx?k!.&oc,ude,?jh3a1habgm--nx??of??s!.&dem?gro?moc?ofni?ten?ude?v&og?t???m!kcrem???t!.topsgolb,excwkcc--nx?l??uolc!.&a&bura-vnej.&1ti,abura.rue.1ti,?tcepsrep,xo:.&ku,nt,?,?bewilek:.sc,,citsalej.piv,drayknil,elej,gnitsohdnert.&ed,hc,?letemirp:.ku,,m&edaid,ialcer.&ac,ku,su,??n&evueluk,woru,?r&epolroov,o&pav,tnemele,??tenraxa.1-se,ululetoj,xelpciffart,??za5cbgn--nx??e&1&53wlf--nx?7a1hbbgm--nx?ta3kg--nx??2a6a1b6b1i--nx?3ma0e1cvr--nx?418txh--nx?707b0e3--nx?a!.&ca?gro?hcs?lim?oc?t&en?opsgolb,?vog??09--nx??b!.&ca?gnitsohbew,nevueluk.yxorpze,pohsdaerpsym,snoitulostsohretni.duolc,topsgolb,?ortal?ut!uoy???c&0krbd4--nx?a&lp!.oc,?ps!.&lla4sx,rebu,tsafym,?artxe??sla??i!ffo??n&a&d?iler?nif?rusni!efil?srelevart???eics!.oby,??rofria??d!.&1sndnyd,42pi-nyd,7erauqs,amil4,b&ow-nrefeilgitsng--nx,rb-ni,vz-nelletsebgitsng--nx,?decalpb,e&daregtmueart,mohsnd,nihcamyek,?hcierebsnoissuksid,keegnietsi,lsd-ni,moc,n&-i-g-o-l,aw-ym,e&lletsebgitsnüg,sgnutiel,?i&emtsi,lreb-n&i,yd,??oitatsksid-ygolonys,pv&-n&i,yd,?nyd,?refeilgitsnüg,?orp-ytinummoc,p&h21,iog:ol,,ohsdaerpsym,?r&e&ntrapdeeps.remotsuc,su&-lautriv,lautriv,?t&adpusnd,tub-ni,uor-ym,?vres&-e&bucl,mohym,?bew-emoh:.nyd,,luhcs,??ogiv-&niem,ym,??s&d-&onys,ygolonys,?nd&-&dd,nufiat,sehcsimanyd,tenretni,yard,?isoc.nyd,ps,yard,?oper-&nvs,tig,?sndd:.&nyd,sndnyd,?,?topsgolb,vresi-&niem,tset,?xi2,y&awetag-&llawerif,ym,?srab,tic-amil,?zten&mitbel,sadtretteuf,??a&lg?rt!.oby,??i&sdoow?ug??nil?on--nx??e!.&bil?dem?eif?gro?irp?kiir?moc!.topsgolb,?pia?ude?vog??ei?ffoc?gg?r&f?ged???f&a&c?s??il??g!.&gro?lim?moc?t&en?vp??ude?vog??a&f?gtrom?p!.&3xlh,kselp,sndp,tengam,xlh,ycvrp,??rots?yov??elloc?na&hcxe?ro??roeg?ug??i!.&pohsdaerpsym,topsgolb,vog??tilop?v&bba?om???j!.&fo,gro?oc?ten???k!.&c&a?s??e&m?n??ibom?o&c!.topsgolb,?fni?g??ro??i&b?l?n???l&a&dmrif?s!.rof,rof???b&a?i&b?dua???c&aro?ric??dnik?g!oog??i&bom?ms??l&asal?erauqa??ppa?uhcs?yts!efil???m!.&4&32i,pct,?66c,ailisarb,b&dnevar,g-raegelif,?ca?duolcsd,e&d-raegelif,i&-raegelif,lpad:.tsohlacol,,?pcm,?g&ro?s-raegelif,?hctilg,k&catsegde,uoc,?noitatsksid,o&bmoy,c!ku,?t&nigol,poh,??p&ion,j-raegelif,ohbew,?qbw,r&aegelif,idcm,ofsnd,?s&dym,ndd,ti!bt,?umhol,?t&en?s&acdnuos,ohon,??u&a-raegelif,de?tcn,?v&irp?og??y&golonys,olpedew,srab,??a&g?n!.&reh.togrof,sih.togrof,???em?i&rp?twohs??orhc?w??n!goloc?i&lno!.&egats-oree,oree,ysrab,??w??o!.&derno:.gnigats,,ecivres,knilemoh,r&ednu,of,??hp?latipac?ts&der?e&gdirb?rif???z!.&66duolc,amil,sh,???ruoblem??om?p!.&bog?gro?lim?mo&c?n??t&en?opsgolb,?ude??irg?yks??r!.&mo&c?n??ossa?topsgolb,?a&c!htlaeh??pmoc?wtfos??bc?eh?if?ots!.&e&rawpohs,saberots,?yflles,??taeht?u&ces?sni?t&inruf?necca??za???s!.&a!bap.us,?b!ibnal?rofmok??c!a??d!b?n&arb?ubroflanummok???e?f!noc,?g!ro??h!f??i!trap??k!shf??l?m!oc,t??n!mygskurbrutan??o?p!ohsdaerpsym,p??r!owebdluocti,?s!serp?yspoi,?t!opsgolb,?u?vhf?w?x!uvmok??y?z??a&c?el?hc??i&er?urc??nesemoh?roh?uoh??t&a&d?ts&e!laer??lla???is!.&areduolc,e&lej,nilnigol,r&etnim,ocevon,?winmo,?k&rowtenoilof,wnf,?laicosnepo,n&eyb,oyc,?spvtsaf,thrs,xulel,ysrab,?bew??ov?ra?t&ioled?ol??utitsni??u&lb?qi&nilc?tuob???v!.&21e?b&ew?og??ce&r?t??erots?gro?lim?m&oc?rif??o&c?fni??stra?t&en?ni??ude?vog??as?e3gerb2h--nx?i&l!.xlh,?rd?ssergorp??ol??w&kct--nx?r??xul?y!.&gro?lim?moc?ten?ude?vog????f&0f3rkcg--nx?198xim--nx?280xim--nx?7vqn--nx?a!.&gro?moc?ten?ude?vog???b!.vog?wa9bgm--nx??c!.topsgolb,a1p--nx!.&a14--nx,b8lea1j--nx,c&avc0aaa08--nx,ma09--nx,?f&a1a09--nx,ea1j--nx,?gva1c--nx,nha1h--nx,pda1j--nx,zila1h--nx,??ns??ea1j--nx?fo?g?iam?l&a1d--nx?og??n!.&bew?cer?erots?m&oc?rif??ofni?re&hto?p??stra?ten???orp?p!.&gro?moc?ude???rus?t!w??vd7ckaabgm--nx?w??g&2&4wq55--nx?8zrf6--nx??3&44sd3--nx?91w6j--nx!.&a5wqmg--nx?d&22svcw--nx?5xq55--nx??gla0do--nx?m1qtxm--nx?vta0cu--nx????455ses--nx?5mzt5--nx?69vqhr--nx?7&8a4d5a4prebgm--nx?rb2c--nx??a!.&gro?mo&c?n??oc?ten??vd??b!.&0?1?2?3?4?5?6?7?8?9?a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t!opsgolb,?u?v?w?x?y!srab,?z???c!b?za9a0cbgm--nx??e!.&eman?gro?ics?lim?moc!.topsgolb,?nue?ten?ude?vog??a??g!.&ayc,gro?lenap:.nomead,,oc?saak,ten???i&a?v??k!.&g&olb,ro??ku,lim?moc?oi,pj,su,ten?ude?v&og?t,???m!.&drp?gro?lim?m&o&c?n??t??oc?ude?vog??pk??n!.&dtl,eman?gro?hcs?i!bom??l&im?oc,?m&oc!.topsgolb,?rif,?neg,ogn,ten?ude?vog??aw?i!b!mulp??car?d&art?dew??h&sif?tolc??k&iv?oo&b?c???ls?n&aelc?iart??p!pohs??re&enigne?tac??t&ad?ekram!.&htiw,morf,??hgil?lusnoc?neg?ov?soh!.tfarcnepo,??vi&g?l???o!s??u&rehcisrev?smas?tarebsnegömrev???o&d?lb?og!.&duolc,etalsnart,???r&2n084qlj--nx?ebmoolb?o!.&77ndc.c:sr,,a&remacytirucesym,t&neimip,sivretla,?z,?bew-llams,d&ab-yrev-si,e&sufnocsim,vas-si,?nuof-si,oog-yrev-si,uolc&arfniarodef,mw,??e&a,cin-yrev-si,grof&loot,peh,?l&as-4-ffuts,poeparodef,?m&-morf,agevres,ohruoyslles,?n&ozdop,uma.elet,?r&ehwongniogyldlob,iwym,uces-77ndc.nigiro.lss,?t&adidnac-a-si,is&-ybboh,golb,???fehc-a-si,golbymdaer,k&eeg-a&-si,si,?h,nut,?l&i&amwt,ve-yrev-si,?lawerif&-ym,ym,?sd-ni,?m&acssecca,edom-elbac,?n&af&blm,cfu,egelloc,lfn,s&citlec-a-si,niurb-a-si,tap-a-si,?xos-a-si,?ibptth,o&itatsksid,rviop,?pv-ni,?o&jodsnd,tp&az,oh,??p&i&-on,fles,?o&hbew,tksedeerf,?tf&e&moh,vres,?ym,??r&e&gatop,ppepteews,su-xunil-a-si,?gmtrec,vdmac,?s&a&ila&nyd,snd,?nymsd,?b&alfmw,bevres,?dylimaf,eirfotatophcuoc,j,koob-daer,ltbup,nd&-won,deerf,emoh,golb,kcud,mood,nyd:.&emoh,og,?,ps,rvd,tog,uolc,?s&a-skcik,ndd,?tnemhcattaomb,u,?t&ce&jorparodef.&duolc,gts.so.ppa,so.ppa,?riderbew,?e&ews-yrev-si,nretni&ehtfodne,fodne,??hgink-a-si,igude,oi-allizom,s&ixetn&od,seod,?o&h-emag,l-si,?rifyam,??ue:.&a&-q,c,?cm,dc,e&b,d,e,i,m,s,?g&b,n,?hc,i&f,s,?k&d,m,s,u,?l&a,i,n,p,?n&c,i,?o&n,r,ssa,?pj,r&f,g,h,k,t,?s&e,i:rap,,u,?t&a,en,i,l,m,ni,p,?u&a,de,h,l,r,?vl,y&c,m,?z&c,n,??,vresnyd,x&inuemoh,unilemoh,?y&limafxut,srab,???ub&mah?oj???s!.&delacsne,gro?moc?rep?t&en?opsgolb,?ude?vog??gb639j43us5--nx??t?u!.&c&a?s??en?gro?moc?o&c?g??ro?topsgolb,??v!.ta,a1c--nx??wsa08--nx??h&0ee5a3ld2ckx--nx?4wc3o--nx!.&a&2xyc3o--nx?3j0hc3m--nx?ve4b3c0oc21--nx??id1kzuc3h--nx?l8bxi8ifc21--nx?rb0ef1c21--nx???8&8yvfe--nx?a7maabgm--nx??b!.&gro?moc?ten?ude?vog??mg??c!.&7erauqs,amil4,duolc-drayknil,gniksnd,p&h21,ohsdaerpsym,?sndtog,topsgolb,wolf.e&a.1pla,nigneppa,?xi2,ytic-amil,?aoc?et?ir!euz??r&aes!errecnac??uhc??sob?taw!s???d0sbgp--nx?f&2lpbgm--nx?k??g!.&gro?lim?moc?ude?vog???m!a1j--nx??ocir?p!.&gro?i?lim?moc?ogn?ten?ude?vog???s!.&g&nabhsah,ro??l&im?xv,?m&oc?roftalp.&cb,su,tne,ue,??pib,ten?vog?won,yolpedew,?a&c?nom??i&d?f?ri???t!.&ca?enilno,im?ni?o&c?g??pohs,ro?ten??iaf!.oby,?laeh!.arh,?orxer?ra&ba?e???vo!.lopdren,?zb??i&3tupk--nx?7a0oi--nx?a!.&ffo?gro?moc?ten?uwu,?1p--nx?bud?dnuyh?tnihc??b!.&gro?moc?oc?ro?ude??ahduba?o!m!.&duolcsd,ysrab,???s??c!.&ayb-tropora--nx?ca?d&e?m??esserp?gro?ln,moc?nif,o&c?g?ssa??ro?t&en?ni?roporéa??ude?vuog??cug?t??d&dk?ua??e&bhf--nx?piat??f!.&aw5-nenikkh--nx,dnala?iki,mroftalpduolc.if,nenikkäh,pohsdaerpsym,retnecatad.&omed,saap,?topsgolb,yd,?onas??g!.&d&om?tl??gro?moc?ude?vog???h&c&atih?ra??s&abodoy?ibustim???juohs?k!.&gro?moc?ofni?ten?ude?vog?zib??b4gc--nx?iw?nisleh?s?uzus??l!.&aac,topsgolb,?drahcir?iamsi??maim?n!.&b&ew?og??ca?gro?lim?mo&c?n??ni?o&c?fni??pp?t&en?ni??ude?zib??airpic?i&hgrobmal?m??re??om?rarref?s!.&egaptig,ppatig,topsgolb,?ed??t&aresam?i&c?nifni??rahb?tagub??ut?v!.&21k?gro?moc?oc?ten???wik?xa&rp?t??yf??j&6pqgza9iabgm--nx?8da1tabbgl--nx?b!.&ossa?topsgolb,uaerrab?vuog???d?f!.&ca?eman?gro?lim?moc?o&fni?rp??ten?vog?zib???nj?s?t!.&bew?c&a?in??eman?gro?lim?moc?o&c?g??t&en?ni?set??ude?vog?zib???yqx94qit--nx??k&8uxp3--nx?924tcf--nx?arfel?c&a&bdeef?lb??ebdnul?ilc?reme?ud??d!.&erots,ger,mrif,oc,pohsdaerpsym,topsgolb,zib,?t??e&es?samet??h!.&a&4ya0cu--nx?5wqmg--nx??b3qa0do--nx?cni,d&2&2svcw--nx?3rvcl--nx??5xq55--nx?tl,?g&a0nt--nx?la0do--nx?ro??i&050qmg--nx?7a0oi--nx?xa0km--nx??m&1qtxm--nx?oc??npqic--nx?saaces,t&en?opsgolb,?ude?v&di?og?ta0cu--nx??xva0fz--nx?人&个?個?箇??司公?府政?絡&網?网??織&組?组??织&組?组??络&網?网??育&敎?教???n??i&tsob?vdnas??l!.&bew?c&a?os??dtl?gro?hcs?letoh?moc?nssa?ogn?prg?t&en?ni??ude?vog??at?cd?is??m!.&eman?fni?gro?moc?t&en?opsgolb,?ude?vog???n&ab!cfdh?etats?mmoc?t&en?fos??u??i!l!.&noyc,pepym,??p???oob?p!.&b&ew?og??gro?kog?m&af?oc??nog?ofni?pog?sog?ten?ude?vog?zib???row!.&morf,ot,?ten!.&htumiza,nolt,o&c,vra,??doof???s!.topsgolb,?t?u!.&c&a?lp??d&om?tl??e&cilop?m??gro!.&gul:g,,sgul,??nnoc,o&c!.&bunsorter.tsuc,e&lddiwg,n&ilnoysrab,ozgniebllew,??krametyb.&hd,mv,?omida,p&i-on,ohsdaerpsym,?t&fihsreyal.j,opsgolb,?vres-hn,ysrab,??rpoc,?psoh,shn?t&en?nmyp,?vog!.eci&ffoemoh,vres,??ysrab,???l&04sr4w--nx?a!.&gro?lim?moc?t&en?opsgolb,?ude?vog??bolg?c?ed?g!el??i&c&nanif!.oc,lpl??os??romem?tnedurp??n&if?oitanretni??t&i&gid!.sppaduolc:.nodnol,,?p&ac?soh???ned?ot??utum!nretsewhtron???c!.&bog?lim?oc?topsgolb,vog???dil?e&datic?n&ahc?nahc!gnikooc?levart?rehtaew???t!ria?tam??vart??f&8f&pbgo--nx?tbgm--nx??a?n??g!.&gro?moc?oc?ten?ude?xx,zib,??h&d?op??i!.&21k?ca?fdi?gro?inum?oc!.&egapvar,topsgolb,??ten?vog??a&f?m&e?g?toh???m?r?xil??l&a&b&esab?t&eksab!.&sua,zn,??oof???c?mt??e&d?hs??ihmailliw?j??m!.&esserp?gro?moc?ten?ude?v&og?uog????n!.&n&iemodleeutriv,o&med,rtsic,??oc,pohsdaerpsym,retsulc-gnitsoh,topsgolb,wsma,yalphk,?o??o&a?btuf?l!.gmo,?o&c!.&ed,rotnemele,??hcs??rit?u??p!.&a&cin&diws?gel??d&g,ortso?urawon??i&dem?mraw?nydg,?k&elo&guld?rtso??slopolam?tsu?ytsyrut??l&ip?o&kzs?w&-awolats?oksnok????n&erapohs,img?zcel,?rog&-ai&bab?nelej??j?z??syn?tsaim?w&a&l&eib?i?o??zsraw??o&namil?tainop,??z&eiwolaib?mol???c&e&iw&alselob?o&nsos?rtso???le&im?zrogz???orw,p??d&em,ia?ragrats?uolc&inu,sds,??e&c&i&lrog?w&ilg,o&hc&arats?orp??klop?tak????yzreibok??i&csjuoniws?ksromop?saldop??l&ahdop?opo??napokaz,tatselaer?z&romop?swozam???g&alble?ezrbo&lok?nrat??ro??hcyzrblaw?i&csomohcurein?grat?klawus??k&e&rut?walcolw??in&byr?diws,sark,?le?o&nas?tsylaib??rob&el?lam??s&als?jazel?nadg,puls?rowezrp???l&colw?e&r?vart??i&am?m???m&o&c?dar?n?tyb??s&g?iruot??t!a???n&a&gaz?nzop,?i&bul?cezczs?lbul,molow?nok?zd&eb?obeiws???uleiw?y&tzslo?z&rtek?seic????o&c,fni?k&celo?zdolk??lkan?n&leim?pek?t&uk?yzczs??z&copo?eing?rowaj???rga?tua?w&ejarg?ogarm???p&e&eb,lks??klwwortso?ohs!daerpsym,??romophcaz?sos?t&aiwop?en?opos,ra,sezc??ude?v&irp?og!.&a&p?s!w???bni&p?w??ci?dtiw?essp?fiw?g&imu?u??hiiw?m&igu?rio?u!o???nds?o&ks?p!pu??s?wtsorats??p&a?sp!mk?pk?wk??u&m?p??wk?z??r&ksw?s??s&i?oiw?u?zu??talusnok?w&gzr?i&p?rg?w??m?opu?u!imzw???zouw????w&a&l&corw?sizdow??w??o&golg?k&ark,ul?zsurp??r&az?gew??t&rabul,sugua??z&coks?sezr????xes?y&buzsak?d&azczseib?ikseb??hcyt?n&jes?lod-zreimizak??pal?r&ogt?uzam??walup?zutrak??z&am-awar?c&aprak?iwol?zsogdyb??dalezc?ib?s&i&lak?p??uklo????l??r&as?f?s??s!.&gro?moc?ten?ude?vog???t!.vog??ubnatsi?x3b689qq6--nx?yc5rb54--nx??m&00tsb3--nx?1qtxm--nx?981rvj--nx?a!.&aayn,enummoc?gro?moc?o&c?idar,ken,?t&en?opsgolb,??c!bew??dretsma?e&rts?t!.&citsalej,esruocsid,???fma?xq--nx??b!.&gro?moc?ten?ude?vog??i??c!.&moc?oc?ten?vog???d!.&gro?moc?ten?ude?vog???f!.&gro?moc?oidar,ten?ude??i??g!vu96d8syzf--nx??h?i!.&ca?gro?moc?o&c!.&clp?dtl???r,?t&en?t??vt??k?rbg4--nx??k!.&drp?e&rianiretev?sserp??gro?lim?m&o&c?n??t??nicedem?ossa?pooc?s&eriaton?neicamrahp?sa??ude?v&og?uog????l&if?ohkcots??o!.&dem?gro?m&oc?uesum??o&c?rp??ten?ude?vog??b?c!.&2aq,3pmevres,5sndd,a&c&-morf,ir&bafno,fa,??g&-morf,oy-sehcaet,?i-morf,m&-morf,all&-a-si,amai,??p&-morf,c-a-si,?r&emacytirucesym,odih,?s,tadtsudgniht,v-morf,w-morf,z,?b&dnevarym,ew&-sndnyd,draiw.segap,ottad,?g,ildts.ipa,?c&amytirucesemoh,d-morf,esyrcs,itsalej.omed,n&-morf,vym,?p&kroweht,ytirucesemoh,?q,rievres,s-morf,?d&aerotffuts,e&calpb,ifitrec-&si,ton-si,?llortnocduolc,rewopenignepw:.sj,,tsohecapsppa,?i&-morf,rgevissam.saap,?m-morf,n&-morf,abeht-htiw-si,?s-morf,uolc&-noitatsyalp,hr,iafaw.&d&ej,yr,?nol,?meaeboda,panqym:-&ahpla,ved,?,smetsystuo,tekcilc,ved&j,pw,??vreser,wetomer,?e&butuoyhtiw,ciffo-sndnyd,d:-morf,o&celgoog,n&il.srebmem,neve.&1-&su,ue,?2-&su,ue,?3-&su,ue,?4-&su,ue,????,erf&-sndnyd,sndd,?filflahevres,gnahcxeevres,i&hcet-a-si,p-sekil,?k&auqevres,irtsretnuocevres,?l&bitpa-no,googhtiw,?m&agevres,ina-otni-si,oh-&sndnyd,ta-sndnyd,??n&-morf,ilno&-evreser,ysrab,?og-si,?r&alfduolcyrt,ehwynanohtyp:.ue,,ihcec,?srun-a-si,t&i&nuarepo,s&-ybboh,aloy,tipohs,xiw,??omer-sndnyd,upmocsma,ysgolb,?v&als-elcibuc-a-si,i&lsndd,tavresnoc-a-si,??z&amkcar,eelg,iig,??fehc-a-si,g&ni&gats-&raeghtua,swennwot,?ksndd,robsikrow,?o&fgp,lb&-sndnyd,pawodni,sihtsetirw,???h&n-morf,o-morf,?i&fiwehtno,h-morf,kiw-sndnyd,m-morf,pdetsoh,r-morf,w-morf,z&ihcppa,nilppa,??jn-morf,k&a&-morf,erfocsic,?cils-si,eeg&-a&-si,si,?sndd,?h,latsnaebcitsale:.&1-&htuos-pa,lartnec-&ac,ue,?ts&ae&-&as,su,?ht&ron-pa,uos-pa,??ew-&su,ue,vog-su,???2-ts&ae&-su,ht&ron-pa,uos-pa,??ew-&su,ue,??3-ts&aehtron-pa,ew-ue,??,o-morf,r&adhtiwtliub,ow&-&sndnyd,ta-sndnyd,?ten-orehkcats,??u,?l&a&-morf,colottad,rebil-a-si,?f-morf,i&-morf,am&-sndnyd,detsohpw,??l&ecelffaw,uf-ytnuob:.a&hpla,teb,?,?ppmswa,ru-&elpmis,taen,?ssukoreh,xegap,?m&n-morf,pml.ppa,rofererac-htlaeh,sacrasevres,uirarret-yltsaf,?n&a&cilbuper-a-si,f&-sllub-a-si,racsan-a-si,?i&cisum-a-si,ratrebil-a-si,??c,dc&hsums,umpw,xirtrepmi,?eerg-a-si,i-morf,m-morf,o&ehtnaptog,isam-al-a-tse,r&italik,tap-el-tse,?s&iam-al-a-tse,replausunu,??pj,t-morf,?o&bordym,c,hce-namtsop,jodsnd,m&-morf,ed-baltlow,?n:iloxip,,ttadym,?p&2pevres,aelutym,i&-sndnyd,fles,ogol,ruoy&esol,hctid,?ym&eerf,teg,??ohsdaerpsym,pa&-rettalp,anis:piv,,esaberif,k1,lortnocduolc,oifilauq,r&aegyks,oetem:.ue,,?tnorfegap,ukoreh,?t&fevres,thevres,??r&a:-morf,tskcor-a-si,,b,e&d&iv&erp-yb-detsoh.saap,orpnwo,?ner&.ppa,no,??e&bevres,nigne-na-si,?ggolb&-a-si,ndi,?h&caet-a-si,pargotohp-a-si,?krow-drah-a-si,n&gised-a-si,ia&rtlanosrep-a-si,tretne-na-si,??p&acsdnal-a-si,eekkoob-a-si,?retac-a-si,subq,tn&ecysrab,iap-a-si,uh-a-si,?vres&-&ki.&cpj-rev-duolcj,duolcj,?s&ndnyd,pvtsaf,??inim,nmad,sak,?y&alp-a-si,wal-a-si,?zilibomdeepsegap,?g,ituob,k,mgrp.nex,o&-morf,sivdalaicnanif-a-si,t&areleccalabolgswa,c&a-na-si,od-a-si,?susaym,??p-morf,u&as-o-nyd,e&tsoh.&duolc-gar,hc-duolc-gar,?ugolb-nom-tse,?omuhevres,??s&a&apod,ila&nyd,snd,?nymsd,vnacremarf,?bbevres,ci&p&-sndnyd,evres,?tcatytiruces,?dylimaf,e&cived-anelab,itilitu3,lahw-eht-sevas,mag-otni-si,t&isro,yskciuq,??i&ht2tniop,pa&elgoog,tneltneg,??jfac,k&-morf,aerf-ten,colb&egrof,pohsym,??m&-morf,cxolb,?n&d&-pmet,dyard,golb,mood,tog,?kselp,nyd,ootrac-otni-si,?o&-xobeerf,xobeerf,?ppa&raeghtua,tneg,?r&ac-otni-si,e&ntrap-paelut,tsohmaerd,??s&e&l-rof-slles,rtca-na-si,?ibodym,?tsaeb-cihtym.&a&llicno,zno,?ilay,lacarac,re&gitnef,motsuc,?sv,toleco,x:n&ihps,yl,?,?u,wanozama.&1-&htuos-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??la&nretxe-3s,rtnec-&ac&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????ts&ae&-&as&-&3s,etisbew-3s,?.kcatslaud.3s,?su:-etisbew-3s,.kcatslaud.3s,,?ht&ron-pa&-&3s,etisbew-3s,?.kcatslaud.3s,?uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-&3s,etisbew-3s,?.kcatslaud.3s,?vog-su-&3s,spif-3s,????2-ts&ae&-su&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ht&ron-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????3&-tsew-ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,??s,???t&arcomed-a-si,c&-morf,etedatad.&ecnatsni,omed,??eel&-si,rebu-si,?hgilfhtiwletoh,m-morf,n&atnuocca-na-si,e&duts-a-si,r-ot-ecaps,tnocresu&buhtig,e&capsppa,lbavresbo.citats,?pl,???ops&edoc,golb,ppa,?s&i&hcrana-&a-si,na-si,?laicos-a-si,pareht-a-si,tra-na-si,xetn&od,seod,??oh&piym,sfn,??u&-morf,nyekcoh-asi,?v-morf,?u&-rof-slles,4,e,h,oynahtretramssi,r:ug-a-si,,?v&n-morf,w-morf,?w&o&lpwons-yrt,zok,?ww100,?x&bsbf.sppa,em,i&nuemoh,rtrepmi,?obaniateb,t-morf,unilemoh,?y&a&bnx:.&2u,lacol-2u,?,l&erottad,pezam,?wetag-llawerif,?dnacsekil,fipohsym,k&-morf,niksisnd,?rotceridevitcaym,u:goo,,w-morf,x&alagkeeg,orphsilbup,???inu??m!.&dna,rof,??or?tsla??p!.nwo,?raf!.jrots,etats??s?t!.&gro?lim?mo&c?n??oc?ten?ude?vog???u&esum!.&a&92chg-seacinumocelet-e-soierroc--nx?atnav?c&i&aduj?rfatsae??rollam??d&anac?enomaledasac?irolf??e&raaihpledalihp?srednu??g&hannavas?oonattahc??hamo?i&auhsu?bmuloc!hsitirb??dem?groeg?hpledalihp?l&artsua?etalif??n&igriv?rofilac??ssur?tsonod??ksa&la?rben??l&lojal?q-snl--nx?uossim!trof???m&a&bala?nap??enic?o&m?r???n&a&cirema?idni??edasap?ilorachtuos?olecrab??r&abrabatnas?ezzivs??su?t&nalta?osennim??zalp??c&dnotgnihsaw?ebeuq?i&depolcycne?ficap?hpargonaeco?lbup?sum?t&carporihc?lec?naltadim??vu??yn??d&a&dhgab?etsmraf?m?orliar??i&rdam?ulegnedleeb??leif?n&a!l&gne?nif?ragyduj?t&ocs?rop??yram???u&brofsdgybmeh?osdnaegami???r&augria?ofxo???e&c&a&l&ap?phtrib??ps??n&a&lubma?tsiser??e&fedlatsaoc?gilletni?ics!foyrotsih????pein?rof??d&nukneklov?revasem??e&rt?tsurt??f&atnas?ildliw??g&a&lliv?tireh!lanoitan???dirbmac?rog??i&cnum?nollaw??koorbrehs?l&ab?bib?cycrotom?i&ssim?txet??oks?tsac??m&affollah?it!iram??utsoc??n&golos?ilno?recul??r&a&uqs?waled!foetats???i&hs&acnal?kroy?pmahwen??otsih??omitlab?ut&an?cetihcra?inruf?luc!irga?su???vuol??s&abatad?iacnarf?sius?uoh!lum???t&a&locohc?rak?ts!e!yrtnuoc!su?????imesoy?tevroc??u&qihpargonaeco?velleb??vit&caretni?omotua???f&iuj?ohgrub??g&n&i&dliub?ginerevmuesum?kiv?lahw?nim?peekemit?vil??ulmmastsnuk??orf?r&ebnrats?u&b&ierf?le?m&ah?uan??ram?s&mailliw!lainoloc??naitsirhc?retepts??zlas??ob&irf?mexul?????h&atu?c&raeser?sirotsih?uot??g&ea1h--nx?rubsttip??si&tirb?wej??t&laeh?ro&n?wtrof??uo&mnom?y????i&d6glbhbd9--nx?iawah?k&nisleh?s??lad!rodavlas??sissa?tannicnic??k&c&nivleeg?olc!-dna-hctaw?dnahctaw???fj?inebis?l&is?ofron??na&rfenna?t??oorbnarc?r&am&ned?reiets??oy!wen????l&a&ci&dem?golo&eahcra?meg?oz??natob?rotsih??ertnom?iromem?noita&cude?n??oc?rutluc?trop?utriv?van??e&nurb?s&ab?surb??utriv??i&artnogero?sarb??l&a&besab?hsnoegrus??e&hs?rdnevle??i&b?m!dniw????o&bup?ohcs?tsirb???m&a&dretsma?ets?h&netlehc?rud???ct?elas!urej??l&if?ohkcots?u??raf?silanruoj?u&esumyrotsihlarutan?ira&tenalp?uqa??terobra???n&a&c!irema!evitan???gihcim?i&dni?tpyge??mfoelsi?wehctaksas??e&d&alokohcs?ews?rag!cinatob?lacinatob?s&nerdlihc?u????gahnepoc?hcneum?laftsew?ppahcsnetewruutan?r&dlihc?ednaalv?hu!dnutamieh???sseig??gised!dn&atra?utsnuk???h&ab!nesie??ojts??i&lreb?tsua??l&eok?ocnil??n&ob?urbneohcs??o&dnol?gero?i&s&iv&dnadnuos?elet??nam??t&a&c&inummoc?ude!tra???dnuof?erc?i&cossa?va??kinummokelet?nissassa?r&belectsevrah?oproc?tsulli??silivic?t&nalp?s??vres&erp?noclatnemnorivne??zilivic??c&elloc?if-ecneics??ibihxe???ri?s&dnah?imaj?reffej?sral??t&erbepac?nilc?sob???r&e&b?dom?tsew?uab?zul??obredap??vahnebeok?wot??o&2a6v-seacinumoc--nx?ablib?c&edtra?ixemwen?sicnarfnas??elap?g&a&cihc?to??eidnas??i&cadnuf?diserp?ratno??llecitnom?mitiram?nirot?r&htna?ienajedoir???pohskrow?qari?r&aw!dloc?livic??dd?e&b&ma?yc??irrac?llimsiwel?naksiznarf?papswen?t&aeht?exe?nec!ecneics?larutluc?muesum?tra??s&ehc&nam?or??neum??upmoc???ia!nepo??obal?u&asonid?obal?takirak???s&a&l&g?l&ad?eh???xet??di&k?pardnarg??e&cneics!larutan??dnal?hcsi&deuj?rotsih!nizidem?rutan??selhcs??itinamuh?l&aw?egnasol?l&e&rutansecneics?xurb??iasrev???r&e&em?ugif??tsac??suohcirotsih?u&en?q&adac?itna!nacirema?su????õçacinumoc!elet-e-soierroc???gnirpsmlap?htab?i&lopanaidni?rap?uoltnias?xa??l&essurb?lod??mraeriflanoitan?n&a&blats?l??erdlihc?oi&snam?tacinummoc!elet-dna-stsop???äl??re&dnalf?lttes?mraf?nim?tnececneics??s&alg?erp??t&farc!dnastra??nalp?olip?ra!e&nif?vitaroced!su???su?xuaeb???u&b!muloc??cric???t&agilltrop?cejorp?dats?e&esum?kramnaidni??iorted?ne&m&elttes?norivne?piuqemraf??vnoc??oped?r&a!drib?enif?gttuts?hsiwej?kcor?n&acirema?ootrac??tamsa?yraropmetnoc??op&aes?snart?wen??ufknarf??s&a&cdaorb?octsae??ewhtuos?ilayol?nuk?r&ohnemled?uhlyram??urt???u&a&bgreb?etalpodaroloc??rmyc??w&ocsom?rn??x&esse?ineohp?nam?tas??y&a&bekaepasehc?w&etag?liar???camrahp?doc?e&hsub?l&ekreb?l&av!eniwydnarb??ort???n&dys?om??rrus?s&nreug?rejwen???golo&e&ahcra?g??motne?nh&cet?te??oz?po&rhtna?t??roh??hpargotohp?l&etalihp?imaf??m&edaca?onortsa??n&atob?yn??ps?r&a&ropmetnoc?tilim??e&diorbme?llag!tra??vocsid??lewej?nosameerf?otsih!dnaecneics?ecneics?gnivil!su??la&col?rutan??retupmoc?su??tsudnidnaecneics??spelipe?t&eicos!lacirotsih??i&nummoc?srevinu??nuoc???z&arg?iewhcs?nil?ojadab?urcatnas??моки?םילשורי???rof??z!.&ca?gro?hcs?lim?moc?o&c?fni??ten?ude?vog?zib????n&315rmi--nx?a&brud?cilbuper?f?grompj?hkaga?idraug?m?ol?ssin?u&hix?qna??varac?yalo??b!.&gro?moc?oc,ten?ude?vog??c??c!.&ah?bh?c&a?s??d&5xq55--nx?g?s?uolctnatsni,?eh?g&la0do--nx?ro??h&a?q?s??i&7a0oi--nx?h??j&b?f?t?x?z??kh?l&h?im?j??m&n?oc!.swanozama.&1-htron-nc.3s,be.1-&htron-nc,tsewhtron-nc,????n&h?l?s?y??om?qc?s&g?j??ten?ude?vog?wt?x&g?j?n?s??z&g?x??司公?絡網?络网??b??d&g!.ypnc,?ka??e&drag?erg?fuak?gawsklov?hctik?i&libommi?w??m!.r&iaper,of,??po?r!ednaalv??sier?ves??g!.&ca?gro?moc?ten?ude?vog??is&ed!.ssb,?irev???h!.&bog?cc,gro?lim?moc?ten?ude???i!.&bew,c&a?in??dni?esabapus,gro?lim?mrif?neg?oc?s&er?nduolc,?t&en?opsgolb,?ude?vog?ysrab,?elknivlac?griv?ks?lreb?p?v?w!.taht,?x??k!.&gro?ten?ude?vog???l&eok?ocnil??m!.&cyn,gro?ude?vog???o&dnol!.&fo,ni,??i&hsaf!.fo,?n&o?utiderc??siv!orue??t&a&cude!.oc,?dnuof?tsyalp??c&etorp?u&a?rtsnoc?????kin?las?mrom?nac?p&q?uoc??s&iam?nhojcs?pe?scire??t&ron?sob??zama??p!.&gro?oc?ten?ude?vog??k??r&e&c?yab??op!.eidni,??s!.&gro?moc?osrep?t&opsgolb,ra??ude?v&inu?uog????t!.&d&ni?uolcegnaro,?esnefed?gro?ltni?m&oc!nim??siruot??n&erut?if??o&fni?srep??sn&e?r??t&an?en!irga?ude??rnr??unr?vog??m??u&f?r!.&bdnevar,lper,sh,tnempoleved,??stad?xamay?y??v!.&ca?eman?gro?htlaeh?moc?o&fni?rp??t&en?ni?opsgolb,?ude?vog?zib???wo&rc?t!epac????o&76i4orfy--nx?a!.&bp?de?go?oc?ti?vg??boat??b!.&a&ci&sum?tilop??i&c&arcomed?neic??golo&ce?ncet??m&edaca?onoce??rt&ap?sudni??vilob??n&egidni?icidem??serpme?tsiver?vitarepooc??b&ew?og??dulas?e&rbmon?tr&a?op&ed?snart????g&olb?ro??ikiw?l&a&noi&canirulp?seforp??rutan??im??moc?o&fni?lbeup?rga?tneimivom??saiciton?t&askt?en?ni??ude?vt??h?iew?olg??c!.&bew?cer?dr&c,rac,?esabapus,gro?ipym,l&im?per:.di,,?m&o&c!.topsgolb,?n??rif?udon,?ofni?s&egap&dael,l,?tra??t&4n,en?ni??ude?vog??a?e?in?mara?s&edarb?ic???d!.&b&ew?og??dls?gro?lim?moc?t&en?ra??ude?vog??agoba?if?zd7acbgm--nx??e&c?d&iv?or??morafla??f!ni!.&e&g&delwonk-fo-l&errab,lerrab,?ellocevoli,?ht-skorg,rom-rof-ereh,tadpusn:d,,?llatiswonk,macrvd,ofni-v,p&i&-on,fles,?ohbew,?ruo-rof,s&iht-skorg,nd&-cimanyd,nyd,uolc,??tsrifyam,ysrab,zmurof,???g&el?n!am?ib???hwsohw?i!.&35nyd,8302,a&minifed,tad-b,?b&altig,uhtig,?c&inone:.remotsuc,,zh,?d&in,u&olc&iaznab.ppa,ropav,?rd,??e&c&apsinu.1rf-duolc,ivedniser,?donppad.sndnyd,egipa,lej,nilnigol,sufxob,t&i&beulb,snoehtnap,?newtu,ybeeb.saap,??gni&gatsniser.secived,tsohytsoh,?k&coregrof.di,orgn,ramytefasresworb,?m&oc?udon,?n&mtsp:.kcom,,yded,?ot&oq,pyrctfihs,?p&opilol,pa&-arusah,e&nalpkcab,tybeeb.1dkes,???r&e&tsneum-hf,vres&cisab,lautriv,??ial.sppa,?s&codehtdaer,gnihtbew,nemeis-om,pparevelc,tacdnas,?t&e&kcubtib,notorp,?i&belet,detfihs,kecaps,?raedon.egats,s&ohg,udgniht.&cersid.&dvreser,tsuc,?dorp.tsuc,gnitset.&dvreser,tsuc,?ved.&dvreser,tsuc,????vgib.0ku,whs,x&bslprbv.g,cq,rotide,?y&olpedew,srab,??b?d&ar?u&a?ts???j?r?syhp??j!.&eman?gro?hcs?lim?moc?ten?ude?vog???ll&ag?o??m!.&gro?moc?ten?ude?vog??g?il?mi?orp??n!.&a&0&b-ekhgnark--nx?c-iehsrgev--nx?g-lksedlig--nx?k-negnanvk--nx??1&p-nedragy--nx?q-&asierrs--nx?grebsnt--nx?lado-rs--nx?n&egnidl--nx?orf-rs--nx??regnayh--nx?ssofenh--nx??r-datsgrt--nx?s-ladrjts--nx?v-y&senner--nx?vrejks--nx???3g-datsobegh--nx?4&5-&dnaleprj--nx?goksnerl--nx?tednalyh--nx??6-neladnjm--nx?s-&antouvachb--nx?impouvtalm--nx??y-&agrjnevvad--nx?ikhvlaraeb--nx???7k-antouvacchb--nx?8&k-rekie-erv--nx?l-ladrua-rs--nx?m-darehsdrk--nx??a!.sg??bct-eimeuvejsemn--nx?d&do?iisevvad?lov?narts?uas??f&1-&l--nx?s--nx??2-h--nx??g&10aq0-ineve--nx?av?ev?lot?r&ajn&evvad?u??ájn&evvad?u????h?iz-lf--nx?j&ddadab?sel??k&el?hoj&sarak?šárák??iiv&ag&na&el?g??ŋ&ael?ág???ran???l&f?lahrevo?o&ms?s??sennev?t-&ilm--nx?tom--nx??u&-edr--nx?s??øms??muar?n&0-tsr--nx?2-dob--nx?5-&asir--nx?tals--nx??a&r!-i-om?f?t??t??douvsatvid?kiv?m&os?øs??n&od?ød??ra?sen?t&aouvatheig?ouv&a&c&ch&ab?áb??h&ab?áb???n??i&ag?ág??sa&mo?ttvid??án???z-rey--nx?ær&f?t???o&p-&ladr--nx?sens--nx??q-nagv--nx?r-asns--nx?s-kjks--nx?v-murb--nx?w-&anr&f--nx?t--nx??ublk--nx???ppol?q&0-t&baol--nx?soum--nx?veib--nx??x-&ipphl--nx?r&embh--nx?imph--nx???y-tinks--nx??r&f-atsr--nx?g-&an&ms--nx?nd--nx??e&drf--nx?ngs--nx??murs--nx?netl--nx?olmb--nx?sorr--nx??h-&a&lms--nx?yrf--nx??emjt--nx??i&-&lboh--nx?rsir--nx?y&d&ar--nx?na--nx??ksa--nx?lem--nx?r&ul--nx?yd--nx????stu??j-&drav--nx?rolf--nx?sdav--nx??kua?l-&drojf--nx?lares--nx??m-tlohr--nx?n-esans--nx?olf?p-sdnil--nx?s-ladrl--nx?tih?v-rvsyt--nx??s&a&ns?ons??i&ar?er&dron?r&os?øs???ár??la&g?h??mor!t??sir?uf?åns??t&koulo&nka?ŋká??la?p-raddjb--nx?r-agrjnu--nx?s&aefr&ammah?ámmáh??orf?r&o?ø???u-vreiks--nx??u&h-dnusel--nx?i-&drojfk--nx?vleslm--nx??j-ekerom--nx?k-rekrem--nx?u-&dnalr--nx?goksr--nx?sensk--nx??v-nekyr--nx?w-&k&abrd--nx?ivjg--nx??oryso--nx??y-y&dnas--nx?mrak--nx?n&art--nx?nif--nx??reva--nx??z-smort--nx??v!.sg?ledatskork?reiks??wh-antouvn--nx?x&9-dlofts--nx.aoq-relv--nx?d-nmaherk--nx?f-dnalnks--nx?h-neltloh--nx?i-drgeppo--nx?j-gve&gnal--nx?lreb--nx??m-negnilr--nx?n-drojfvk--nx??y&7-ujdaehal--nx?8-antouvig--nx?b-&dlofrs--nx?goksmr--nx?kivryr--nx?retslj--nx??e-nejsom--nx?f-y&krajb--nx?re&dni--nx?tso--nx??stivk--nx??g-regark--nx?orf?ørf??z9-drojfstb--nx??b&25-akiivagael--nx?53ay7-olousech--nx?a&iy-gv--nx?le-tl&b--nx?s--nx??n0-ydr--nx??c&0-dnal-erdns--nx?z-netot-erts--nx??g&g-regnarav-rs--nx?o-nejssendnas--nx??ju-erdils-ertsy--nx?nj-dnalh-goksrua--nx?q&q-ladsmor-go-erm--nx.&ari-yreh--nx?ednas??s-neslahsladrjts--nx???ca&4s-atsaefrmmh--nx?8m-dnusynnrb--nx?il-tl--nx?le-slg--nx?n5-rdib--nx?op-drgl--nx?uw-ynnrb--nx??d&a&qx-tggrv--nx?reh!nnivk?sd&ork?ørk??uas??ts&e&bi?kkar?llyh?nnan??g&ort?ørt??k&alf?irderf??levev?mirg?obeg&ah?æh??r&ah?ejg????barm-jdddb--nx?ie!rah?s&etivk?ladman???lof&r&os?øs??ts&ev.ednas?o.relav?ø.relåv???n&a&l&-erd&n&os?øs??ron??adroh.so?dron.&a&g5-b--nx?ri-yreh--nx??ob?y&oreh?øreh??øb??e&m!lejh??pr&oj?øj??vi??gyb?n&aks?åks??o&h-goksrua?rf??r&o?ua?ø??tros?øh-goksrua??rts!e&devt?lab?mloh???s&ellil?naitsirk?rof???u&l!os??s!d&im?lejt??e&guah?l&a?å???kkoh?lavk?naitsirk?r&af?eg&e?ie???tef?y&onnorb?ønnørb?????r&a&blavs!.sg??g&eppo?la???o&j&f&a!dniv?k?vk??die?e&dnas?kkelf??llins?r&iel?ots??s&lab?t&ab?åb??yt??å!k??ævk??les??ts??åg&eppo?lå???ureksub.sen??e&ayb-yrettn--nx?d&ar?lom?r&of?øf??år??g&gyr?nats??i&meuv&ejsem&aan?åån??sekaal??rjea??j&d&ef?oks??les??k&er&aom?åom??hgna&ark?årk??iregnir?kot!s??s&ig?uaf???l&bmab?kyb?l&av?ehtats??oh??m&it?ojt?øjt??n&arg?g&os?øs??meh?reil?te?ummok?yrb??r&dils-erts&ev?y&o?ø???ua?vod??sa&ans?åns??t&robraa?spaav??urg??f&62ats-ugsrop--nx?a&10-ujvrekkhr--nx?7k-tajjrv-attm--nx??o!.sg?h??s!.sg??v!.sg???g&5aly-yr&n--nx?v--nx??a&llor?ve&gnal?lreb???n&av!snellu??org??oks&die?m&or?ør??ner&ol?øl??r&o?ø???r&eb!adnar?edyps?s&die?elf?gnok?n&ot?øt????obspras??uahatsla?åve&gnal?lreb???h&0alu-ysm--nx?7&4ay8-akiivagg--nx?5ay7-atkoulok--nx??a!.sg???i&e&hsr&agev?ågev??rf??k&h&avlaraeb?ávlaraeb??s??lm&a?å??mpouvtal&am?ám??pph&al?ál??rrounaddleid?ssaneve?ššáneve??j&0aoq-ysgv--nx?94bawh-akhojrk--nx??k&a&b&ord?ørd??jks?lleis??iv!aklejps?l&am?evs?u??mag?nel?ojg?r&a&l?n??epok?iel?y&or?ør???s&ah?kel?om??øjg??kabene?ojsarak?ram&deh.&aoq-relv--nx?rel&av?åv??so??e&let.&ag5-b--nx?ob?øb??ra???åjks??l&a!d&anrus?d&numurb?ron??e&gnard?nte?s&meh?sin??ttin??g&is?nyl??kro?l&em?l&ejfttah?of??u&ag-ertdim?s???n&am?era?gos?i&b?nroh?r??kos?nus?oj??o-&dron?r&os?øs???ppo?r&a!l?nram??e&gne?l?v??is?o&jts?ts??u&a-&dron?r&os?øs???h??å?æl?øjts??s&e&jg?nivk?ryf??kav?mor-go-er&om.&ednas?yoreh??øm.&ednas?yøreh???uag??t&las?rajh?suan??v&l&a?e-rots??u-go-eron??yt??ksedlig?res&a?å???bib&eklof?seklyf??es!dah??h!.sg??i&m?syrt??l&ejf?ov&etsua?gnit?ksa?sdie???n!.sg??o!.sg?boh?g?h??r!.sg??å!ksedlig??øboh??m&a&rah?vk??f!.sg??h!.sg??i&e&h&dnort?rtsua?ssej??rkrejb??ksa??ol?t!.sg??u&dom?esum?r&ab?drejg?evle?os?uh?æb?øs??ttals???n&a&g&av?okssman?åv??jlis?or?r&g?rev???e&d&do&sen?ton??lah?r&agy&o?ø??ojfsam???g&iets?n&a&l&as?lab??n&avk?ævk??t&arg?ddosen??v&al?essov???i&d&ol?øl??l&ar?ær???yl??reb??iks?k&srot?y&or?ør???l&a&d&gnos?n&er?ojm?øjm??om??tloh??ug?åtloh??mmard?ojs&om?sendnas??ppolg?s&lahsladr&ojts?øjts??o??t&o&l?t-erts&ev?o?ø???roh?øl??vly&kkys?nav??yam-naj!.sg??øjs&om?sendnas???g&orf?ujb??i&dnaort?vnarg??kob?ladendua?maherk&a?å??n&it?urgsrop??orf-&dron?r&os?øs???r&aieb?evats??sfev?uaks?yrts??o&6axi-ygvtsev--nx?c,d&ob?rav??ievs?kssouf?l&m&ob?øb??ous&adna?ech&ac?áč???so!.sg???msdeks?niekotuak?r&egark?olf?y&oso?øso???s&dav?mort???p&ed?ohsdaerpsym,p&akdron?elk???r&a&d&dj&ab?áb??iab??jtif?luag?mah?vsyt??e&gn&a&k&iel?ro??merb?n&at?mas??rav-r&os?øs??srop?talf?v&ats?el??y&oh?øh???ivsgnok??il?jkniets?k&a&nvej?rem?s&gnir?nellu???ie-er&den?v&o?ø???ram?sa?årem??la&jf?vh??m&b&ah?áh??mahellil??nnul?ts&l&oj?øj??ul??y&o?ø???imp&ah?áh??m!.sg??osir?t!.sg??ádiáb?ævsyt?øsir??s&adnil?en&dnas?e&dga?k&ri&b?k??som??ve??me&h?jg??nroh-go-ejve?s&a?ednil?k&o?ø??of?yt?å??tsev??gv?hf?igaval?o&r&or?ør??sman??so&fen&oh?øh??m?v??uh&lem?sreka.sen??å!dnil???t&a&baol?g&aov?grav??jjr&av-attam?áv-attám??l&a&b?s??ás??soum?ts?v&eib?our???e&dnaly&oh?øh??f?s&nyt?rokomsdeks?sen??vtpiks??in&aks?áks??loh&ar?år??n!.sg??o&m&a?å??psgolb,?s!.sg?efremmah?or?ør??terdi?á&baol?ggráv?lá&b?s??soum?veib???u&b!.sg?alk?e&dna?gnir?nner??les?ælk??dra&b?eb??g&nasrop?vi?ŋásrop??j&daehal&a?á??jedub?v&arekkhar?árekkhár???ksiouf?n&diaegadvoug?taed???v&irp?lesl&am?åm???y&b&essen?nart?sebel?tsev??o&d&ar?na!s??or??gavtsev?k&rajb?sa??lem?mrak?n&art?n&if?orb???r&a&mah?n?v??e&dni?t&so?ton??va??ul?yd??s&am?enner?gav?lrak?tivk??vrejks??ø&d&ar?na!s??ør??gåvtsev?k&rajb?sa??lem?mrak?n&art?n&if?ørb???r&e&dni?t&so?tøn??va??ul?yd?æ&n?v???s&enner?gåv?tivk?åm??vrejks???á&slág?tlá?vreiks??å&gåv?h?jddådåb?lf??ø&d&ob?rav??r&egark?olf??s&dav?mort????aki?i&sac?tal??u??o&b?f?g?hay?o?ttat??r!.&cer?erots?gro?m&o&c?n??rif?t??o&c,fni??pohs,stra?t&n?opsgolb,?www??e&a!.&a&ac?cgd?idem??bulc!orea??ci&ffartria?taborea??e&cn&a&l&lievrus-ria?ubma??netniam?rusni??erefnoc??gnahcxe?mordorea?ni&gne?lria?zagam??rawtfos??gni&d&art?ilg!arap?gnah???l&dnahdnuorg?ledom??noollab?retac?sael?t&lusnoc?uhcarap??vidyks??hcraeser?l&anruoj?euf?icnuoc?ortnoc!-ciffart-ria???n&gised?oi&nu?t&a&cifitrec?ercer?gi&tsevni-tnedicca?van??i&cossa!-regnessap??valivic??redef??cudorp?neverp-tnedicca????ograc?p&ihsnoipmahc?uorg!gnikrow???r&e&dart?enigne?korb?niart?trahc??o&htua?tacude???s&citsigol?e&civres?r??krow?serp!xe??tnega??t&farcr&ia?otor??hgil&f?orcim??liubemoh?n&atlusnoc?e&duts?m&esuma?n&iatretne?revog??piuqe????olip?ropria?si&lanruoj?tneics???w&erc?ohs??y&cnegreme?dobper?tefas????rref?z??p!.&a&aa?ca?pc??dem?ecartsnd.icb,gne?r&ab?uj??snduolc,t&acova?cca?hcer??wal?ysrab,???s!.&em?gro?hcs,moc?ten?ude?vog???t!.&116,ayo,gro?lim?moc?nayn,sulpnpv,t&cennockciuq.tcerid,en??ude?v&dr,og???o&hp?m?v?yk??tol?ua??v&iv?lov??xas?ykot??p&a&ehc?g?m?s??eej?g!.&gro?ibom?moc?ossa?ppa,ten?ude???i&r!.nalc,?v?z??j!.&a&3&5xq6f--nx?xqi0ostn--nx??5wtb6--nx?85uwuu--nx?9xtlk--nx?bihc!.&a&bihciakoy?don?ma&him?ye&ragan?tat???r&a&bom?gan?hihci??u&agedos?kas?ustak???s&os?ufomihs??t&amihcay?iran??w&a&g&im&anah?o??omak??kihci?zustum??ihsak??y&agamak?imonihci???e&akas?nagot??i&azni?esohc?h&asa?s&abanuf?ohc???ka&to?zok??musi?orihs?r&akihabihsokoy?o&dim?tak??ukujuk??usihs??nano&hc?yk??o&d&iakustoy?ustam??hsonhot?k&a&rihs?t??iba??nihsaran?sobimanim?tas&arihsimao?imot??uhc?yihcay??u&kujno?s&ayaru?t&imik?tuf???zarasik????g&as!.&a&gas?m&a&tamah?yik??ihsak??rat?t&a&gatik?hatik??ira!ihsin????e&kaira?nimimak??i&akneg?g&aruyk?o??h&c&amo?uo??siorihs??kaznak?modukuf?ra&gonihsoy?mi???nezih?u&k&at?ohuok??s&ot?tarak?????ihs!.&a&kok?m&a&hagan?yirom??ihsakat??rabiam?wagoton??e&miharot?nokih??houyr?i&azaihsin?esok?kustakat?moihsagih??na&mihcahimo?nok??o&hsia?mag?t&asoyot?ok?tir???us&ay?t&asuk?o??????k&aso!.&a&d&awihsik?eki??k&a&noyot?s&akaayahihc?oihsagih???oadat?uziak??m&ayas!akaso??odak??r&a&bustam?wihsak??ediijuf??t&akarih?i&k?us???wag&ayen?odoyihsagih???e&son?tawanojihs??honim?i&akas?h&cugirom?s&ayabadnot?i&a&kat?t??n??oyimusihsagih???k&a&rabi?sim??ustakat??muzi?r&ijat?otamuk???nan&ak?n&ah?es???o&ay?n&a&ganihcawak?simuzi?tak??eba?ikibah?oyot??t&anim?iad?omamihs??uhc??ust&oimuzi?tes????ou&kuf!.&a&d&amay?eos??g&no?ok?usak??hiku?k&awayim?uzii??ma&kan?y&asih?im???rawak?t&a&gon?ka&h?num?t???umo??wa&g&a&kan?nay?t??ias??ko!rih???y&ihsa?usak???e&m&ay?uruk??taruk?us??i&a&nohs?raihcat??goruk?h&cukuf?s&a&gih?hukuy??in???k&a&gako?muzim??iust?o?ustani??m&anim?otihsoynihs?u??r&ogo?ugasas??usu??ne&siek?zu&b?kihc???o&gukihc?h&ak?ot?ukihc??j&ono?ukihc??kayim?nihsukihc?to?uhc??u&fiazad?gnihs?stoyot????zihs!.&a&bmetog?d&amihs?eijuf?ihsoy?omihs??kouzihs?mihsim?ra&biah?honikam??tawi?wa&g&ekak?ukik??kijuf??yimonijuf??i&a&ra?sok??hcamirom?juf?kaz&eamo?ustam??ma&nnak?ta??nukonuzi?orukuf??nohenawak?o&nosus?ti??u&stamamah?z&a&mun?wak??i!ay?i&hs&agih?in??manim??mihs????????m&a&tias!.&a&d&ihsoy?ot?usah??k&a&dih?sa??o&arihs?s???m&a&tias?y&as?o&rom?tah??ustamihsagih???i&hsagurust?jawak??uri??ni?wa&g&e&ko?man??ikot?o??k&ara?i&hsoy?mak???ru?zorokot??y&a&g&amuk?ihsok?otah??kuf??imo??ziin??e&bakusak?ogawak?sogo?ttas?zokoy??i&baraw?h&cugawak?s&oyim?ubustam???iroy?k&ato?ihs?u&k?stawi???m&akoyr?i&hsoy?juf??uziimak???naznar?o&dakas?ihsay?jnoh?n&a&go?nim??imijuf?nah?oy??r&ihsayim?otagan??t&asim!ak??igus?omatik??zak??u&bihcihc!ihsagih??sonuok?ynah????y&ak&aw!.&a&d&ira?notimak??kadih?ma&h&arihs?im??y&a&kaw?tik??oduk???ru&ustakihcan?y??sauy?wa&g&a&dira?zok??orih??konik??yok?zok??e&banat?dawi??i&garustak?jiat?mani??naniak?o&bog?nimik?t&asim?omihs&ah?uk????ugnihs???o!.&a&jos?koasak?m&ay&ako?ust??ihsayah??r&abi?ukawaihsin??wi&aka?nam???e&gakay?kaw??i&gan?h&cu&kasa?otes??sahakat??k&asim?ihsaruk??miin??n&anemuk?ezib??o&hsotas?jnihs?n&amat?imagak??ohs?uhcibik?????ot!.&a&damay?got?koakat?may&etat?ot??nahoj?riat?waki&inakan?reman???eb&ayo?oruk??i&h&asa?ciimak?sahanuf??kuzanu?m&an&i?ot??ih???nezuyn?otnan?u&hcuf?stimukuf?z&imi?ou???????ihs&o&gak!.&a&m&ayuok?ihsogak??si?yonak??e&banawak?n&at&akan?imanim??uka??tomoonihsin??i&adnesamustas?k&azarukam?oih??m&ama?uzi??usuy??nesi?o&knik?os?tomustam??uzimurat???rih!.&a&ka&n?s??m&ayukuf?i&hsorihihsagih?j&ate?imakikaso????r&a&bohs?h&ekat?im???es??tiak?wiad??e&kato?ruk??i&h&ci&akustah?mono?nihs??s&inares?oyim???manimasa?uk??negokikesnij?o&gnoh?namuk??uhcuf????uk&ot!.&a&bihci?mi&hsu&kot?stamok??m??wagakan??egihsustam?i&gum?h&coganas?soyim??kijaw?m&anim?uzia??ukihsihs??nan&a?iak??o&nati?turan????uf!.&a&batuf?m&a&to?y&enak?irok???ihs&im?ukuf??os?uko??r&aboihsatik?uganat??ta&katik?mawak?rih??w&a&g&akus?emas?uy??k&a&mat?rihs?sa??ihsi??nah??ohs???e&gnabuzia?iman?ta&d?tii???i&adnab?enet?hs&agih?iimagak??k&a&wi?zimuzi??ubay??minuk?r&ook?ustamay???nihsiat?o&g&etomo?ihsin?nan?omihs??no!duruf?rih??rihsawani?ta&may?simuzia???u&rahim?stamakawuzia?zia&ihsin?nay???????nug!.&a&bawak?doyihc?k&anna?oi&hsoy?juf?mot???m&ayakat?ustagaihsagih??n&ihsatak?nak??r&ahonagan?nak?o?u&kati?mamat???t&amun?inomihs?o??w&akubihs?iem?ohs???i&hsa&beam?yabetat??kas&akat?esi??m&akanim?uzio??ogamust?rodim??o&jonakan?n&eu?oyikust??tnihs??u&komnan?stasuk?yrik?????ran!.&a&bihsak?d&akatotamay?u!o???guraki?m&ay&atik&imak?omihs??irokotamay??oki??ra&hihsak?n??wa&geson?knet???e&kayim?ozamay?sog?ustim??i&a&rukas?wak??garustak?h&ciomihs?sinawak??jo?ka&mnak?toruk??makawak?nos?r&net?otakat?ugeh???o&d&na?oyo??gnas?jnihs?nihsoy!ihsagih??tomarawat?yrok????t&ag&amay!.&a&dihsio?k&atarihs?ourust??may&a&kan?rum??enak?onimak??rukho?ta&ga&may?nuf??hakat?kas??wa&g&ekas?orumam??ki&hsin?m??z&anabo?enoy?ot???zuy??e&agas?bonamay?dii?nihsagih?o??i&a&gan?nohs??h&asa?sinawak??nugo??o&dnet?jnihs?ynan??ukohak???iin!.&a&ga?k&ium?oagan??munou!imanim??t&a&bihs?giin??ioy??w&a&gioti?kikes?zuy??irak??yijo??e&kustim?mabust??i&aniat?hcamakot?kaz&awihsak?omuzi??m&a&gat?karum??o???n&anust?esog??o&das?ihcot?jnas?k&ihay?oym??mak?naga?ries??u&ories?steoj?????i&ka!.&a&go?k&asok?oimak??t&ago!rihcah??ika!atik???w&aki?oyk???e&mojog?natim?suranihsagih?t&ado?okoy???i&hsoyirom?magatak?naokimak??nesiad?o&hakin?jnoh!iruy??nuzak?rihson?tasi&juf?m??yjnoh??u&kobmes?oppah????o!.&a&dakatognub?m&asah?ihsemih??su?t&ekat?i&h?o????e&onokok?ustimak??i&jih?k&asinuk?ias?usu??mukust??onoognub?u&fuy?juk?ppeb?suk??????wa&ga&k!.&a&mihsoan?rihotok?waga&kihsagih?ya???emaguram?i&j&nonak?ustnez??kunas?monihcu??o&hsonot?nnam?yotim??u&st&amakat?odat??zatu????nak!.&a&dustam?kus&okoy?tarih??maz?nibe?r&a&gihsaimanim?h&esi?imagas??wa&do?guy???u&im?kamak???tikamay?wa&k&ia?oyik?umas??sijuf??yimonin??e&nokah?saya??i&akan?esiak?gusta?hsuz?kasagihc?o?ukust??o&nadah?sio?tamay?????kihsi!.&a&danihcu?gak?kihs?mijaw?t&abust?ikawak??wazanak??i&gurust?hcionon?mon?ukah??nasukah?o&anan?ton!akan???u&kohak?stamok?z&imana?us?????niko!.&a&han?m&arat?ijemuk?uru??n&e&dak?zi??no??ra&hihsin?rih??wa&kihsi?niko??yehi?zonig??e&osaru?seay??i&hsagih?jomihs?k&a&gihsi?not??ihsakot??m&a&ginuk?kihsug?maz??igo?otekat??nuga!noy???n&a&moti?timoy?wonig??i&jikan?k???o&gan?jnan?tiad&atik?imanim???u&botom?kusug&akan!atik??imot??rab&anoy?eah???????c&204ugv--nx?462a0t7--nx?678z7vq5d--nx?94ptr5--nx?a??d&17sql1--nx?3thr--nx?5&20xbz--nx?40sj5--nx??7&87tlk--nx?ptlk--nx??861ti4--nx?a?e??e&16thr--nx?5&1a4m2--nx?9ny7k--nx??im!.&a&bot?k&asustam?uzus??m&a&him?y&emak?im???ihs??nawuk?wi&em?k???e&bani?ogawak?si!imanim???i&arataw?gusim?h&asa?ciakkoy??k&a&mat?sosik?t??iat??raban??o&dat?hik?n&amuk?ihseru?o&du?mok????ust???mihe!.&a&m&a&h&ataway?iin??yustam??ij&awu?imak???taki!man???ebot?i&anoh?kasam?rabami??n&ania?egokamuk?oot??o&jias?kihcu?nustam?uhcukokihs?yi!es???u&kohik?zo????n!.&nriheg,teniesa.resu,?amihs!.&a&d&amah?ho?usam??kustay?m&a?ihsoni&hsin?ko???wakih??e&namihs?ustam??i&g&aka?usay??konikak?mikih??nannu?o&mu&kay?zi!ihsagih?uko???nawust?tasim??u&stog?yamat?????tawi!.&a&bahay?d&amay?on??koirom?t&a&honat?katnezukir??imus??w&as&ijuf?uzim??ihs???e&hon&i&hci?n??uk??tawi??i&a&duf?murak?wak??h&custo?si&amak?ukuzihs???j&oboj?uk??k&a&m&anah?uzuk??sagenak??esonihci??m&akatik?uzia&rih?wi????o&kayim?no&rih?t??tanufo??uhso????g&3zsiu--nx?71qstn--nx?l??h&03pv23--nx?13ynr--nx?22tsiu--nx?61qqle--nx??i&54urkm--nx?g&ayim!.&a&dukak?m&a&goihs?kihs??ihsustam!ihsagih??unawi??r&awago?iho??ta&bihs?rum??w&a&gano?kuruf??iat??y&imot?ukaw???e&mot?nimes??i&hsiorihs?ka&monihsi?s&awak?o???mak?r&ataw?o&muram?tan????o&az?jagat?t&asim?omamay???u&fir?k&irnasimanim?uhsakihcihs?????ihcot!.&a&g&a&h?kihsa??ust??kom?m&ay&o?usarak??unak??r&a&boihsusan?watho??iho?ukas??t&akihsin?iay??wa&konimak?zenakat??y&imonustu?oihs???e&iiju?kustomihs?nufawi??i&akihci?g&etom?ihcot?on???o&k&ihsam?kin??nas?sioruk?tab??u&bim?san?????h&c&ia!.&a&dnah?m&a!h&akat?im??yuni??ihs&ibot?ust???r&a&hat?tihs??ik?u&ihsagih?kawi???t&ihc?o&k?yot???wa&koyot?zani??yi&monihci?rak???e&inak?k&aoyot?usa??manokot?noyot??i&a&gusak?kot?sia??eot?h&asairawo?cugo?s&ahoyot?oyim???k&a&mok?zako??ihssi??motay?rogamag??n&an&ikeh?ok??ihssin??o&got?ihsin?jna?rihsnihs?suf?tes??u&bo?raho?s&oyik?takihs??yrihc?zah????ok!.&a&dusay?kadih?mayotom?r&ah&im?usuy??umakan??sot!ihsin??wa&g&atik?odoyin??k&as?o????i&esieg?hco!k??jamu?k&a!sus??usto??ma&gak?k??rahan??o&mukus?n&i?ust!ihsagih???torum?yot!o???u&koknan?zimihsasot????ugamay!.&a&m&ayukot?ihso??toyot??e&bu?subat??i&gah?kesonomihs?nukawi?rakih??nanuhs?otagan?u&ba?foh?otim?stamaduk?uy?????sanamay!.&a&dihsoyijuf?mayabat?r&ahoneu?ustakihsin??w&a&k&ayah?ijuf??suran??ohs???egusok?i&ak?h&cimakan?s&anamay?od???k&asarin?u&feuf?sto????o&k&akanamay?ihcugawakijuf??nihso?t&asimawakihci?ukoh??uhc??spla-imanim?u&b&nan?onim??fok?hsok?rust?????ka&rabi!.&a&bukust?gok?kan!ihcatih??m&a&sak?timo?wi??ihsak?ustomihs??ni?r&a&hihcu?way??u&agimusak?ihcust???t&ag&amay?eman??oihcatih??w&ag&arukas?o??os??yi&moihcatih?rom???e&bomot?dirot?not?tadomihs??i&a&k&as?ot??rao??esukihc?gahakat?h&asa?catih??k&a&rabi?saguyr??ihsani?uy??ma?rukustamat??o&dnab?giad?him?kati?rihsijuf?soj?t&asorihs?im??yihcay??u&fius?kihsu?simak????sagan!.&a&m&abo?ihsust??natawak?r&abamihs?u&mo?ustam???wijihc?yahasi??i&akias?hies?k&asagan?i??masah??neznu?o&besas?darih?t&eso?og!imaknihs????ust&igot?onihcuk?uf????zayim!.&a&biihs?guyh?k&oebon?ustorom??mihsuk?r&emihsin?uatik??ta&katik?mim??wag&atik?odak??ya??e&banakat?sakog??i&hsayabok?kaza&kat?yim??m&animawak?ot&inuk?nihs????nanihcin?o&j&ik?onokayim??n&ibe?ust??tias??urahakat????ro&moa!.&a&dawot?turust?wasim??e&hon&ihc&ah?ihs??nas?og?ukor??sario??i&anarih?ganayati?hsioruk?jehon?kasorih?makihsah?nawo?r&amodakan?omoa???o&gnihs?kkat??u&ragust?stum????ttot!.&a&r&ahawak?uotok??sa&kaw?sim???egok?irottot?nanihcin?o&ganoy?nih?tanimiakas??u&bnan?z&ay?ihc??????ukuf!.&a&deki?gurust?ma&bo?h&akat?im??yustak??sakaw??eabas?i&akas?ho?jiehie?ukuf??nezihce!imanim??ono????k&26rtl8--nx?4&3qtr5--nx?ytjd--nx??522tin--nx?797ti4--nx??l33ussp--nx?m&11tqqq--nx?41s3c--nx??n&30sql1--nx?65zqhe--nx?n7p7qrt0--nx??o&131rot--nx?7qrbk--nx?c?diakkoh!.&a&deki?gakihset?hcebihs?k&adih?u&fib?narihs???m&ayiruk?hot?ihs&orihatik?ukuf??oras?usta??r&ib&a!ka??o?uruf??ozo?u&gakihsagih?oyot???sakim?ta&gikust?mun??w&a&ga&k&an?uf??nus!imak???k&aru?i&h&asa?sagih??kat?mak??omihs?um??zimawi??ine?oyk??yot??e&a&mustam?nan??b&a&kihs?yak??o&noroh?to???ian?k&ihsam?ufoto??nakami?ppoko!ihsin??sotihc?tad!okah??uonikat??i&a&bib?mokamot?n&a&k&kaw?oroh??wi??eomak?ihsatu?okik?usta&moruk?sakan????eib?h&c&ioy?u&bmek?irihs???s&ase?ekka?oknar?uesom???jufirihsir?k&amamihs?i&at?n???m&atik?otoyot??oa&kihs?rihs??r&a&hs?kihsi?mot??ihs&aba?ir??otarib???n&a&hctuk?rorum?se?tokahs??uber??o&kayot?m&ire?ukay??naruf!ima&k?nim???orih?r&ih&ibo?suk??o&bah?h&i&b?hsimak??sa??pnan?yan??umen??t&asoyik?eko?ukoh???u&bassa?kotnihs?m&assaw?uo??pp&akiin?en&ioto?nuk??ip??rato?s&akat?t&eb&e?i&a?hs!a??robon??m&e?o&m?takan???no&h?tamah??o&mik?s?t??u&kir?ppihc?st???onihsnihs?ufuras??uaru??yru!koh??zimihs!ok?????g!oyh!.&a&bmat?dnas?gusak?k&at?o&oyot?y??uzarakat??m&ayasas?irah??wa&g&ani?okak??k&i&hci?mak??oy???yi&hsa?monihsin???i&asak?hs&aka?i&at?nawak???j&awa!imanim??emih??k&a&goa?s&agama?ukuf??wihsin??i&hsog?m???mati?oia?rogimak??n&annas?esnonihs??o&gasa!kat??ka?n&ikat?o?ustat??rihsay?sihs?tomus?yas??u&bay?gnihs?????nagan!.&a&bukah?d&a&w?yim??e&ki?u??ii??k&a&s&ay?uki??zus??ihsoo?ousay??m&ay&akat?ii??i&hsukufosik?jii??ukihc??n&i!hsetat??uzii??r&ah?ugot??saim?t&agamay?oyim??w&a&g&a&kan?n??o??kustam?ziurak??onim!imanim??u&koo?s!omihs????ya&ko?rih???e&akas?nagamok?subo??i&gakat?h&asa?c&a!mo!nanihs???uonamay??sukagot??k&a&kas?mimanim?to??ia&atik?imanim??oa?uzihcom??m&akawak?ijuf?o!t???r&ato?ijoihs?omakat???n&ana?esnoawazon??o&hukas?n&a&gan?kan??i&hc?muza??ustat??romok?si&gan?k??tomustam??u&k&as?ohukihc??stamega????to&mamuk!.&a&gamay?rahihsin?sukama!imak??tamanim??enufim?i&hcukik?k&ihsam?u??nugo!imanim??romakat??o&ara?rihsustay?sa?t&amay?om&amuk?us??u!koyg???yohc??u&sagan?zo????yk!.&a&bmatoyk?k&ies?oemak?uzaw??mayi&h&cukuf?sagih??muk??nihsamay?rawatiju?t&away?ik???e&ba&nat!oyk??ya??di?ni??i&ju?kazamayo?manim??natnan?o&gnatoyk?kum?mak?rihsamayimanim?y&gakan?ka&koagan?s??oj???u&ruziam?z&ayim?ik??????wtc1--nx?ykot!.&a&d&i&hcam?mus??oyihc??k&atim?ihsustak??m&a&t!uko??yarumihsa&gih?sum???i&hs&agoa?ika?o!t??uzuok??ren???r&a&honih?wasago??iadok?umah??ssuf?t&ik?o??wa&g&anihs?ode??k&ara?ihcat???y&agates?ubihs???e&amok?donih?m&o?urukihsagih??soyik??i&enagok?gani?h&ca&da?tinuk??sabati??j&nubukok?oihcah??manigus??o&huzim?jihcah?n&akan?ih!sasum??urika??rugem?t&a&mayihsagih?nim??iat?ok??uhc?yknub??u&fohc?hcuf?kujnihs?????r&2xro6--nx?g?o??s&9nvfe--nx?xvp4--nx??t&netnocresu,opsgolb,?u&4rvp8--nx?fig!.&a&d&eki?ih??kimot?m&ayakat?ihsah??ne?raha&gi&kes?makak??sak??taga&may?tik??wa&g&ibi?ustakan??karihs!ihsagih????e&katim?uawak??i&gohakas?hc&apna?uonaw??k&ago?es?ot??m&anuzim?ijat??nak?urat??nanig?o&dog?jug?makonim?nim?roy?sihcih??u&fig?s&otom?t&amasak?oay???????x5ytlk--nx?yu6d27srjd--nx?z72thr--nx?井福?京東?分大?取鳥?口山?城&宮?茨??媛愛?山&富?岡?歌和??岡&福?静??島&児鹿?広?徳?福??崎&宮?長??川&奈神?石?香??庫兵?形山?手岩?木栃?本熊?根島?梨山?森青?潟新?玉埼?田秋?知&愛?高??縄沖?良奈?葉千?賀&佐?滋??道海北?都京?重三?野長?阜岐?阪大?馬群???k!.&art?gro?moc?per?ude?vog???l&eh?l??m!.uj,ac?j??nd?o&g?h&pih?s!.ysrab,??lnud?oc?t!.&lldtn,snd-won,???pa!.&0mroftalp,arusah,bew:erif,,e&niln&igol,okoob,?tupmocegde,?lecrev,n&aecolatigidno,ur:.a,,?poon,remarf,t&ibelet,xenw,?yfilten,??ra&a?hs??u&ekam?llag?org!.esruocsid,cts?kouk?nayalo???vsr?xece4ibgm--nx??q&a!3a9y--nx??g?i!.&gro?lim?moc?ten?ude?vog???m?se??r&a!.&acisum?bog?gro?lim?moc!.topsgolb,?rut?t&en?ni??ude?vog??4d5a4prebgm--nx?b?c?eydoog?los?t&at?s!uen???ugaj??b!.&21g?a&b&a&coros?iuc??itiruc??cnogoas?dicerapa?gniram?i&naiog?ramatnas??n&erom?irdnol??op?p&acam?irolf?ma&j?s???rief?tsivaob??b!aj?ib?mi?sb??c&ba?e&r?t??js?sp?t!e???d&em?mb?n&f?i??rt??e&dnarganipmac?ficer?ht?llivnioj?rdnaotnas??f&dj?ed?gg?n&e?i???g&e&l!.&a&b,m,p,?bp,c&a,s,?e&c,p,s,?fd,gm,ip,jr,la,ma,nr,o&g,r,t,?p&a,s,?r&p,r,?s&e,m,r,?tm,??s??l&s?z??n&c?e?o??ol!b?f?v??pp?ro??hvp?i&du?kiw?nana?oretin?r&c?eurab??sp?te?xat??l&at&an?rof??el?im?sq??m&a?da?e&gatnoc?leb??f?ic?oc!.&duolclautriv.elacs.sresu,topsgolb,???nce?o&ariebir?c&e?narboir?saso??d&o?ranreboas??e&g?t??i&b?dar?ecam?r??rp?t&a?erpoir???p&er?m!e?t??ooc?pa?se??qra?r&af?ga?o&davlas?j??tn?ut??s&a&ixac?mlap?nipmac??ed?u&anam?j?m???t&am?e&d?n?v??nc?o&f?n??ra?sf??u&caug9?de?ja?rg??v&da?ed?og!.&a&b?m?p??bp?c&a?s??e&c?p?s??fd?gm?ip?jr?la?ma?nr?o&g?r?t??p&a?s??r&p?r??s&e?m?r??tm???rs?t??xiv?z&hb?ls?o&c?f?????c!.&as?ca?de?if?o&c?g??ro???e&bew?ccos?dnik?e&b?n&igne?oip??rac??gni&arg?rheob??h&cor?sok?t&aew?orb???itnorf?k&col?o&p?rb???l&aed?ffeahcs??mal?nes?pinuj?t&a&eht?rebsnegömrev??law?nec?s&acnal?nom?ubkcolb??upmoc??v&o&c&sid?tfiws??rdnal??resbo??wulksretlow?ywal?zifp??f!.&aterg?bew-no,drp?e&c&itsuj-reissiuh?narf-ne-setsitned-sneigrurihc,?lipuog,rianiretev??hny,i&cc?rgabmahc??m&o&c?n??t??n&eicamrahp?icedem??ossa?pohsdaerpsym,s&e&lbatpmoc-strepxe?riaton?tsitned-sneigrurihc?uova??o&-x&bf,obeerf,?x&bf,obeerf,???t&acova?o&or-ne,psgolb,?r&epxe-ertemoeg?op!orea????vuog??avc7ylqbgm--nx?s??g!.&gro?moc?t&en?opsgolb,?ude?vog???h!.&e&erf,man??mo&c?rf??topsgolb,zi??ur??i!.&a&61f4a3abgm--nx?rf4a3abgm--nx??ca?di?gro?hcs?oc?ten?vog?نار&يا?یا???a&h?per??ew?lf??k!.&c&a?s??e&n?p?r??gk?iggnoeyg?kub&gn&oeyg?uhc??noej??l&im?uoes??man&gn&oeyg?uhc??noej??n&as&lu?ub??o&e&hcni?jead??wgnag???o&c?g??ro?s&e?h?m??topsgolb,u&gead?j&ej?gnawg????cilf??l!.&gro?moc?ten?ude?vog???m!.&topsgolb,vog???n!.&gro?moc?ofni?ten?ude?vog?zib???o&htua?odtnorf?t&c&a?od??laer???p!.&alsi?ca?eman?forp?gro?moc?o&fni?rp??t&en?se??ude?vog?zib???s?t!.&21k?bew?cn!.vog??eman?gro?kst?l&e&b?t??im?op??moc!.topsgolb,?neg?ofni?pek?rd?sbb?ten?ude?v&a?og?t??zib??f?m??ubad?vd??s&8sqif--nx?9zqif--nx?a!.vog?birappnb?gev?lliv?mtsirhc?s??b!.&ew,gro?moc?ten?ude?vog??c?oj?s?u??c&i&hparg?p?t&sigolyrrek?ylana???od??d&a?d?l?n&iwriaf?omaid??oogemoh?rac??e!.&bog?gro?mo&c!.topsgolb,?n??pohsdaerpsym,ude??civres!.enilnigol,?d&d2bgm--nx?oc??h&ctaw?guh??i&lppus?rtsudni?treporp!yrrek???jaiv?l&aw?cycrotom?etoh?gnis?pats??m&ag?oh?reh??nut?ohs?picer?r&it?ut&cip!.7331,?nev???s!i&rpretne?urc??ruoc??taicossa?vig??g!nidloh??h5c822qif--nx?i!.&ekacpuc,gro?moc?t&en?ni?opsgolb,?ude?vog??a09--nx?nnet?rap?targ??k&c&or!.&ecapsbew,snddym,ytic-amil,??us??hxda08--nx?row??l!.&c&a?s??ed,gro?o&c?fni??ten?ude?vog?zib??a&ed?tner??e&ssurb?toh!yrrek???lahsram?m?oot??m!.&bal,etisinim,gro?moc?ten?ude?vog??b?etsys!.tniopthgink,?ialc??n&a&f?gorf?ol??egassap?i&a&grab?mod??giro??o&it&acav?cudorp?ulos??puoc???o&dnoc?geuj?leuv?ppaz?t&ohp?ua???p!.&ces?gro?moc?olp?ten?ude?vog??i&hsralohcs?lihp?t??u??r!.&au,ca?gro?ni?oc?topsgolb,ude?vog?xo,yldnerb.pohs,?a&c?p?tiug??c?e&dliub!.etisduolc,?erac?gor?levart?mraf?n&niw?trap??wolf??ot&cartnoc?omatat??pj?uot??s!.&em?gro?hcs?moc?ten?ude?vog?zib??alg?e&n&isub!.oc,?tif??rp!xe!nacirema???xnal??iws??t&a&e&b?ytic??ob??ek&cit?ram??fig?h&cay?gilf??n&atnuocca?e&mt&rapa?sevni??ve!.oc,???rap??u!.&a&c!.&21k?bil?cc???g!.&21k?bil?cc???i!.&21k?bil?cc???l!.&21k?bil?cc???m!.&21k!.&hcorap?rthc?tvp???bil?cc???p!.&21k?bil?cc???si?v!.&21k?bil?cc???w!.&21k?bil?cc????c&d!.&21k?bil?cc???n!.&21k?bil?cc???s!.&21k?bil?cc????d&e&f?lacsne.xhp,?i!.&21k?bil?cc???m!.&21k?bil?cc???n!.&bil?cc???s!.&bil?cc???u&olcrim,rd,??e&d!.&21k?bil,cc???las-4-&dnal,ffuts,?m!.&21k?bil?cc???n!.&21k?bil?cc????h&n!.&21k?bil?cc???o!.&21k?bil?cc????i&h!.&bil?cc???m!.&21k?bil?c&c?et??goc?n&eg?otae??robra-nna?sum?tsd?wanethsaw???nd?r!.&bil?cc???v!.&21k?bil?cc???w!.&21k?bil?cc????jn!.&21k?bil?cc???k&a!.&21k?bil?cc???o!.&21k?bil?cc????l&a!.&21k?bil?cc???f!.&21k?bil?cc???i!.&21k?bil?cc????mn!.&21k?bil?cc???n&afflog,i!.&21k?bil?cc???m!.&21k?bil?cc???sn?t!.&21k?bil?cc????o&c!.&21k?bil?cc???m!.&21k?bil?cc???ttniop,?p&ion,rettalp,?r&a!.&21k?bil?cc???o!.&21k?bil?cc???p!.&21k?bil?cc????s&a!.&21k?bil?cc???dik?k!.&21k?bil?cc???m!.&21k?bil?cc???nd&deerf,uolc,??t&c!.&21k?bil?cc???m!.&21k?bil?cc???u!.&21k?bil?cc???v!.&21k?bil?cc????ug!.&21k?bil?cc???v&n!.&21k?bil?cc???w!.cc???x&ohparg,t!.&21k?bil?cc????y&b-si,k!.&21k?bil?cc???n!.&21k?bil?cc???w!.&21k?bil?cc????za!.&21k?bil?cc????ah!uab??bria?col?e!.ytrap.resu,?ineserf?lp?xe&l?n???vt?w!.&66duolc,gro?moc?s&ndnyd,tepym,?ten?ude?vog??a?e&iver?n!.elbaeciton,??odniw??y&alcrab?cam?ot???t&0srzc--nx?a!.&amil4,ca!.hts??gni&liamerutuf,tsoherutuf,?o&c!.topsgolb,?fni,?p&h21,ohsdaerpsym,?r&euefknuf.neiw,o??v&g?irp,?xi2,ytic-amil,zib,?c?e!s??hc?if?l!asite??mami?rcomed??b!.&gro?moc?ten?ude?vog??b?gl??c&atnoc?e&les?rid!txen????dimhcs?e!.&eman?gro?moc?ofni?ten?ude?vog?zib??b?em?grat?id?k&circ?ram??n!.&0&002cilc,rab,?1rab,2rab,5inu,6vnyd,7&7ndc.r,erauqs,?a&l&-morf,moob,?minifed,remacytirucesym,tadsyawla,z,?b&boi,g,lyltsaf:.pam,,?c&inagro-gnitae,paidemym,?d&ecalpb,irgevissam.saap.&1-&gs,nol,rf,yn,?2-&nol,yn,??nab-eht-ni,uolc&meaeboda,nievas.c&di-etsedron,itsalej,?xednay:.e&garots,tisbew,?,??e&c&narusnihtlaehezitavirp,rofelacs.j,?gdirbtib,ht-no-eciffo,l&acsnoom,ibom-eruza,?m&ecnuob,ohtanyd,tcerider,?n&ilno-evreser,ozdop,?rehurht,s:abapus,,tis-repparcs,zamkcar,?f&aeletis,crs.&cos,resu,?ehc-a-si,?g&ni&reesnes,sirkcilc,tsohnnylf,?olb&evres,tsaf,??k&catsvano,eeg-a&-si,si,?u,?l&acolottad,iamwt,s&d-ni,s-77ndc,??m&ac&asac,ih,?urofniem,?n&a&f&agp,lhn,?i&bed,llerk,??dcduabkcalb,i,pv-ni,?o&c-morf,duppa,jodsnd,rp-ytinummoc,ttadym,?p&i&-&etsef,on,?emoh,fles,nwo,?j,mac-dnab-ta,o&-oidar-mah,h&bew,sdaerpsym,??pa&duolc,egde,?tfe&moh,vres,?usnd,?r&e&tsulcyduolc,vres-xnk,?vdslennahc:.u,,?s&a&ila&nyd,snd,?nymsd,?bbevres,dylimaf,e&gde-ndc,suohsyub,t&isbeweruza,ys,??k&catstsaf,ekokohcs,?n&d&-won,d,golb,npv,?oitcnufduolc,?ppacitatseruza:.&2suts&ae,ew,?aisatsae,eporuetsew,sulartnec,?,s&a-skcik,ecca&-citats,duolc,???t&adies,ce&ffeym,jorprot:.segap,,?e&nretnifodne,smem,?farcenimevres,i-&ekorb,s&eod,lles,teg,??n&essidym,orfduolc,?r0p3l3t,s&ixetnod,oh&-spv:.citsalej.&cir,lta,sjn,?,gnik,???u&h,nyd,r:eakust.citsalej,,?ved-naissalta.dorp.ndc,x&inuemoh,spym,tsale.&1ots-slj,2ots-slj,3ots-slj,?unilemoh,?y&awetag-llawerif,ffijduolc:.&ed-1arf,su-1tsew,?,ltsaf.&dorp.&a,labolg,?lss.&a,b,labolg,?pam,slteerf,?n&-morf,ofipi,?srab,?z&a-morf,tirfym,???p?tcip?v??f&ig?o&l?sorcim???g!.&bog?dni?ed,g&olb,ro??lim?moc?ot,ten?ude???h!.&dem?gro?l&er?op??m&oc?rif??o&fni?rp?s&rep?sa???po&hs?oc??t&en?luda?ra??ude?vuog???i!.&a&2n-loritds--nx?7e-etsoaellav--nx?8&c-aneseclrof--nx?i-lrofanesec--nx??at?b?c!cul??dv?i&blo&-oipmet?oipmet??cserb?drabmol?g&gof?urep??l&gup?i&cis?me&-oigger?oigger???uig&-&aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf???aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf????n&a&brev?cul?pmac?tac??idras?obrac&-saiselgi?saiselgi??resi??otsip?r&b&alac!-oigger?oigger??mu??dna&-&attelrab-inart?inart-attelrab??attelrabinart?inartattelrab?ssela??epmi?ugil??tnelav&-obiv?obiv??vap?z&e&nev?ps&-al?al???irog???l&iuqa!l??leib??m&or?rap??n!acsot?e&dom?is?sec&-&ilrof?ìlrof??ilrof?ìlrof???g&amor&-ailime?ailime??edras?olob??i&ssem?tal??ne!var??o&cna?merc?rev?vas???oneg?p?r!a&csep?rr&ac&-assam?assam??ef??von??etam?tsailgo!-lled?lled???s!ip?sam&-ararrac?ararrac??u&caris?gar???t!a&cilisab?recam??resac?soa!-&d&-&ellav?lav??ellav?lav??ellav??d&-&ellav?lav??ellav?lav??ellav??te&lrab&-&airdna-inart?inart-airdna??airdnainart?inartairdna??ssinatlac???udap?v!o&dap?neg?tnam???zn&airb&-a&lled-e-aznom?znom??a&lledeaznom?znom??eaznom??e&c&aip?iv??soc?top??om???b&-&23,46,61,?3c-lorit-ds-onitnert--nx?be-etsoa&-ellav--nx?dellav--nx??c!f-anesec-lrof--nx?m-lrof-anesec--nx??he-etsoa-d-ellav--nx?m!u??o2-loritds-nezob--nx?sn-loritds&-nasl&ab--nx?ub--nx??nitnert--nx??v!6-lorit-dsnitnert--nx?7-loritds&-nitnert--nx?onitnert--nx???z&r-lorit-ds&-nitnert--nx?onitnert--nx??s-loritds-onitnert--nx???c&f?is?l?m?p?r?v??d&p?u!olcnys,??e&c!cel?inev?nerolf??f?g!ida&-&a&-onitnert?onitnert??otla!-onitnert?onitnert???a&-onitnert?onitnert??otla!-on&azlob?itnert??onitnert????hcram?l?m!or??n&idu?o&n&edrop?isorf??torc???p?r?s&erav?ilom??t!nomeip?s&eirt?oa!-&d-e&ellav?éllav??e&ellav?éllav???de&ellav?éllav??e&ellav?éllav?????v?znerif??g&a?b?f?il?o?p?r?up?vf??hc?i&b?c?dol?f?l!lecrev?opan?rof&-anesec?anesec???m?n&a&part?rt&-attelrab-airdna?attelrabairdna???imir?ret??p?r!a&b?ilgac?ssas???s!idnirb??t&ei&hc?r??sa??v??l&a!c??b?c?o&m?rit&-&d&eus&-&nitnert?onitnert??nitnert?onitnert??us&-&nitnert?onitnert??nitnert?onitnert??üs&-&nitnert?onitnert??nitnert?onitnert???s&-onitnert?onitnert???d&eus!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??us&-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??üs!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert???s&-onitnert?onitnert?????m&ac?f?i!t.nepo.citsalej.duolc,?ol?r??n&a!lim?sl&ab?ub???b?c?e!en.cj,v?zob??irut?m!p??p?r?t??o&a!v??b!retiv??c!cel??enuc?g!ivor??i&dem&-onadipmac?onadipmac??pmet&-aiblo?aiblo??rdnos?zal??l?m!a&greb?ret??oc?re&f?lap???n!a&dipmac&-oidem?oidem??lim?tsiro?zlob??ecip&-ilocsa?ilocsa??i&bru&-orasep?orasep??lleva?rot?tnert??r&elas?ovil??ulleb??p?r!a&sep&-onibru?onibru??znatac??oun??s!ivert?sabopmac??t!arp?e&nev?ssorg??n&arat?e&girga?rt?veneb????zz&era?urba???p&a?ohsdaerpsym,s?t??qa?r&a!m?s??b!a??c?f?g?k?me?o?p?s?t?v??s&a&b?iselgi&-ainobrac?ainobrac???b?c?elpan?i?m?ot?s?t?v??t&a?b?c?l?m?nomdeip?o!psgolb,?p?v??u&de?l?n?p??v&a?og?p?s?t?v??y&drabmol?ellav&-atsoa?atsoa??licis?nacsut??z&al?b?c?p??ìlrof&-anesec?anesec???derc?er?f?m!r??utni??je3a3abgm--nx?kh?l!.&topsgolb,vog??uda??m!.&gro?moc!.topsgolb,?ten?ude???n&a&morockivdnas?ruatser?tnuocca??e&g?m&eganam!.retuor,?piuqe??r??i!.ue?m?opdlog??opud?uocsid??o&b?cs!.&ude,vog:.ecivres,,??d?g?h?j?oferab?p&edemoh?s???p!.&emon?gro?lbup?moc?t&en?ni?opsgolb,?ude?vog???r&a!m&law?s???epxe?op&er?pus!.ysrab,?s???s!.&adaxiabme?e&motoas?picnirp?rots??gro?lim?moc?o&c?dalusnoc?hon,?ten?ude??a&cmoc?f??e&b?padub?r?uq??i!rolf?tned??o&h!.&duolc&p,rim,?e&lej,tiseerf,?flah,lrupmet,s&pvtsaf,seccaduolc,?tsafym,vedumpw,??p!sua???urt??t!.&eman?gro?ibom?levart?m&oc?uesum??o&c?fni?r&ea?p???pooc?sboj?t&en?ni??ude?vog?zib??ayh?n?o!bba?irram???uognah?xen?y!.gro,?ztej??u&2&5te9--nx?yssp--nx??a!.&a&s?w??civ?d&i?lq??fnoc?gro?moc!.&pohsdaerpsym,stelduolc.lem,topsgolb,??nsa?ofni?sat?t&ca?en?n??ude!.&a&s?w??ci&lohtac?v??dlq?sat?t&ca?n??wsn!.sloohcs????vog!.&a&s?w??civ?dlq?sat???wsn?zo??ti??c!.&fni?gro?moc?ten?ude?vog??i??d&e!.tir.segap-tig,?iab??e!.&dcym,enozgniebllew,noitatsksid,odagod.citsalej,snd&ps,uolc,?ysrab,??g!.&bew?gro?m&aug?oc??ofni?ten?ude?vog???h!.&0002?a&citore?idem?kitore??edszot?gro?ilus?letoh?m&alker?lif?t?urof??naltagni?o&c?ediv?fni?levynok?nisac??pohs?rarga?s&a&kal?zatu??emag?wen??t&lob?opsgolb,rops??virp?xe&s?zs??ytic?zsagoj??os?sut??l!.topsgolb,?m!.&ca?gro?moc?oc?ro?ten?vog???n!.&duolcesirpretne,eni&esrem,m,?tenkcahs,?em!.ysrab,??o&ggnaw?y!c???r!.&3kl,a&i&kymlak,rikhsab,vodrom,?yegyda,?bps,ca,duolcrim,e&niram,rpcm,?g&bc,nitsohurger.citsalej,ro,?ianatsuk,k&ihclan,s&m,rogitayp,??li&amdlc.bh,m,?moc,natsegad,onijym,pp,ri&b,d&cm:.spv,,orue,?midalv,?s&ar,itym,?t&en,ni,opsgolb,set,?u&4an,de,?vo&g,n,?ynzorg,zakvakidalv,?myc?p?ug??s!.&a&d&golov,nagarak,?gulak,i&groeg,kymlak,lerak,nemra,rikhsab,ssakahk,vodrom,zahkba,?lut,rahkub,vut,yegyda,znep,?bps,da&baghsa,rgonilest,?gunel,i&anatsuk,hcos,ovan,ttailgot,?k&alhsygnam,ihclan,s&legnahkra,m,n&a&mrum,yrb,?i&buytka,nbo,??tiort,vorkop,??l&ocarak,ybmaj,?na&gruk,jiabreza,ts&egad,hkazak-&htron,tsae,???ovonavi,r&adonsark,imidalv,?t&enxe,nek&hsat,mihc,??vo&hsalab,n,?ynzorg,z&akvakidalv,emret,??t&amok?i&juf?masih????v!.&em,g&olb,ro??moc?nc,ten?ude?ved,??ykuyr??v&b?c!.topsgolb,?ed!.&enilnigol,gnigats-oned,hcetaidem,lecrev,o&ned,tpyrctfihs,?ppa-rettalp,s&egap,rekrow,?vr&esi,uc,?weiverpbuhtig,ylf,??ih?l!.&di?fnoc?gro?lim?moc?nsa?ten?ude?vog???m!.&eman?gro?lim?m&oc?uesum??o&fni?r&ea?p???pooc?t&en?ni??ude?vog?zib???o&g?m??rt?s!.&bog?der?gro?moc?ude???t!.&bew-eht-no,naht-&esrow,retteb,?sndnyd,?d?gh?i?won??uqhv--nx??w&a!.moc?hs?l??b!.&gro?oc???c!.&gro?moc?ten?ude??cp??e&iver!.oby,?n?s??g?k!.&bme?dni?gro?moc?ten?ude?vog???m!.&ca?gro?m&oc?uesum??oc?pooc?t&en?ni??ude?vog?zib??b??o&csom?h!s??n?w??p!.&344x,de?en?o&c?g??ro?snduolc,ualeb???r!.&ca?gro?lim?oc?pooc?ten?vog??n??t!.&a46oa0fz--nx?b&82wrzc--nx?ulc??emag?gro?l&im?ru,?moc!.reliamym,?t&en?opsgolb,?ude?v&di?og?ta0cu--nx??zibe?業商?織組?路網???z!.&ca?gro?lim?oc?vog????x&a!.&cm,eb,gg,s&e,u,?tac,ue,yx,?t??c!.&hta,ofni,vog???e&d&ef?nay??ma!nab??rof?s??ilften?jt?m!.&bog?gro?moc?t&en?opsgolb,?ude??g?ma2ibgy--nx??o&b!x??f?rex??rbgn--nx?s!.vog??x&am&jt?kt??x???y&4punu--nx?7rr03--nx?a&d!i&loh?rfkcalb??ot??g?lp?p!ila??rot?ssin?wdaorb??b!.&duolcym,fo?hcetaidem,lim?moc!.topsgolb,?vog??ab?gur??c!.&ca?dtl?eman?gro?m&oc!.&ecrofelacs.j,topsgolb,??t??orp?s&egolke?serp??t&en?nemailrap??vog?zib??amrahp?nega??d&dadog?uts??e&kcoh?ltneb?n&dys?om?rotta??snikcm??g!.&eb,gro?moc?oc?ten?ude?vog??olonhcet!.oc,?rene??hpargotohp?id?k!.&gro?moc?ten?ude?vog??s??l!.&clp?d&em?i??gro?hcs?moc?ten?ude?vog??f?imaf!nacirema??l&a?il??ppus??m!.&eman?gro?lim?moc?t&en?opsgolb,?ude?vog?zib??edaca!.laiciffo,?ra??n&a&ffit?pmoc!ylimafa???os??o&j?s??p!.&gro?lim?moc?pooc?ten?ude?vog???r&e&corg?grus?llag?viled??lewej?otcerid?tnuoc?uxul??s!.&gro?lim?moc?ten?ude?vog??pil??t&efas?i&c?ledif?n&ifx?ummoc!.&bdnevar,gon,murofym,???r&ahc?uces??srevinu??laer?r&ap!.oby,?eporp??uaeb??u!.&bug?gro?lim?moc!.topsgolb,?ten?ude??b!tseb???van!dlo??xes??z&a!.&eman?gro?lim?moc?o&fni?rp??pp?t&en?ni??ude?vog?zib???b!.&az,gro?jsg,moc?ten?ude?vog???c!.&4e,inum.duolc.&rsu,tlf,?m&laer,urtnecatem.motsuc,?oc,topsgolb,??d!.&cos?gro?lop?m&oc?t??ossa?t&en?ra??ude?vog???ib!.&duolcsd,e&ht-rof,mos-rof,rom-rof,?izoj,nafamm,p&i&-on,fles,?ohbew,tfym,?retteb-rof,snd&nyd,uolc,?xro,?g??k!.&duolcj,gro?lim?moc?t&en?ropeletzak.saapu,?ude?vog???m!.&ca?gro?lim?oc?ten?ude?v&da?og????n!.&asq-irom--nx?ca?gro?htlaeh?i&r&c?o&am?ām???wi!k???keeg?l&im?oohcs??neg?oc!.topsgolb,?t&en?nemailrap?vog???a!niflla???rawhcs?s!.&ca?gro?oc???t!.&c&a?s??e&m?n??ibom?l&etoh?im??o&c?fni?g??ro?vt???u!.&gro?moc?oc?ten??rwon??yx!.&e&nozlacol,tisgolb,?gnitfarc,otpaz,??zub??λε?υε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур!.&арамас,бпс,гро,зиб,ичос,ксм,м&ок,ырк,?рим,я,??тйас?фр?юе?յահ?לארשי?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?ي&رحبلا?طسلف???ه&ارمه?يدوعسلا??وكمارا?يبظوبا?ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ວາລ?ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ン&ゾマア?ョシッァフ??业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?販通?车汽众大?逊马亚?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
 
   /**
    * If a hostname is not a key in the EXCLUDE map, and if removing its leftmost component results
@@ -50,7 +50,7 @@
    */
   public static final ImmutableMap<String, PublicSuffixType> UNDER =
       TrieParser.parseTrie(
-          "ac.vedwa,d&b?uolc.&etiso&isnes,tnegam,?iaznab,rehcnar-no,scitats,??e&b.lrusnart,d.ecapsrebu,noz.notirt,t&atse.etupmoc,is.hsmroftalp,?y??gp?h&c.tenerif:.cvs,,k?trae.sppad:.zzb,,?k&c?f?nil.bewd,rowten.secla,u.hcs??ln.lrusnart,m&j?m?oc.&aimhtirogla,duolcmeaeboda.ved,edonil.recnalabedon,ico-remotsuc:.&ico,pco,sco,?,mme0,s&t&cejboedonil,nemelepiuq,?wanozama.&1-etupmoc,ble,etupmoc,??t&neyoj.snc,opsppa.r,???nc.moc.swanozama.&ble,etupmoc,?o&c.pato,i.&duolciaznab.sdraykcab,elacsnoom,oir-no,reniatnoceruza,s&3k-no,olots,?xcq.sys,y5s,??p&j.&a&mahokoy?yogan??ebok?i&adnes?kasawak??oroppas?uhsuykatik??n??r&b.mon?e??s&edoc.owo,w.rosivda,?t&a.&ofnistro.&nednuk,xe,?smcerutuf:.&ni,xe,?,?en.cimonotpyrc,?u&e.lrusnart,r.onijym.&gni&dnal,tsoh,?murtceps,spv,??ved.&erahbew,gts,lcl,?z&c.murtnecatem.duolc,yx.tibelet,??");
+          "ac.vedwa,d&b?uolc.&etiso&isnes,tnegam,?iaznab,rehcnar-no,scitats,??e&b.lrusnart,d.&ecapsrebu,yksurf,?noz.notirt,t&atse.etupmoc,is.&hsmroftalp,tst,???gp?h&c.tenerif:.cvs,,k?trae.sppad:.zzb,,?k&c?f?nil.bewd,rowten.secla,u.hcs??ln.lrusnart,m&j?m?oc.&duolcmeaeboda.ved,edonil.recnalabedon,ico-remotsuc:.&ico,pco,sco,?,lrihwyap,mme0,osseccandcved,s&t&cejboedonil,nemelepiuq,?wanozama.&1-etupmoc,ble,etupmoc,??t&neyoj.snc,opsppa.r,???n&c.moc.swanozama.&ble,etupmoc,?ur.edoc,?o&c.pato,i.&duolciaznab.sdraykcab,elacsnoom,oir-no,reniatnoceruza,s&3k-no,olots,?xcq.sys,y5s,??p&j.&a&mahokoy?yogan??ebok?i&adnes?kasawak??oroppas?uhsuykatik??n?pa.&knalfhtron,repoleved,??r&b.mon?e??s&edoc.owo,w.rosivda,?t&a.&ofnistro.&nednuk,xe,?smcerutuf:.&ni,xe,?,?en.&cimonotpyrc,hvo.&gnitsoh,saapbew,???u&e.lrusnart,r.onijym.&gni&dnal,tsoh,?murtceps,spv,??ved.&e&gats&gts,lcl,?rahbew,?gts,lcl,yawetag,?z&c.murtnecatem.duolc,yx.tibelet,??");
 
   /**
    * The elements in this map would pass the UNDER test, but are known not to be public suffixes and
@@ -59,5 +59,5 @@
    */
   public static final ImmutableMap<String, PublicSuffixType> EXCLUDED =
       TrieParser.parseTrie(
-          "kc.www?moc.aimhtirogla.&smaet,tset,?pj.&a&mahokoy.ytic?yogan.ytic??ebok.ytic?i&adnes.ytic?kasawak.ytic??oroppas.ytic?uhsuykatik.ytic???");
+          "kc.www?pj.&a&mahokoy.ytic?yogan.ytic??ebok.ytic?i&adnes.ytic?kasawak.ytic??oroppas.ytic?uhsuykatik.ytic???");
 }
diff --git a/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixType.java b/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixType.java
old mode 100755
new mode 100644
index f0c5292..be1d07f
--- a/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixType.java
+++ b/android/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixType.java
@@ -62,8 +62,4 @@
     }
     throw new IllegalArgumentException("No enum corresponding to given code: " + code);
   }
-
-  static PublicSuffixType fromIsPrivate(boolean isPrivate) {
-    return isPrivate ? PRIVATE : REGISTRY;
-  }
 }
diff --git a/android/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java b/android/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
old mode 100755
new mode 100644
index 9c387eb..dd77780
--- a/android/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
+++ b/android/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
@@ -17,8 +17,8 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-import java.util.List;
+import com.google.common.collect.Queues;
+import java.util.Deque;
 
 /** Parser for a map of reversed domain names stored as a serialized radix tree. */
 @GwtCompatible
@@ -34,7 +34,7 @@
     int encodedLen = encoded.length();
     int idx = 0;
     while (idx < encodedLen) {
-      idx += doParseTrieToBuilder(Lists.<CharSequence>newLinkedList(), encoded, idx, builder);
+      idx += doParseTrieToBuilder(Queues.<CharSequence>newArrayDeque(), encoded, idx, builder);
     }
     return builder.build();
   }
@@ -50,7 +50,7 @@
    * @return The number of characters consumed from {@code encoded}.
    */
   private static int doParseTrieToBuilder(
-      List<CharSequence> stack,
+      Deque<CharSequence> stack,
       CharSequence encoded,
       int start,
       ImmutableMap.Builder<String, PublicSuffixType> builder) {
@@ -67,7 +67,7 @@
       }
     }
 
-    stack.add(0, reverse(encoded.subSequence(start, idx)));
+    stack.push(reverse(encoded.subSequence(start, idx)));
 
     if (c == '!' || c == '?' || c == ':' || c == ',') {
       // '!' represents an interior node that represents a REGISTRY entry in the map.
@@ -92,7 +92,7 @@
         }
       }
     }
-    stack.remove(0);
+    stack.pop();
     return idx - start;
   }
 
diff --git a/android/pom.xml b/android/pom.xml
index 748d104..3620bb3 100644
--- a/android/pom.xml
+++ b/android/pom.xml
@@ -6,7 +6,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.guava</groupId>
   <artifactId>guava-parent</artifactId>
-  <version>30.0-android</version>
+  <version>31.0.1-android</version>
   <packaging>pom</packaging>
   <name>Guava Maven Parent</name>
   <description>Parent for guava artifacts</description>
@@ -14,10 +14,11 @@
   <properties>
     <!-- Override this with -Dtest.include="**/SomeTest.java" on the CLI -->
     <test.include>%regex[.*.class]</test.include>
-    <truth.version>1.0</truth.version>
-    <animal.sniffer.version>1.18</animal.sniffer.version>
+    <truth.version>1.1.2</truth.version>
+    <checker-framework.version>3.12.0</checker-framework.version>
+    <animal.sniffer.version>1.20</animal.sniffer.version>
     <maven-javadoc-plugin.version>3.1.0</maven-javadoc-plugin.version>
-    <maven-source-plugin.version>3.2.0</maven-source-plugin.version>
+    <maven-source-plugin.version>3.2.1</maven-source-plugin.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   <issueManagement>
@@ -52,8 +53,8 @@
     </developer>
   </developers>
   <ciManagement>
-    <system>Travis CI</system>
-    <url>https://travis-ci.org/google/guava</url>
+    <system>GitHub Actions</system>
+    <url>https://github.com/google/guava/actions</url>
   </ciManagement>
   <modules>
     <module>guava</module>
@@ -116,8 +117,18 @@
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.8.1</version>
           <configuration>
-            <source>1.7</source>
-            <target>1.7</target>
+            <source>1.8</source>
+            <target>1.8</target>
+            <compilerArgs>
+              <!--
+                   Make includes/excludes fully work:
+                   https://issues.apache.org/jira/browse/MCOMPILER-174
+
+                   (Compare what guava-gwt has to do for maven-javadoc-plugin.)
+              -->
+              <arg>-sourcepath</arg>
+              <arg>doesnotexist</arg>
+            </compilerArgs>
           </configuration>
         </plugin>
         <plugin>
@@ -140,7 +151,7 @@
           <artifactId>animal-sniffer-maven-plugin</artifactId>
           <version>${animal.sniffer.version}</version>
           <configuration>
-            <annotations>com.google.common.util.concurrent.IgnoreJRERequirement</annotations>
+            <checkTestClasses>true</checkTestClasses>
             <signature>
               <groupId>org.codehaus.mojo.signature</groupId>
               <artifactId>java16-sun</artifactId>
@@ -220,7 +231,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-enforcer-plugin</artifactId>
-          <version>3.0.0-M2</version>
+          <version>3.0.0-M3</version>
         </plugin>
       </plugins>
     </pluginManagement>
@@ -251,13 +262,25 @@
       </dependency>
       <dependency>
         <groupId>org.checkerframework</groupId>
+        <artifactId>checker-qual</artifactId>
+        <version>${checker-framework.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.checkerframework</groupId>
+        <artifactId>checker-qual</artifactId>
+        <version>${checker-framework.version}</version>
+        <classifier>sources</classifier>
+      </dependency>
+      <!-- TODO(cpovirk): Remove checker-compat-qual after we finish migrating to type annotations. -->
+      <dependency>
+        <groupId>org.checkerframework</groupId>
         <artifactId>checker-compat-qual</artifactId>
         <version>2.5.5</version>
       </dependency>
       <dependency>
         <groupId>com.google.errorprone</groupId>
         <artifactId>error_prone_annotations</artifactId>
-        <version>2.3.4</version>
+        <version>2.7.1</version>
       </dependency>
       <dependency>
         <groupId>com.google.j2objc</groupId>
@@ -267,25 +290,25 @@
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
-        <version>4.13</version>
+        <version>4.13.2</version>
         <scope>test</scope>
       </dependency>
       <dependency>
         <groupId>org.easymock</groupId>
         <artifactId>easymock</artifactId>
-        <version>3.0</version>
+        <version>4.3</version>
         <scope>test</scope>
       </dependency>
       <dependency>
         <groupId>org.mockito</groupId>
         <artifactId>mockito-core</artifactId>
-        <version>2.19.0</version>
+        <version>3.9.0</version>
         <scope>test</scope>
       </dependency>
       <dependency>
         <groupId>com.google.jimfs</groupId>
         <artifactId>jimfs</artifactId>
-        <version>1.1</version>
+        <version>1.2</version>
         <scope>test</scope>
       </dependency>
       <dependency>
diff --git a/cycle_whitelist.txt b/cycle_suppress_list.txt
similarity index 98%
rename from cycle_whitelist.txt
rename to cycle_suppress_list.txt
index 96c9e1b..ec0abc7 100644
--- a/cycle_whitelist.txt
+++ b/cycle_suppress_list.txt
@@ -1,4 +1,4 @@
-# TODO(user,user): Resolve cycles
+# TODO(user): Resolve cycles
 
 NAMESPACE com.google.common.collect.testing
 NAMESPACE com.google.common.collect.testing.google
diff --git a/futures/listenablefuture1/src/com/google/common/util/concurrent/ListenableFuture.java b/futures/listenablefuture1/src/com/google/common/util/concurrent/ListenableFuture.java
index 98e31ed..cf0199a 100644
--- a/futures/listenablefuture1/src/com/google/common/util/concurrent/ListenableFuture.java
+++ b/futures/listenablefuture1/src/com/google/common/util/concurrent/ListenableFuture.java
@@ -18,6 +18,7 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Future} that accepts completion listeners. Each listener has an associated executor, and
@@ -99,8 +100,32 @@
  * @author Nishant Thakkar
  * @since 1.0
  */
+/*
+ * Some of the annotations below were added after we released our separate
+ * com.google.guava:listenablefuture:1.0 artifact. (For more on that artifact, see
+ * https://github.com/google/guava/releases/tag/v27.0) This means that the copy of ListenableFuture
+ * in com.google.guava:guava differs from the "frozen" copy in the listenablefuture artifact. This
+ * could in principle cause problems for some users. Still, we expect that the benefits of the
+ * nullness annotations in particular will outweigh the costs. (And it's worth noting that we have
+ * released multiple ListenableFuture.class files that are not byte-for-byte compatible even from
+ * the beginning, thanks to using different `-source -target` values for compiling our `-jre` and
+ * `-android` "flavors.")
+ *
+ * (We could consider releasing a listenablefuture:1.0.1 someday. But we would want to look into how
+ * that affects users, especially users of the Android Gradle Plugin, since the plugin developers
+ * put in a special hack for us: https://issuetracker.google.com/issues/131431257)
+ */
 @DoNotMock("Use the methods in Futures (like immediateFuture) or SettableFuture")
-public interface ListenableFuture<V> extends Future<V> {
+/*
+ * It would make sense to also annotate this class with @ElementTypesAreNonnullByDefault. However,
+ * it makes no difference because this class is already covered by the package-level
+ * @ParametersAreNonnullByDefault, and this class declares only parameters, not return types or
+ * fields. (Not to mention that we'll be removing all @*AreNonnullByDefault annotations after tools
+ * understand .) And it's fortunate that the annotation makes no difference, because
+ * we're seeing a breakage internally when we add that annotation :)
+ *
+ */
+public interface ListenableFuture<V extends @Nullable Object> extends Future<V> {
   /**
    * Registers a listener to be {@linkplain Executor#execute(Runnable) run} on the given executor.
    * The listener will run when the {@code Future}'s computation is {@linkplain Future#isDone()
diff --git a/guava-bom/pom.xml b/guava-bom/pom.xml
index 1df9577..58c001e 100644
--- a/guava-bom/pom.xml
+++ b/guava-bom/pom.xml
@@ -8,13 +8,14 @@
 
   <groupId>com.google.guava</groupId>
   <artifactId>guava-bom</artifactId>
-  <version>30.0-jre</version>
+  <version>31.0.1-jre</version>
   <packaging>pom</packaging>
   
   <parent>
     <groupId>org.sonatype.oss</groupId>
     <artifactId>oss-parent</artifactId>
     <version>9</version>
+    <relativePath></relativePath>
   </parent>
 
   <name>Guava BOM</name>
diff --git a/guava-gwt/pom.xml b/guava-gwt/pom.xml
index 44db390..310cbdd 100644
--- a/guava-gwt/pom.xml
+++ b/guava-gwt/pom.xml
@@ -5,19 +5,19 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>30.0-jre</version>
+    <version>31.0.1-jre</version>
   </parent>
   <artifactId>guava-gwt</artifactId>
   <name>Guava GWT compatible libs</name>
   <description>
     Guava is a suite of core and expanded libraries that include
-    utility classes, google's collections, io classes, and much
+    utility classes, Google's collections, I/O classes, and
     much more.
 
     This project includes GWT-friendly sources.
   </description>
   <properties>
-    <gwt.version>2.8.2</gwt.version>
+    <gwt.version>2.9.0</gwt.version>
     <gwt.plugin.version>2.8.2</gwt.plugin.version>
     <gwt.logLevel>WARN</gwt.logLevel>
   </properties>
@@ -55,7 +55,7 @@
     <dependency>
       <groupId>com.google.elemental2</groupId>
       <artifactId>elemental2-promise</artifactId>
-      <version>1.0.0-RC1</version>
+      <version>1.1.0</version>
     </dependency>
     <dependency>
       <groupId>com.google.guava</groupId>
@@ -304,6 +304,12 @@
                     <contains text="@GwtCompatible"/>
                   </fileset>
                 </copy>
+                <replace token="@Nullable" value="">
+                  <fileset dir="${project.build.directory}">
+                    <include name="guava-gwt-sources/**/*.java"/>
+                    <include name="guava-test-gwt-sources/**/*.java"/>
+                  </fileset>
+                </replace>
               </target>
             </configuration>
           </execution>
diff --git a/guava-gwt/src-super/com/google/common/cache/super/com/google/common/cache/LocalCache.java b/guava-gwt/src-super/com/google/common/cache/super/com/google/common/cache/LocalCache.java
index dba29ff..8530def 100644
--- a/guava-gwt/src-super/com/google/common/cache/super/com/google/common/cache/LocalCache.java
+++ b/guava-gwt/src-super/com/google/common/cache/super/com/google/common/cache/LocalCache.java
@@ -550,7 +550,7 @@
     @Override
     public Entry<K, V> next() {
       if (nextEntry == null) {
-        hasNext();
+        boolean unused = hasNext();
 
         if (nextEntry == null) {
           throw new NoSuchElementException();
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableBiMap.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableBiMap.java
index 8236f00..ff98965 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableBiMap.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableBiMap.java
@@ -65,6 +65,93 @@
     return new RegularImmutableBiMap<K, V>(ImmutableMap.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5));
   }
 
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+    return new RegularImmutableBiMap<K, V>(
+        ImmutableMap.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6));
+  }
+
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+    return new RegularImmutableBiMap<K, V>(
+        ImmutableMap.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7));
+  }
+
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8) {
+    return new RegularImmutableBiMap<K, V>(
+        ImmutableMap.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8));
+  }
+
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9) {
+    return new RegularImmutableBiMap<K, V>(
+        ImmutableMap.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9));
+  }
+
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9,
+      K k10,
+      V v10) {
+    return new RegularImmutableBiMap<K, V>(
+        ImmutableMap.of(
+            k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10));
+  }
+
+  @SafeVarargs
+  public static <K, V> ImmutableBiMap<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) {
+    return new RegularImmutableBiMap<K, V>(ImmutableMap.ofEntries(entries));
+  }
+
   public static <K, V> Builder<K, V> builder() {
     return new Builder<K, V>();
   }
@@ -113,11 +200,16 @@
 
     @Override
     public ImmutableBiMap<K, V> build() {
-      ImmutableMap<K, V> map = super.build();
+      return buildOrThrow();
+    }
+
+    @Override
+    public ImmutableBiMap<K, V> buildOrThrow() {
+      ImmutableMap<K, V> map = super.buildOrThrow();
       if (map.isEmpty()) {
         return of();
       }
-      return new RegularImmutableBiMap<K, V>(super.build());
+      return new RegularImmutableBiMap<K, V>(super.buildOrThrow());
     }
 
     @Override
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableMap.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableMap.java
index 550b7d1..cef789a 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableMap.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableMap.java
@@ -117,7 +117,128 @@
         entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3), entryOf(k4, v4), entryOf(k5, v5));
   }
 
-  // looking for of() with > 5 entries? Use the builder instead.
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+    return new RegularImmutableMap<K, V>(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6));
+  }
+
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+    return new RegularImmutableMap<K, V>(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7));
+  }
+
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8) {
+    return new RegularImmutableMap<K, V>(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8));
+  }
+
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9) {
+    return new RegularImmutableMap<K, V>(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8),
+        entryOf(k9, v9));
+  }
+
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9,
+      K k10,
+      V v10) {
+    return new RegularImmutableMap<K, V>(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8),
+        entryOf(k9, v9),
+        entryOf(k10, v10));
+  }
+
+  // looking for of() with > 10 entries? Use the builder instead.
+
+  @SafeVarargs
+  public static <K, V> ImmutableMap<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) {
+    return new RegularImmutableMap(entries);
+  }
 
   public static <K, V> Builder<K, V> builder() {
     return new Builder<K, V>();
@@ -186,6 +307,10 @@
     }
 
     public ImmutableMap<K, V> build() {
+      return buildOrThrow();
+    }
+
+    public ImmutableMap<K, V> buildOrThrow() {
       if (valueComparator != null) {
         Collections.sort(
             entries, Ordering.from(valueComparator).onResultOf(Maps.<V>valueFunction()));
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSet.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSet.java
index 6d4b800..d5a8dad 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSet.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSet.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -174,6 +175,24 @@
   @Override
   public abstract UnmodifiableIterator<E> iterator();
 
+  abstract static class CachingAsList<E> extends ImmutableSet<E> {
+    @LazyInit private transient ImmutableList<E> asList;
+
+    @Override
+    public ImmutableList<E> asList() {
+      ImmutableList<E> result = asList;
+      if (result == null) {
+        return asList = createAsList();
+      } else {
+        return result;
+      }
+    }
+
+    ImmutableList<E> createAsList() {
+      return new RegularImmutableAsList<E>(this, toArray());
+    }
+  }
+
   abstract static class Indexed<E> extends ImmutableSet<E> {
     abstract E get(int index);
 
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSortedMap.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSortedMap.java
index d255c35..fb626be 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSortedMap.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/ImmutableSortedMap.java
@@ -129,6 +129,127 @@
         .build();
   }
 
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+    return new Builder<K, V>(Ordering.natural())
+        .put(k1, v1)
+        .put(k2, v2)
+        .put(k3, v3)
+        .put(k4, v4)
+        .put(k5, v5)
+        .put(k6, v6)
+        .build();
+  }
+
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+    return new Builder<K, V>(Ordering.natural())
+        .put(k1, v1)
+        .put(k2, v2)
+        .put(k3, v3)
+        .put(k4, v4)
+        .put(k5, v5)
+        .put(k6, v6)
+        .put(k7, v7)
+        .build();
+  }
+
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8) {
+    return new Builder<K, V>(Ordering.natural())
+        .put(k1, v1)
+        .put(k2, v2)
+        .put(k3, v3)
+        .put(k4, v4)
+        .put(k5, v5)
+        .put(k6, v6)
+        .put(k7, v7)
+        .put(k8, v8)
+        .build();
+  }
+
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9) {
+    return new Builder<K, V>(Ordering.natural())
+        .put(k1, v1)
+        .put(k2, v2)
+        .put(k3, v3)
+        .put(k4, v4)
+        .put(k5, v5)
+        .put(k6, v6)
+        .put(k7, v7)
+        .put(k8, v8)
+        .put(k9, v9)
+        .build();
+  }
+
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9,
+      K k10,
+      V v10) {
+    return new Builder<K, V>(Ordering.natural())
+        .put(k1, v1)
+        .put(k2, v2)
+        .put(k3, v3)
+        .put(k4, v4)
+        .put(k5, v5)
+        .put(k6, v6)
+        .put(k7, v7)
+        .put(k8, v8)
+        .put(k9, v9)
+        .put(k10, v10)
+        .build();
+  }
+
   public static <K, V> ImmutableSortedMap<K, V> copyOf(Map<? extends K, ? extends V> map) {
     return copyOfInternal((Map) map, (Ordering<K>) Ordering.natural());
   }
@@ -258,6 +379,11 @@
 
     @Override
     public ImmutableSortedMap<K, V> build() {
+      return buildOrThrow();
+    }
+
+    @Override
+    public ImmutableSortedMap<K, V> buildOrThrow() {
       SortedMap<K, V> delegate = newModifiableDelegate(comparator);
       for (Entry<? extends K, ? extends V> entry : entries) {
         putEntryWithChecks(delegate, entry);
diff --git a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/Platform.java b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/Platform.java
index bb9fc16..4b85849 100644
--- a/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/Platform.java
+++ b/guava-gwt/src-super/com/google/common/collect/super/com/google/common/collect/Platform.java
@@ -17,8 +17,10 @@
 package com.google.common.collect;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 import jsinterop.annotations.JsPackage;
 import jsinterop.annotations.JsProperty;
 import jsinterop.annotations.JsType;
@@ -43,6 +45,14 @@
     return Sets.newHashSetWithExpectedSize(expectedSize);
   }
 
+  static <E> Set<E> newConcurrentHashSet() {
+    // GWT's ConcurrentHashMap is a wrapper around HashMap, but it rejects null keys, which matches
+    // the behaviour of the non-GWT implementation of newConcurrentHashSet().
+    // On the other hand HashSet might be better for code size if apps aren't
+    // already using Collections.newSetFromMap and ConcurrentHashMap.
+    return Collections.newSetFromMap(new ConcurrentHashMap<E, Boolean>());
+  }
+
   static <E> Set<E> newLinkedHashSetWithExpectedSize(int expectedSize) {
     return Sets.newLinkedHashSetWithExpectedSize(expectedSize);
   }
diff --git a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AbstractFuture.java b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AbstractFuture.java
index 900d5f7..0f22cac 100644
--- a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AbstractFuture.java
+++ b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/AbstractFuture.java
@@ -36,6 +36,7 @@
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Emulation for AbstractFuture in GWT. */
+@SuppressWarnings("nullness") // TODO(b/147136275): Remove once our checker understands & and |.
 public abstract class AbstractFuture<V> extends InternalFutureFailureAccess
     implements ListenableFuture<V> {
 
diff --git a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java
index 35cf502..4ce990d 100644
--- a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java
+++ b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java
@@ -14,8 +14,6 @@
 
 package com.google.common.util.concurrent;
 
-import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
-
 import com.google.common.base.Function;
 import java.util.concurrent.Executor;
 
@@ -31,15 +29,6 @@
    * your own instanceof tests.
    */
 
-  /** @deprecated Use the overload that requires an executor. */
-  @Deprecated
-  public static <V> ListenableFuture<V> catching(
-      ListenableFuture<? extends V> input,
-      Class<Throwable> exceptionType,
-      Function<? super Throwable, ? extends V> fallback) {
-    return AbstractCatchingFuture.create(input, exceptionType, fallback, directExecutor());
-  }
-
   public static <V> ListenableFuture<V> catching(
       ListenableFuture<? extends V> input,
       Class<Throwable> exceptionType,
@@ -48,15 +37,6 @@
     return AbstractCatchingFuture.create(input, exceptionType, fallback, executor);
   }
 
-  /** @deprecated Use the overload that requires an executor. */
-  @Deprecated
-  public static <V> ListenableFuture<V> catchingAsync(
-      ListenableFuture<? extends V> input,
-      Class<Throwable> exceptionType,
-      AsyncFunction<? super Throwable, ? extends V> fallback) {
-    return AbstractCatchingFuture.create(input, exceptionType, fallback, directExecutor());
-  }
-
   public static <V> ListenableFuture<V> catchingAsync(
       ListenableFuture<? extends V> input,
       Class<Throwable> exceptionType,
diff --git a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/InterruptibleTask.java b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/InterruptibleTask.java
index de2f062..1cd9f3e 100644
--- a/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/InterruptibleTask.java
+++ b/guava-gwt/src-super/com/google/common/util/concurrent/super/com/google/common/util/concurrent/InterruptibleTask.java
@@ -16,12 +16,14 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.util.concurrent.NullnessCasts.uncheckedCastNullableTToT;
+
 /** Emulation for InterruptibleTask in GWT. */
-abstract class InterruptibleTask<V> implements Runnable {
+abstract class InterruptibleTask<T> implements Runnable {
 
   @Override
   public void run() {
-    V result = null;
+    T result = null;
     Throwable error = null;
     if (isDone()) {
       return;
@@ -31,14 +33,21 @@
     } catch (Throwable t) {
       error = t;
     }
-    afterRanInterruptibly(result, error);
+    if (error == null) {
+      // The cast is safe because of the `run` and `error` checks.
+      afterRanInterruptiblySuccess(uncheckedCastNullableTToT(result));
+    } else {
+      afterRanInterruptiblyFailure(error);
+    }
   }
 
   abstract boolean isDone();
 
-  abstract V runInterruptibly() throws Exception;
+  abstract T runInterruptibly() throws Exception;
 
-  abstract void afterRanInterruptibly(V result, Throwable error);
+  abstract void afterRanInterruptiblySuccess(T result);
+
+  abstract void afterRanInterruptiblyFailure(Throwable error);
 
   final void interruptTask() {}
 
diff --git a/guava-gwt/src/com/google/common/annotations/Annotations.gwt.xml b/guava-gwt/src/com/google/common/annotations/Annotations.gwt.xml
index e284348..a281a1f 100644
--- a/guava-gwt/src/com/google/common/annotations/Annotations.gwt.xml
+++ b/guava-gwt/src/com/google/common/annotations/Annotations.gwt.xml
@@ -1,20 +1,26 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-      
-  <inherits name="com.google.gwt.core.Core"/>
-   
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/src/com/google/common/base/Base.gwt.xml b/guava-gwt/src/com/google/common/base/Base.gwt.xml
index 5ed0fb2..b8c0447 100644
--- a/guava-gwt/src/com/google/common/base/Base.gwt.xml
+++ b/guava-gwt/src/com/google/common/base/Base.gwt.xml
@@ -1,24 +1,27 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.user.User"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-      
-  <inherits name="com.google.gwt.core.Core"/>
-   
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/src/com/google/common/cache/Cache.gwt.xml b/guava-gwt/src/com/google/common/cache/Cache.gwt.xml
index 615b95f..fb58b997 100644
--- a/guava-gwt/src/com/google/common/cache/Cache.gwt.xml
+++ b/guava-gwt/src/com/google/common/cache/Cache.gwt.xml
@@ -1,30 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.math.Math"/>
-   
-  <inherits name="com.google.common.util.concurrent.Concurrent"/>
-     
-  <inherits name="com.google.gwt.core.Core"/>
-    
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.common.collect.Collect" />
+<inherits name="com.google.common.math.Math" />
+<inherits name="com.google.common.util.concurrent.Concurrent" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/src/com/google/common/collect/Collect.gwt.xml b/guava-gwt/src/com/google/common/collect/Collect.gwt.xml
index 765ac84..cb2b654 100644
--- a/guava-gwt/src/com/google/common/collect/Collect.gwt.xml
+++ b/guava-gwt/src/com/google/common/collect/Collect.gwt.xml
@@ -1,30 +1,30 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.user.User"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.math.Math"/>
-   
-  <inherits name="com.google.common.primitives.Primitives"/>
-      
-  <inherits name="com.google.gwt.core.Core"/>
-   
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.common.math.Math" />
+<inherits name="com.google.common.primitives.Primitives" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/src/com/google/common/escape/Escape.gwt.xml b/guava-gwt/src/com/google/common/escape/Escape.gwt.xml
index d04c253..5733706 100644
--- a/guava-gwt/src/com/google/common/escape/Escape.gwt.xml
+++ b/guava-gwt/src/com/google/common/escape/Escape.gwt.xml
@@ -1,24 +1,28 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-     
-  <inherits name="com.google.gwt.core.Core"/>
-    
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/src/com/google/common/html/Html.gwt.xml b/guava-gwt/src/com/google/common/html/Html.gwt.xml
index 143da9b..ca997f0 100644
--- a/guava-gwt/src/com/google/common/html/Html.gwt.xml
+++ b/guava-gwt/src/com/google/common/html/Html.gwt.xml
@@ -1,24 +1,28 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-     
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.escape.Escape"/>
-   
-  <inherits name="com.google.gwt.core.Core"/>
-   
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.escape.Escape" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/src/com/google/common/io/Io.gwt.xml b/guava-gwt/src/com/google/common/io/Io.gwt.xml
index 7790655..cb2b654 100644
--- a/guava-gwt/src/com/google/common/io/Io.gwt.xml
+++ b/guava-gwt/src/com/google/common/io/Io.gwt.xml
@@ -1,28 +1,30 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.math.Math"/>
-   
-  <inherits name="com.google.common.primitives.Primitives"/>
-     
-  <inherits name="com.google.gwt.core.Core"/>
-    
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.common.math.Math" />
+<inherits name="com.google.common.primitives.Primitives" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/src/com/google/common/math/Math.gwt.xml b/guava-gwt/src/com/google/common/math/Math.gwt.xml
index f5f9879..ff56f8e 100644
--- a/guava-gwt/src/com/google/common/math/Math.gwt.xml
+++ b/guava-gwt/src/com/google/common/math/Math.gwt.xml
@@ -1,26 +1,29 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.primitives.Primitives"/>
-     
-  <inherits name="com.google.gwt.core.Core"/>
-    
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.common.primitives.Primitives" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/src/com/google/common/net/Net.gwt.xml b/guava-gwt/src/com/google/common/net/Net.gwt.xml
index 19a6cb6..7024312 100644
--- a/guava-gwt/src/com/google/common/net/Net.gwt.xml
+++ b/guava-gwt/src/com/google/common/net/Net.gwt.xml
@@ -1,34 +1,32 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.user.User"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.escape.Escape"/>
-   
-  <inherits name="com.google.thirdparty.publicsuffix.PublicSuffixPatterns"/>
-   
-  <inherits name="com.google.thirdparty.publicsuffix.PublicSuffixType"/>
-     
-  <inherits name="com.google.gwt.core.Core"/>
-    
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.common.collect.Collect" />
+<inherits name="com.google.common.escape.Escape" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
+<inherits name="com.google.thirdparty.publicsuffix.PublicSuffixPatterns" />
+<inherits name="com.google.thirdparty.publicsuffix.PublicSuffixType" />
 </module>
diff --git a/guava-gwt/src/com/google/common/primitives/Primitives.gwt.xml b/guava-gwt/src/com/google/common/primitives/Primitives.gwt.xml
index 505f45c..5733706 100644
--- a/guava-gwt/src/com/google/common/primitives/Primitives.gwt.xml
+++ b/guava-gwt/src/com/google/common/primitives/Primitives.gwt.xml
@@ -1,26 +1,28 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.user.User"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-      
-  <inherits name="com.google.gwt.core.Core"/>
-   
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/src/com/google/common/util/concurrent/Concurrent.gwt.xml b/guava-gwt/src/com/google/common/util/concurrent/Concurrent.gwt.xml
index e80620d..92daff3 100644
--- a/guava-gwt/src/com/google/common/util/concurrent/Concurrent.gwt.xml
+++ b/guava-gwt/src/com/google/common/util/concurrent/Concurrent.gwt.xml
@@ -1,28 +1,30 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="elemental2.promise.Promise"/>
-      
-  <inherits name="com.google.gwt.core.Core"/>
-   
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.common.collect.Collect" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
+<inherits name="elemental2.promise.Promise" />
 </module>
diff --git a/guava-gwt/src/com/google/common/xml/Xml.gwt.xml b/guava-gwt/src/com/google/common/xml/Xml.gwt.xml
index d00c0ed..8a9e3b8 100644
--- a/guava-gwt/src/com/google/common/xml/Xml.gwt.xml
+++ b/guava-gwt/src/com/google/common/xml/Xml.gwt.xml
@@ -1,26 +1,29 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.escape.Escape"/>
-    
-  <inherits name="com.google.gwt.core.Core"/>
-   
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.common.escape.Escape" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.gwt.xml b/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.gwt.xml
index d5dd290..be70a5c 100644
--- a/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.gwt.xml
+++ b/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.gwt.xml
@@ -20,11 +20,11 @@
      (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
-<inherits name="com.google.gwt.user.User" />
 
-<inherits name="com.google.thirdparty.publicsuffix.PublicSuffixType" />
 <inherits name="com.google.common.annotations.Annotations" />
 <inherits name="com.google.common.base.Base" />
 <inherits name="com.google.common.collect.Collect" />
 <inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
+<inherits name="com.google.thirdparty.publicsuffix.PublicSuffixType" />
 </module>
diff --git a/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixType.gwt.xml b/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixType.gwt.xml
index ffbcaf1..b8c0447 100644
--- a/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixType.gwt.xml
+++ b/guava-gwt/src/com/google/thirdparty/publicsuffix/PublicSuffixType.gwt.xml
@@ -20,8 +20,8 @@
      (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
-<inherits name="com.google.gwt.user.User" />
 
 <inherits name="com.google.common.annotations.Annotations" />
 <inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/test/com/google/common/GuavaTests.gwt.xml b/guava-gwt/test/com/google/common/GuavaTests.gwt.xml
deleted file mode 100644
index 40ba822..0000000
--- a/guava-gwt/test/com/google/common/GuavaTests.gwt.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<module>
-  <inherits name="com.google.common.collect.testing.Testing" />
-  <inherits name="com.google.common.collect.testing.google.Google" />
-  <inherits name="com.google.common.escape.testing.Testing" />
-  <inherits name="com.google.common.testing.Testing" />
-
-  <inherits name="com.google.common.base.testModule" />
-  <inherits name="com.google.common.cache.testModule" />
-  <inherits name="com.google.common.collect.testModule" />
-  <inherits name="com.google.common.collect.testing.testModule" />
-  <inherits name="com.google.common.escape.testModule" />
-  <inherits name="com.google.common.html.testModule" />
-  <inherits name="com.google.common.io.testModule" />
-  <inherits name="com.google.common.math.testModule" />
-  <inherits name="com.google.common.net.testModule" />
-  <inherits name="com.google.common.primitives.testModule" />
-  <inherits name="com.google.common.testing.testModule" />
-  <inherits name="com.google.common.util.concurrent.testModule" />
-  <inherits name="com.google.common.xml.testModule" />
-
-  <source path="">
-    <include name="GuavaTestsEntryPoint.java" />
-  </source>
-  <entry-point class="com.google.common.GuavaTestsEntryPoint" />
-</module>
diff --git a/guava-gwt/test/com/google/common/base/testModule.gwt.xml b/guava-gwt/test/com/google/common/base/testModule.gwt.xml
deleted file mode 100644
index c87f3db..0000000
--- a/guava-gwt/test/com/google/common/base/testModule.gwt.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-            
-  <inherits name="com.google.common.truth.Truth"/>
-    
-  <entry-point class="com.google.common.base.TestModuleEntryPoint"/>
-   
-  <super-source path="super"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/cache/testModule.gwt.xml b/guava-gwt/test/com/google/common/cache/testModule.gwt.xml
deleted file mode 100644
index dae8396..0000000
--- a/guava-gwt/test/com/google/common/cache/testModule.gwt.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.cache.Cache"/>
-    
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-   
-  <inherits name="com.google.common.util.concurrent.Concurrent"/>
-      
-  <inherits name="com.google.common.truth.Truth"/>
-           
-  <entry-point class="com.google.common.cache.TestModuleEntryPoint"/>
-   
-  <super-source path="super"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/collect/testModule.gwt.xml b/guava-gwt/test/com/google/common/collect/testModule.gwt.xml
deleted file mode 100644
index a5f868d..0000000
--- a/guava-gwt/test/com/google/common/collect/testModule.gwt.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-      
-  <inherits name="com.google.common.collect.testing.Testing"/>
-   
-  <inherits name="com.google.common.collect.testing.google.Google"/>
-   
-  <inherits name="com.google.common.io.Io"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-     
-  <inherits name="com.google.common.truth.Truth"/>
-        
-  <entry-point class="com.google.common.collect.TestModuleEntryPoint"/>
-   
-  <super-source path="super"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/collect/testing/Testing.gwt.xml b/guava-gwt/test/com/google/common/collect/testing/Testing.gwt.xml
index d152637..6d1e97b 100644
--- a/guava-gwt/test/com/google/common/collect/testing/Testing.gwt.xml
+++ b/guava-gwt/test/com/google/common/collect/testing/Testing.gwt.xml
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.primitives.Primitives"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-     
-  <inherits name="com.google.gwt.core.Core"/>
-    
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.common.collect.Collect" />
+<inherits name="com.google.common.primitives.Primitives" />
+<inherits name="com.google.common.testing.Testing" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.junit.JUnit" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/test/com/google/common/collect/testing/google/Google.gwt.xml b/guava-gwt/test/com/google/common/collect/testing/google/Google.gwt.xml
index 5d88b92..5e90c31 100644
--- a/guava-gwt/test/com/google/common/collect/testing/google/Google.gwt.xml
+++ b/guava-gwt/test/com/google/common/collect/testing/google/Google.gwt.xml
@@ -1,34 +1,33 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.collect.testing.Testing"/>
-   
-  <inherits name="com.google.common.primitives.Primitives"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-   
-  <inherits name="com.google.gwt.core.Core"/>
-      
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.common.collect.Collect" />
+<inherits name="com.google.common.collect.testing.Testing" />
+<inherits name="com.google.common.primitives.Primitives" />
+<inherits name="com.google.common.testing.Testing" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.junit.JUnit" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/test/com/google/common/collect/testing/testModule.gwt.xml b/guava-gwt/test/com/google/common/collect/testing/testModule.gwt.xml
deleted file mode 100644
index 42b4a60..0000000
--- a/guava-gwt/test/com/google/common/collect/testing/testModule.gwt.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.collect.testing.Testing"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-        
-  <entry-point class="com.google.common.collect.testing.TestModuleEntryPoint"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/escape/testModule.gwt.xml b/guava-gwt/test/com/google/common/escape/testModule.gwt.xml
deleted file mode 100644
index e52723e..0000000
--- a/guava-gwt/test/com/google/common/escape/testModule.gwt.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.escape.Escape"/>
-   
-  <inherits name="com.google.common.escape.testing.Testing"/>
-   
-  <inherits name="com.google.common.html.Html"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-           
-  <entry-point class="com.google.common.escape.TestModuleEntryPoint"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/escape/testing/Testing.gwt.xml b/guava-gwt/test/com/google/common/escape/testing/Testing.gwt.xml
index 85cb436..c3a1bd4 100644
--- a/guava-gwt/test/com/google/common/escape/testing/Testing.gwt.xml
+++ b/guava-gwt/test/com/google/common/escape/testing/Testing.gwt.xml
@@ -20,10 +20,10 @@
      (I hope that this workaround does not cause its own problems in the future.)
 -->
 <super-source path="super"/>
-<inherits name="com.google.gwt.user.User" />
 
-<inherits name="com.google.gwt.junit.JUnit" />
 <inherits name="com.google.common.annotations.Annotations" />
 <inherits name="com.google.common.escape.Escape" />
 <inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.junit.JUnit" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/test/com/google/common/html/testModule.gwt.xml b/guava-gwt/test/com/google/common/html/testModule.gwt.xml
deleted file mode 100644
index 57719c0..0000000
--- a/guava-gwt/test/com/google/common/html/testModule.gwt.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.escape.testing.Testing"/>
-   
-  <inherits name="com.google.common.html.Html"/>
-      
-  <inherits name="com.google.common.truth.Truth"/>
-                     
-  <entry-point class="com.google.common.html.TestModuleEntryPoint"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/io/testModule.gwt.xml b/guava-gwt/test/com/google/common/io/testModule.gwt.xml
deleted file mode 100644
index 8b66886..0000000
--- a/guava-gwt/test/com/google/common/io/testModule.gwt.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.io.Io"/>
-   
-  <inherits name="com.google.common.math.Math"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-     
-  <inherits name="com.google.common.truth.Truth"/>
-           
-  <entry-point class="com.google.common.io.TestModuleEntryPoint"/>
-   
-  <super-source path="super"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/math/testModule.gwt.xml b/guava-gwt/test/com/google/common/math/testModule.gwt.xml
deleted file mode 100644
index af911d9..0000000
--- a/guava-gwt/test/com/google/common/math/testModule.gwt.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.math.Math"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-       
-  <inherits name="com.google.common.truth.Truth"/>
-       
-  <entry-point class="com.google.common.math.TestModuleEntryPoint"/>
-    
-  <super-source path="super"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/net/testModule.gwt.xml b/guava-gwt/test/com/google/common/net/testModule.gwt.xml
deleted file mode 100644
index d0ae466..0000000
--- a/guava-gwt/test/com/google/common/net/testModule.gwt.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-      
-  <inherits name="com.google.common.collect.testing.Testing"/>
-   
-  <inherits name="com.google.common.collect.testing.google.Google"/>
-   
-  <inherits name="com.google.common.escape.Escape"/>
-   
-  <inherits name="com.google.common.escape.testing.Testing"/>
-    
-  <inherits name="com.google.common.net.Net"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-      
-  <inherits name="com.google.common.truth.Truth"/>
-         
-  <entry-point class="com.google.common.net.TestModuleEntryPoint"/>
-    
-  <super-source path="super"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/primitives/testModule.gwt.xml b/guava-gwt/test/com/google/common/primitives/testModule.gwt.xml
deleted file mode 100644
index e37c58f..0000000
--- a/guava-gwt/test/com/google/common/primitives/testModule.gwt.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.collect.testing.Testing"/>
-   
-  <inherits name="com.google.common.primitives.Primitives"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-     
-  <inherits name="com.google.common.truth.Truth"/>
-           
-  <entry-point class="com.google.common.primitives.TestModuleEntryPoint"/>
-    
-  <super-source path="super"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/testing/Testing.gwt.xml b/guava-gwt/test/com/google/common/testing/Testing.gwt.xml
index 9929e53..0c58567 100644
--- a/guava-gwt/test/com/google/common/testing/Testing.gwt.xml
+++ b/guava-gwt/test/com/google/common/testing/Testing.gwt.xml
@@ -1,28 +1,30 @@
-<?xml version="1.0" encoding="utf-8"?>
 <module>
-   
-  <source path="">
-     
-    <!-- Hack to keep collect from hiding collect.testing supersource: -->
-     
-    <exclude name="**/testing/**"/>
-     
-  </source>
-    
-  <!-- We used to set this only for packages that had manual supersource. That worked everywhere that I know of except for one place: when running the GWT util.concurrent tests under Guava. The problem is that GWT responds poorly to two .gwt.xml files in the same Java package: https://goo.gl/pRV3Yn The summary is that it ignores one file in favor of the other. util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests. util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource. GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either. This causes it to fail to find AtomicLongMapTest. Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none. GWT is happy to ignore us when we specify a nonexistent path. (I hope that this workaround does not cause its own problems in the future.) -->
-   
-  <super-source path="super"/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-     
-  <inherits name="com.google.gwt.core.Core"/>
-    
+<source path="">
+  <!-- Hack to keep collect from hiding collect.testing supersource: -->
+  <exclude name="**/testing/**"/>
+</source>
+
+<!--
+     We used to set this only for packages that had manual supersource.
+     That worked everywhere that I know of except for one place:
+     when running the GWT util.concurrent tests under Guava.
+     The problem is that GWT responds poorly to two .gwt.xml files in the same Java package:
+     https://goo.gl/pRV3Yn
+     The summary is that it ignores one file in favor of the other.
+     util.concurrent, like nearly all our packages, has two .gwt.xml files: one for prod and one for tests.
+     util.concurrent, unlike our other packages, has, as of this writing, test supersource but no prod supersource.
+     GWT happens to use the prod .gwt.xml, so it looks for no supersource for tests, either.
+     This causes it to fail to find AtomicLongMapTest.
+     Our workaround is to tell GWT that util.concurrent and all other packages have prod supersource, even if they have none.
+     GWT is happy to ignore us when we specify a nonexistent path.
+     (I hope that this workaround does not cause its own problems in the future.)
+-->
+<super-source path="super"/>
+
+<inherits name="com.google.common.annotations.Annotations" />
+<inherits name="com.google.common.base.Base" />
+<inherits name="com.google.common.collect.Collect" />
+<inherits name="com.google.gwt.core.Core" />
+<inherits name="com.google.gwt.junit.JUnit" />
+<inherits name="com.google.gwt.user.User" />
 </module>
diff --git a/guava-gwt/test/com/google/common/testing/testModule.gwt.xml b/guava-gwt/test/com/google/common/testing/testModule.gwt.xml
deleted file mode 100644
index ed7645b..0000000
--- a/guava-gwt/test/com/google/common/testing/testModule.gwt.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-     
-  <inherits name="com.google.common.truth.Truth"/>
-        
-  <entry-point class="com.google.common.testing.TestModuleEntryPoint"/>
-   
-  <super-source path="super"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/util/concurrent/testModule.gwt.xml b/guava-gwt/test/com/google/common/util/concurrent/testModule.gwt.xml
deleted file mode 100644
index cea4250..0000000
--- a/guava-gwt/test/com/google/common/util/concurrent/testModule.gwt.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.base.Base"/>
-   
-  <inherits name="com.google.common.collect.Collect"/>
-   
-  <inherits name="com.google.common.testing.Testing"/>
-   
-  <inherits name="com.google.common.util.concurrent.Concurrent"/>
-    
-  <inherits name="com.google.common.truth.Truth"/>
-               
-  <entry-point class="com.google.common.util.concurrent.TestModuleEntryPoint"/>
-    
-  <super-source path="super"/>
-   
-</module>
diff --git a/guava-gwt/test/com/google/common/xml/testModule.gwt.xml b/guava-gwt/test/com/google/common/xml/testModule.gwt.xml
deleted file mode 100644
index 7f48ca0..0000000
--- a/guava-gwt/test/com/google/common/xml/testModule.gwt.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<module>
-   
-  <source path=""/>
-   
-  <inherits name="com.google.gwt.user.User"/>
-    
-  <inherits name="com.google.gwt.junit.JUnit"/>
-   
-  <inherits name="com.google.common.annotations.Annotations"/>
-   
-  <inherits name="com.google.common.escape.Escape"/>
-   
-  <inherits name="com.google.common.escape.testing.Testing"/>
-   
-  <inherits name="com.google.common.xml.Xml"/>
-      
-  <inherits name="com.google.common.truth.Truth"/>
-           
-  <entry-point class="com.google.common.xml.TestModuleEntryPoint"/>
-   
-</module>
diff --git a/guava-testlib/README.md b/guava-testlib/README.md
index c33f421..4368995 100644
--- a/guava-testlib/README.md
+++ b/guava-testlib/README.md
@@ -13,7 +13,7 @@
 <dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava-testlib</artifactId>
-  <version>30.0-jre</version>
+  <version>31.0.1-jre</version>
   <scope>test</scope>
 </dependency>
 ```
@@ -22,7 +22,7 @@
 
 ```gradle
 dependencies {
-  test 'com.google.guava:guava-testlib:30.0-jre'
+  test 'com.google.guava:guava-testlib:31.0.1-jre'
 }
 ```
 
@@ -48,4 +48,3 @@
 <!-- References -->
 
 [repackage]: https://github.com/google/guava/wiki/UseGuavaInYourBuild#what-if-i-want-to-use-beta-apis-from-a-library-that-people-use-as-a-dependency
-
diff --git a/guava-testlib/pom.xml b/guava-testlib/pom.xml
index 9411f74..aa812ae 100644
--- a/guava-testlib/pom.xml
+++ b/guava-testlib/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>30.0-jre</version>
+    <version>31.0.1-jre</version>
   </parent>
   <artifactId>guava-testlib</artifactId>
   <name>Guava Testing Library</name>
diff --git a/guava-testlib/src/com/google/common/collect/testing/CollectionTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/CollectionTestSuiteBuilder.java
index cf1ed23..5f9aff4 100644
--- a/guava-testlib/src/com/google/common/collect/testing/CollectionTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/CollectionTestSuiteBuilder.java
@@ -57,6 +57,8 @@
               .named(getName() + " reserialized")
               .withFeatures(computeReserializedCollectionFeatures(parentBuilder.getFeatures()))
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
     return derivedSuites;
diff --git a/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
index 0d921a5..b629fa9 100644
--- a/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/FeatureSpecificTestSuiteBuilder.java
@@ -81,7 +81,7 @@
     return self();
   }
 
-  protected Runnable getSetUp() {
+  public Runnable getSetUp() {
     return setUp;
   }
 
@@ -90,13 +90,13 @@
     return self();
   }
 
-  protected Runnable getTearDown() {
+  public Runnable getTearDown() {
     return tearDown;
   }
 
   // Features
 
-  private Set<Feature<?>> features = new LinkedHashSet<>();
+  private final Set<Feature<?>> features = new LinkedHashSet<>();
 
   /**
    * Configures this builder to produce tests appropriate for the given features. This method may be
@@ -138,7 +138,7 @@
 
   // Test suppression
 
-  private Set<Method> suppressedTests = new HashSet<>();
+  private final Set<Method> suppressedTests = new HashSet<>();
 
   /**
    * Prevents the given methods from being run as part of the test suite.
diff --git a/guava-testlib/src/com/google/common/collect/testing/ListTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/ListTestSuiteBuilder.java
index 5355f48..492a50c 100644
--- a/guava-testlib/src/com/google/common/collect/testing/ListTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/ListTestSuiteBuilder.java
@@ -114,6 +114,8 @@
               .named(getName() + " reserialized")
               .withFeatures(computeReserializedCollectionFeatures(parentBuilder.getFeatures()))
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
     return derivedSuites;
diff --git a/guava-testlib/src/com/google/common/collect/testing/MapTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/MapTestSuiteBuilder.java
index 0b02f3b..d1ce341 100644
--- a/guava-testlib/src/com/google/common/collect/testing/MapTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/MapTestSuiteBuilder.java
@@ -123,6 +123,8 @@
               .withFeatures(computeReserializedMapFeatures(parentBuilder.getFeatures()))
               .named(parentBuilder.getName() + " reserialized")
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
 
@@ -132,6 +134,8 @@
             .withFeatures(computeEntrySetFeatures(parentBuilder.getFeatures()))
             .named(parentBuilder.getName() + " entrySet")
             .suppressing(parentBuilder.getSuppressedTests())
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
 
     derivedSuites.add(
@@ -139,6 +143,8 @@
             .withFeatures(computeKeySetFeatures(parentBuilder.getFeatures()))
             .named(parentBuilder.getName() + " keys")
             .suppressing(parentBuilder.getSuppressedTests())
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
 
     derivedSuites.add(
@@ -147,6 +153,8 @@
             .named(parentBuilder.getName() + " values")
             .withFeatures(computeValuesCollectionFeatures(parentBuilder.getFeatures()))
             .suppressing(parentBuilder.getSuppressedTests())
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
 
     return derivedSuites;
diff --git a/guava-testlib/src/com/google/common/collect/testing/SetTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/SetTestSuiteBuilder.java
index 26a2870..4ac51a4 100644
--- a/guava-testlib/src/com/google/common/collect/testing/SetTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/SetTestSuiteBuilder.java
@@ -78,6 +78,8 @@
               .named(getName() + " reserialized")
               .withFeatures(computeReserializedCollectionFeatures(parentBuilder.getFeatures()))
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
     return derivedSuites;
diff --git a/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
index e95383a..aa1d6d5 100644
--- a/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/SortedMapTestSuiteBuilder.java
@@ -121,6 +121,8 @@
         .named(parentBuilder.getName() + " subMap " + from + "-" + to)
         .withFeatures(features)
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
diff --git a/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
index e97b08f..5092661 100644
--- a/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/SortedSetTestSuiteBuilder.java
@@ -94,6 +94,8 @@
         .named(parentBuilder.getName() + " subSet " + from + "-" + to)
         .withFeatures(features)
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/BiMapTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/google/BiMapTestSuiteBuilder.java
index fa21a71..0821fb0 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/BiMapTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/BiMapTestSuiteBuilder.java
@@ -88,6 +88,8 @@
             .suppressing(parentBuilder.getSuppressedTests())
             .suppressing(SetCreationTester.class.getMethods())
             // BiMap.entrySet() duplicate-handling behavior is too confusing for SetCreationTester
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
     /*
      * TODO(cpovirk): the Map tests duplicate most of this effort by using a
@@ -101,6 +103,8 @@
             .suppressing(parentBuilder.getSuppressedTests())
             .suppressing(SetCreationTester.class.getMethods())
             // BiMap.values() duplicate-handling behavior is too confusing for SetCreationTester
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
     if (!parentBuilder.getFeatures().contains(NoRecurse.INVERSE)) {
       derived.add(
@@ -109,6 +113,8 @@
               .withFeatures(computeInverseFeatures(parentBuilder.getFeatures()))
               .named(parentBuilder.getName() + " inverse")
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
 
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/MultimapTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/google/MultimapTestSuiteBuilder.java
index 6e5d5ed..af9d261 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/MultimapTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/MultimapTestSuiteBuilder.java
@@ -116,6 +116,8 @@
               .withFeatures(computeReserializedMultimapFeatures(parentBuilder.getFeatures()))
               .named(parentBuilder.getName() + " reserialized")
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
 
@@ -124,6 +126,8 @@
             .withFeatures(computeAsMapFeatures(parentBuilder.getFeatures()))
             .named(parentBuilder.getName() + ".asMap")
             .suppressing(parentBuilder.getSuppressedTests())
+            .withSetUp(parentBuilder.getSetUp())
+            .withTearDown(parentBuilder.getTearDown())
             .createTestSuite());
 
     derivedSuites.add(computeEntriesTestSuite(parentBuilder));
@@ -154,6 +158,8 @@
         .withFeatures(computeEntriesFeatures(parentBuilder.getFeatures()))
         .named(parentBuilder.getName() + ".entries")
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
@@ -165,6 +171,8 @@
         .withFeatures(computeMultimapGetFeatures(parentBuilder.getFeatures()))
         .named(parentBuilder.getName() + ".get[key]")
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
@@ -180,6 +188,8 @@
           .withFeatures(features)
           .named(parentBuilder.getName() + ".asMap[].get[key]")
           .suppressing(parentBuilder.getSuppressedTests())
+          .withSetUp(parentBuilder.getSetUp())
+          .withTearDown(parentBuilder.getTearDown())
           .createTestSuite();
     }
   }
@@ -192,6 +202,8 @@
         .withFeatures(computeKeysFeatures(parentBuilder.getFeatures()))
         .named(parentBuilder.getName() + ".keys")
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
diff --git a/guava-testlib/src/com/google/common/collect/testing/google/MultisetTestSuiteBuilder.java b/guava-testlib/src/com/google/common/collect/testing/google/MultisetTestSuiteBuilder.java
index 9e3d750..91d7a60 100644
--- a/guava-testlib/src/com/google/common/collect/testing/google/MultisetTestSuiteBuilder.java
+++ b/guava-testlib/src/com/google/common/collect/testing/google/MultisetTestSuiteBuilder.java
@@ -131,6 +131,8 @@
               .named(getName() + ".entrySet")
               .withFeatures(computeEntrySetFeatures(parentBuilder.getFeatures()))
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
 
@@ -141,6 +143,8 @@
               .named(getName() + " reserialized")
               .withFeatures(computeReserializedMultisetFeatures(parentBuilder.getFeatures()))
               .suppressing(parentBuilder.getSuppressedTests())
+              .withSetUp(parentBuilder.getSetUp())
+              .withTearDown(parentBuilder.getTearDown())
               .createTestSuite());
     }
     return derivedSuites;
@@ -154,6 +158,8 @@
         .named(getName() + ".elementSet")
         .withFeatures(computeElementSetFeatures(parentBuilder.getFeatures()))
         .suppressing(parentBuilder.getSuppressedTests())
+        .withSetUp(parentBuilder.getSetUp())
+        .withTearDown(parentBuilder.getTearDown())
         .createTestSuite();
   }
 
diff --git a/guava-testlib/src/com/google/common/collect/testing/testers/CollectionToArrayTester.java b/guava-testlib/src/com/google/common/collect/testing/testers/CollectionToArrayTester.java
index 83a4cea..b40fc36 100644
--- a/guava-testlib/src/com/google/common/collect/testing/testers/CollectionToArrayTester.java
+++ b/guava-testlib/src/com/google/common/collect/testing/testers/CollectionToArrayTester.java
@@ -48,8 +48,8 @@
   }
 
   /**
-   * {@link Collection#toArray(Object[])} says: "Note that <tt>toArray(new Object[0])</tt> is
-   * identical in function to <tt>toArray()</tt>."
+   * {@link Collection#toArray(Object[])} says: "Note that {@code toArray(new Object[0])} is
+   * identical in function to {@code toArray()}."
    *
    * <p>For maximum effect, the collection under test should be created from an element array of a
    * type other than {@code Object[]}.
diff --git a/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java b/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
index a2fe93a..e34b399 100644
--- a/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
+++ b/guava-testlib/src/com/google/common/testing/FreshValueGenerator.java
@@ -356,7 +356,7 @@
   private @interface Empty {}
 
   @Generates
-  private Class<?> generateClass() {
+  Class<?> generateClass() {
     return pickInstance(
         ImmutableList.of(
             int.class, long.class, void.class, Object.class, Object[].class, Iterable.class),
@@ -364,147 +364,147 @@
   }
 
   @Generates
-  private Object generateObject() {
+  Object generateObject() {
     return generateString();
   }
 
   @Generates
-  private Number generateNumber() {
+  Number generateNumber() {
     return generateInt();
   }
 
   @Generates
-  private int generateInt() {
+  int generateInt() {
     return freshness.get();
   }
 
   @Generates
-  private Integer generateInteger() {
+  Integer generateInteger() {
     return new Integer(generateInt());
   }
 
   @Generates
-  private long generateLong() {
+  long generateLong() {
     return generateInt();
   }
 
   @Generates
-  private Long generateLongObject() {
+  Long generateLongObject() {
     return new Long(generateLong());
   }
 
   @Generates
-  private float generateFloat() {
+  float generateFloat() {
     return generateInt();
   }
 
   @Generates
-  private Float generateFloatObject() {
+  Float generateFloatObject() {
     return new Float(generateFloat());
   }
 
   @Generates
-  private double generateDouble() {
+  double generateDouble() {
     return generateInt();
   }
 
   @Generates
-  private Double generateDoubleObject() {
+  Double generateDoubleObject() {
     return new Double(generateDouble());
   }
 
   @Generates
-  private short generateShort() {
+  short generateShort() {
     return (short) generateInt();
   }
 
   @Generates
-  private Short generateShortObject() {
+  Short generateShortObject() {
     return new Short(generateShort());
   }
 
   @Generates
-  private byte generateByte() {
+  byte generateByte() {
     return (byte) generateInt();
   }
 
   @Generates
-  private Byte generateByteObject() {
+  Byte generateByteObject() {
     return new Byte(generateByte());
   }
 
   @Generates
-  private char generateChar() {
+  char generateChar() {
     return generateString().charAt(0);
   }
 
   @Generates
-  private Character generateCharacter() {
+  Character generateCharacter() {
     return new Character(generateChar());
   }
 
   @Generates
-  private boolean generateBoolean() {
+  boolean generateBoolean() {
     return generateInt() % 2 == 0;
   }
 
   @Generates
-  private Boolean generateBooleanObject() {
+  Boolean generateBooleanObject() {
     return new Boolean(generateBoolean());
   }
 
   @Generates
-  private UnsignedInteger generateUnsignedInteger() {
+  UnsignedInteger generateUnsignedInteger() {
     return UnsignedInteger.fromIntBits(generateInt());
   }
 
   @Generates
-  private UnsignedLong generateUnsignedLong() {
+  UnsignedLong generateUnsignedLong() {
     return UnsignedLong.fromLongBits(generateLong());
   }
 
   @Generates
-  private BigInteger generateBigInteger() {
+  BigInteger generateBigInteger() {
     return BigInteger.valueOf(generateInt());
   }
 
   @Generates
-  private BigDecimal generateBigDecimal() {
+  BigDecimal generateBigDecimal() {
     return BigDecimal.valueOf(generateInt());
   }
 
   @Generates
-  private CharSequence generateCharSequence() {
+  CharSequence generateCharSequence() {
     return generateString();
   }
 
   @Generates
-  private String generateString() {
+  String generateString() {
     return Integer.toString(generateInt());
   }
 
   @Generates
-  private Comparable<?> generateComparable() {
+  Comparable<?> generateComparable() {
     return generateString();
   }
 
   @Generates
-  private Pattern generatePattern() {
+  Pattern generatePattern() {
     return Pattern.compile(generateString());
   }
 
   @Generates
-  private Charset generateCharset() {
+  Charset generateCharset() {
     return pickInstance(Charset.availableCharsets().values(), Charsets.UTF_8);
   }
 
   @Generates
-  private Locale generateLocale() {
+  Locale generateLocale() {
     return pickInstance(Locale.getAvailableLocales(), Locale.US);
   }
 
   @Generates
-  private Currency generateCurrency() {
+  Currency generateCurrency() {
     try {
       Method method = Currency.class.getMethod("getAvailableCurrencies");
       @SuppressWarnings("unchecked") // getAvailableCurrencies() returns Set<Currency>.
@@ -539,53 +539,53 @@
   }
 
   @Empty
-  private <T> Optional<T> generateJavaOptional() {
+  <T> Optional<T> generateJavaOptional() {
     return Optional.empty();
   }
 
   @Generates
-  private <T> Optional<T> generateJavaOptional(T value) {
+  <T> Optional<T> generateJavaOptional(T value) {
     return Optional.of(value);
   }
 
   @Generates
-  private OptionalInt generateOptionalInt() {
+  OptionalInt generateOptionalInt() {
     return OptionalInt.of(generateInt());
   }
 
   @Generates
-  private OptionalLong generateOptionalLong() {
+  OptionalLong generateOptionalLong() {
     return OptionalLong.of(generateLong());
   }
 
   @Generates
-  private OptionalDouble generateOptionalDouble() {
+  OptionalDouble generateOptionalDouble() {
     return OptionalDouble.of(generateDouble());
   }
 
   // common.base
   @Empty
-  private <T> com.google.common.base.Optional<T> generateGoogleOptional() {
+  <T> com.google.common.base.Optional<T> generateGoogleOptional() {
     return com.google.common.base.Optional.absent();
   }
 
   @Generates
-  private <T> com.google.common.base.Optional<T> generateGoogleOptional(T value) {
+  <T> com.google.common.base.Optional<T> generateGoogleOptional(T value) {
     return com.google.common.base.Optional.of(value);
   }
 
   @Generates
-  private Joiner generateJoiner() {
+  Joiner generateJoiner() {
     return Joiner.on(generateString());
   }
 
   @Generates
-  private Splitter generateSplitter() {
+  Splitter generateSplitter() {
     return Splitter.on(generateString());
   }
 
   @Generates
-  private <T> Equivalence<T> generateEquivalence() {
+  <T> Equivalence<T> generateEquivalence() {
     return new Equivalence<T>() {
       @Override
       protected boolean doEquivalent(T a, T b) {
@@ -607,7 +607,7 @@
   }
 
   @Generates
-  private CharMatcher generateCharMatcher() {
+  CharMatcher generateCharMatcher() {
     return new CharMatcher() {
       @Override
       public boolean matches(char c) {
@@ -624,7 +624,7 @@
   }
 
   @Generates
-  private Ticker generateTicker() {
+  Ticker generateTicker() {
     return new Ticker() {
       @Override
       public long read() {
@@ -642,12 +642,12 @@
 
   // collect
   @Generates
-  private <T> Comparator<T> generateComparator() {
+  <T> Comparator<T> generateComparator() {
     return generateOrdering();
   }
 
   @Generates
-  private <T> Ordering<T> generateOrdering() {
+  <T> Ordering<T> generateOrdering() {
     return new Ordering<T>() {
       @Override
       public int compare(T left, T right) {
@@ -664,279 +664,280 @@
   }
 
   @Empty
-  private static <C extends Comparable<?>> Range<C> generateRange() {
+  static <C extends Comparable<?>> Range<C> generateRange() {
     return Range.all();
   }
 
   @Generates
-  private static <C extends Comparable<?>> Range<C> generateRange(C freshElement) {
+  static <C extends Comparable<?>> Range<C> generateRange(C freshElement) {
     return Range.singleton(freshElement);
   }
 
   @Generates
-  private static <E> Iterable<E> generateIterable(E freshElement) {
+  static <E> Iterable<E> generateIterable(@Nullable E freshElement) {
     return generateList(freshElement);
   }
 
   @Generates
-  private static <E> Collection<E> generateCollection(E freshElement) {
+  static <E> Collection<E> generateCollection(@Nullable E freshElement) {
     return generateList(freshElement);
   }
 
   @Generates
-  private static <E> List<E> generateList(E freshElement) {
+  static <E> List<E> generateList(@Nullable E freshElement) {
     return generateArrayList(freshElement);
   }
 
   @Generates
-  private static <E> ArrayList<E> generateArrayList(E freshElement) {
+  static <E> ArrayList<E> generateArrayList(@Nullable E freshElement) {
     ArrayList<E> list = Lists.newArrayList();
     list.add(freshElement);
     return list;
   }
 
   @Generates
-  private static <E> LinkedList<E> generateLinkedList(E freshElement) {
+  static <E> LinkedList<E> generateLinkedList(@Nullable E freshElement) {
     LinkedList<E> list = Lists.newLinkedList();
     list.add(freshElement);
     return list;
   }
 
   @Generates
-  private static <E> ImmutableList<E> generateImmutableList(E freshElement) {
+  static <E> ImmutableList<E> generateImmutableList(E freshElement) {
     return ImmutableList.of(freshElement);
   }
 
   @Generates
-  private static <E> ImmutableCollection<E> generateImmutableCollection(E freshElement) {
+  static <E> ImmutableCollection<E> generateImmutableCollection(E freshElement) {
     return generateImmutableList(freshElement);
   }
 
   @Generates
-  private static <E> Set<E> generateSet(E freshElement) {
+  static <E> Set<E> generateSet(@Nullable E freshElement) {
     return generateHashSet(freshElement);
   }
 
   @Generates
-  private static <E> HashSet<E> generateHashSet(E freshElement) {
+  static <E> HashSet<E> generateHashSet(@Nullable E freshElement) {
     return generateLinkedHashSet(freshElement);
   }
 
   @Generates
-  private static <E> LinkedHashSet<E> generateLinkedHashSet(E freshElement) {
+  static <E> LinkedHashSet<E> generateLinkedHashSet(@Nullable E freshElement) {
     LinkedHashSet<E> set = Sets.newLinkedHashSet();
     set.add(freshElement);
     return set;
   }
 
   @Generates
-  private static <E> ImmutableSet<E> generateImmutableSet(E freshElement) {
+  static <E> ImmutableSet<E> generateImmutableSet(E freshElement) {
     return ImmutableSet.of(freshElement);
   }
 
   @Generates
-  private static <E extends Comparable<? super E>> SortedSet<E> generateSortedSet(E freshElement) {
+  static <E extends Comparable<? super E>> SortedSet<E> generateSortedSet(E freshElement) {
     return generateNavigableSet(freshElement);
   }
 
   @Generates
-  private static <E extends Comparable<? super E>> NavigableSet<E> generateNavigableSet(
-      E freshElement) {
+  static <E extends Comparable<? super E>> NavigableSet<E> generateNavigableSet(E freshElement) {
     return generateTreeSet(freshElement);
   }
 
   @Generates
-  private static <E extends Comparable<? super E>> TreeSet<E> generateTreeSet(E freshElement) {
+  static <E extends Comparable<? super E>> TreeSet<E> generateTreeSet(E freshElement) {
     TreeSet<E> set = Sets.newTreeSet();
     set.add(freshElement);
     return set;
   }
 
   @Generates
-  private static <E extends Comparable<? super E>> ImmutableSortedSet<E> generateImmutableSortedSet(
+  static <E extends Comparable<? super E>> ImmutableSortedSet<E> generateImmutableSortedSet(
       E freshElement) {
     return ImmutableSortedSet.of(freshElement);
   }
 
   @Generates
-  private static <E> Multiset<E> generateMultiset(E freshElement) {
+  static <E> Multiset<E> generateMultiset(@Nullable E freshElement) {
     return generateHashMultiset(freshElement);
   }
 
   @Generates
-  private static <E> HashMultiset<E> generateHashMultiset(E freshElement) {
+  static <E> HashMultiset<E> generateHashMultiset(@Nullable E freshElement) {
     HashMultiset<E> multiset = HashMultiset.create();
     multiset.add(freshElement);
     return multiset;
   }
 
   @Generates
-  private static <E> LinkedHashMultiset<E> generateLinkedHashMultiset(E freshElement) {
+  static <E> LinkedHashMultiset<E> generateLinkedHashMultiset(@Nullable E freshElement) {
     LinkedHashMultiset<E> multiset = LinkedHashMultiset.create();
     multiset.add(freshElement);
     return multiset;
   }
 
   @Generates
-  private static <E> ImmutableMultiset<E> generateImmutableMultiset(E freshElement) {
+  static <E> ImmutableMultiset<E> generateImmutableMultiset(E freshElement) {
     return ImmutableMultiset.of(freshElement);
   }
 
   @Generates
-  private static <E extends Comparable<E>> SortedMultiset<E> generateSortedMultiset(
-      E freshElement) {
+  static <E extends Comparable<E>> SortedMultiset<E> generateSortedMultiset(E freshElement) {
     return generateTreeMultiset(freshElement);
   }
 
   @Generates
-  private static <E extends Comparable<E>> TreeMultiset<E> generateTreeMultiset(E freshElement) {
+  static <E extends Comparable<E>> TreeMultiset<E> generateTreeMultiset(E freshElement) {
     TreeMultiset<E> multiset = TreeMultiset.create();
     multiset.add(freshElement);
     return multiset;
   }
 
   @Generates
-  private static <E extends Comparable<E>>
-      ImmutableSortedMultiset<E> generateImmutableSortedMultiset(E freshElement) {
+  static <E extends Comparable<E>> ImmutableSortedMultiset<E> generateImmutableSortedMultiset(
+      E freshElement) {
     return ImmutableSortedMultiset.of(freshElement);
   }
 
   @Generates
-  private static <K, V> Map<K, V> generateMap(K key, V value) {
+  static <K, V> Map<K, V> generateMap(@Nullable K key, @Nullable V value) {
     return generateHashdMap(key, value);
   }
 
   @Generates
-  private static <K, V> HashMap<K, V> generateHashdMap(K key, V value) {
+  static <K, V> HashMap<K, V> generateHashdMap(@Nullable K key, @Nullable V value) {
     return generateLinkedHashMap(key, value);
   }
 
   @Generates
-  private static <K, V> LinkedHashMap<K, V> generateLinkedHashMap(K key, V value) {
+  static <K, V> LinkedHashMap<K, V> generateLinkedHashMap(@Nullable K key, @Nullable V value) {
     LinkedHashMap<K, V> map = Maps.newLinkedHashMap();
     map.put(key, value);
     return map;
   }
 
   @Generates
-  private static <K, V> ImmutableMap<K, V> generateImmutableMap(K key, V value) {
+  static <K, V> ImmutableMap<K, V> generateImmutableMap(K key, V value) {
     return ImmutableMap.of(key, value);
   }
 
   @Empty
-  private static <K, V> ConcurrentMap<K, V> generateConcurrentMap() {
+  static <K, V> ConcurrentMap<K, V> generateConcurrentMap() {
     return Maps.newConcurrentMap();
   }
 
   @Generates
-  private static <K, V> ConcurrentMap<K, V> generateConcurrentMap(K key, V value) {
+  static <K, V> ConcurrentMap<K, V> generateConcurrentMap(K key, V value) {
     ConcurrentMap<K, V> map = Maps.newConcurrentMap();
     map.put(key, value);
     return map;
   }
 
   @Generates
-  private static <K extends Comparable<? super K>, V> SortedMap<K, V> generateSortedMap(
-      K key, V value) {
+  static <K extends Comparable<? super K>, V> SortedMap<K, V> generateSortedMap(
+      K key, @Nullable V value) {
     return generateNavigableMap(key, value);
   }
 
   @Generates
-  private static <K extends Comparable<? super K>, V> NavigableMap<K, V> generateNavigableMap(
-      K key, V value) {
+  static <K extends Comparable<? super K>, V> NavigableMap<K, V> generateNavigableMap(
+      K key, @Nullable V value) {
     return generateTreeMap(key, value);
   }
 
   @Generates
-  private static <K extends Comparable<? super K>, V> TreeMap<K, V> generateTreeMap(
-      K key, V value) {
+  static <K extends Comparable<? super K>, V> TreeMap<K, V> generateTreeMap(
+      K key, @Nullable V value) {
     TreeMap<K, V> map = Maps.newTreeMap();
     map.put(key, value);
     return map;
   }
 
   @Generates
-  private static <K extends Comparable<? super K>, V>
-      ImmutableSortedMap<K, V> generateImmutableSortedMap(K key, V value) {
+  static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> generateImmutableSortedMap(
+      K key, V value) {
     return ImmutableSortedMap.of(key, value);
   }
 
   @Generates
-  private static <K, V> Multimap<K, V> generateMultimap(K key, V value) {
+  static <K, V> Multimap<K, V> generateMultimap(@Nullable K key, @Nullable V value) {
     return generateListMultimap(key, value);
   }
 
   @Generates
-  private static <K, V> ImmutableMultimap<K, V> generateImmutableMultimap(K key, V value) {
+  static <K, V> ImmutableMultimap<K, V> generateImmutableMultimap(K key, V value) {
     return ImmutableMultimap.of(key, value);
   }
 
   @Generates
-  private static <K, V> ListMultimap<K, V> generateListMultimap(K key, V value) {
+  static <K, V> ListMultimap<K, V> generateListMultimap(@Nullable K key, @Nullable V value) {
     return generateArrayListMultimap(key, value);
   }
 
   @Generates
-  private static <K, V> ArrayListMultimap<K, V> generateArrayListMultimap(K key, V value) {
+  static <K, V> ArrayListMultimap<K, V> generateArrayListMultimap(
+      @Nullable K key, @Nullable V value) {
     ArrayListMultimap<K, V> multimap = ArrayListMultimap.create();
     multimap.put(key, value);
     return multimap;
   }
 
   @Generates
-  private static <K, V> ImmutableListMultimap<K, V> generateImmutableListMultimap(K key, V value) {
+  static <K, V> ImmutableListMultimap<K, V> generateImmutableListMultimap(K key, V value) {
     return ImmutableListMultimap.of(key, value);
   }
 
   @Generates
-  private static <K, V> SetMultimap<K, V> generateSetMultimap(K key, V value) {
+  static <K, V> SetMultimap<K, V> generateSetMultimap(@Nullable K key, @Nullable V value) {
     return generateLinkedHashMultimap(key, value);
   }
 
   @Generates
-  private static <K, V> HashMultimap<K, V> generateHashMultimap(K key, V value) {
+  static <K, V> HashMultimap<K, V> generateHashMultimap(@Nullable K key, @Nullable V value) {
     HashMultimap<K, V> multimap = HashMultimap.create();
     multimap.put(key, value);
     return multimap;
   }
 
   @Generates
-  private static <K, V> LinkedHashMultimap<K, V> generateLinkedHashMultimap(K key, V value) {
+  static <K, V> LinkedHashMultimap<K, V> generateLinkedHashMultimap(
+      @Nullable K key, @Nullable V value) {
     LinkedHashMultimap<K, V> multimap = LinkedHashMultimap.create();
     multimap.put(key, value);
     return multimap;
   }
 
   @Generates
-  private static <K, V> ImmutableSetMultimap<K, V> generateImmutableSetMultimap(K key, V value) {
+  static <K, V> ImmutableSetMultimap<K, V> generateImmutableSetMultimap(K key, V value) {
     return ImmutableSetMultimap.of(key, value);
   }
 
   @Generates
-  private static <K, V> BiMap<K, V> generateBimap(K key, V value) {
+  static <K, V> BiMap<K, V> generateBimap(@Nullable K key, @Nullable V value) {
     return generateHashBiMap(key, value);
   }
 
   @Generates
-  private static <K, V> HashBiMap<K, V> generateHashBiMap(K key, V value) {
+  static <K, V> HashBiMap<K, V> generateHashBiMap(@Nullable K key, @Nullable V value) {
     HashBiMap<K, V> bimap = HashBiMap.create();
     bimap.put(key, value);
     return bimap;
   }
 
   @Generates
-  private static <K, V> ImmutableBiMap<K, V> generateImmutableBimap(K key, V value) {
+  static <K, V> ImmutableBiMap<K, V> generateImmutableBimap(K key, V value) {
     return ImmutableBiMap.of(key, value);
   }
 
   @Generates
-  private static <R, C, V> Table<R, C, V> generateTable(R row, C column, V value) {
+  static <R, C, V> Table<R, C, V> generateTable(
+      @Nullable R row, @Nullable C column, @Nullable V value) {
     return generateHashBasedTable(row, column, value);
   }
 
   @Generates
-  private static <R, C, V> HashBasedTable<R, C, V> generateHashBasedTable(
-      R row, C column, V value) {
+  static <R, C, V> HashBasedTable<R, C, V> generateHashBasedTable(
+      @Nullable R row, @Nullable C column, @Nullable V value) {
     HashBasedTable<R, C, V> table = HashBasedTable.create();
     table.put(row, column, value);
     return table;
@@ -944,14 +945,14 @@
 
   @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such
   @Generates
-  private static <R extends Comparable, C extends Comparable, V>
+  static <R extends Comparable, C extends Comparable, V>
       RowSortedTable<R, C, V> generateRowSortedTable(R row, C column, V value) {
     return generateTreeBasedTable(row, column, value);
   }
 
   @SuppressWarnings("rawtypes") // TreeBasedTable.create() is defined as such
   @Generates
-  private static <R extends Comparable, C extends Comparable, V>
+  static <R extends Comparable, C extends Comparable, V>
       TreeBasedTable<R, C, V> generateTreeBasedTable(R row, C column, V value) {
     TreeBasedTable<R, C, V> table = TreeBasedTable.create();
     table.put(row, column, value);
@@ -959,85 +960,84 @@
   }
 
   @Generates
-  private static <R, C, V> ImmutableTable<R, C, V> generateImmutableTable(
-      R row, C column, V value) {
+  static <R, C, V> ImmutableTable<R, C, V> generateImmutableTable(R row, C column, V value) {
     return ImmutableTable.of(row, column, value);
   }
 
   // common.reflect
   @Generates
-  private TypeToken<?> generateTypeToken() {
+  TypeToken<?> generateTypeToken() {
     return TypeToken.of(generateClass());
   }
 
   // io types
   @Generates
-  private File generateFile() {
+  File generateFile() {
     return new File(generateString());
   }
 
   @Generates
-  private static ByteArrayInputStream generateByteArrayInputStream() {
+  static ByteArrayInputStream generateByteArrayInputStream() {
     return new ByteArrayInputStream(new byte[0]);
   }
 
   @Generates
-  private static InputStream generateInputStream() {
+  static InputStream generateInputStream() {
     return generateByteArrayInputStream();
   }
 
   @Generates
-  private StringReader generateStringReader() {
+  StringReader generateStringReader() {
     return new StringReader(generateString());
   }
 
   @Generates
-  private Reader generateReader() {
+  Reader generateReader() {
     return generateStringReader();
   }
 
   @Generates
-  private Readable generateReadable() {
+  Readable generateReadable() {
     return generateReader();
   }
 
   @Generates
-  private Buffer generateBuffer() {
+  Buffer generateBuffer() {
     return generateCharBuffer();
   }
 
   @Generates
-  private CharBuffer generateCharBuffer() {
+  CharBuffer generateCharBuffer() {
     return CharBuffer.allocate(generateInt());
   }
 
   @Generates
-  private ByteBuffer generateByteBuffer() {
+  ByteBuffer generateByteBuffer() {
     return ByteBuffer.allocate(generateInt());
   }
 
   @Generates
-  private ShortBuffer generateShortBuffer() {
+  ShortBuffer generateShortBuffer() {
     return ShortBuffer.allocate(generateInt());
   }
 
   @Generates
-  private IntBuffer generateIntBuffer() {
+  IntBuffer generateIntBuffer() {
     return IntBuffer.allocate(generateInt());
   }
 
   @Generates
-  private LongBuffer generateLongBuffer() {
+  LongBuffer generateLongBuffer() {
     return LongBuffer.allocate(generateInt());
   }
 
   @Generates
-  private FloatBuffer generateFloatBuffer() {
+  FloatBuffer generateFloatBuffer() {
     return FloatBuffer.allocate(generateInt());
   }
 
   @Generates
-  private DoubleBuffer generateDoubleBuffer() {
+  DoubleBuffer generateDoubleBuffer() {
     return DoubleBuffer.allocate(generateInt());
   }
 }
diff --git a/guava-testlib/src/com/google/common/testing/NullPointerTester.java b/guava-testlib/src/com/google/common/testing/NullPointerTester.java
index cd0dd15..8986d15 100644
--- a/guava-testlib/src/com/google/common/testing/NullPointerTester.java
+++ b/guava-testlib/src/com/google/common/testing/NullPointerTester.java
@@ -34,6 +34,7 @@
 import com.google.common.reflect.Reflection;
 import com.google.common.reflect.TypeToken;
 import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedType;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Member;
@@ -41,9 +42,11 @@
 import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.ConcurrentMap;
+import java.util.function.Function;
 import junit.framework.Assert;
 import junit.framework.AssertionFailedError;
 import org.checkerframework.checker.nullness.qual.Nullable;
@@ -52,7 +55,7 @@
  * A test utility that verifies that your methods and constructors throw {@link
  * NullPointerException} or {@link UnsupportedOperationException} whenever null is passed to a
  * parameter whose declaration or type isn't annotated with an annotation with the simple name
- * {@code Nullable}, {@lcode CheckForNull}, {@link NullableType}, or {@link NullableDecl}.
+ * {@code Nullable}, {@code CheckForNull}, {@link NullableType}, or {@link NullableDecl}.
  *
  * <p>The tested methods and constructors are invoked -- each time with one parameter being null and
  * the rest not null -- and the test fails if no expected exception is thrown. {@code
@@ -473,7 +476,8 @@
   }
 
   private static final ImmutableSet<String> NULLABLE_ANNOTATION_SIMPLE_NAMES =
-      ImmutableSet.of("CheckForNull", "Nullable", "NullableDecl", "NullableType");
+      ImmutableSet.of(
+          "CheckForNull", "Nullable", "NullableDecl", "NullableType", "ParametricNullness");
 
   static boolean isNullable(Invokable<?, ?> invokable) {
     return isNullable(invokable.getAnnotatedReturnType().getAnnotations())
@@ -482,7 +486,24 @@
 
   static boolean isNullable(Parameter param) {
     return isNullable(param.getAnnotatedType().getAnnotations())
-        || isNullable(param.getAnnotations());
+        || isNullable(param.getAnnotations())
+        || isNullableTypeVariable(param.getAnnotatedType().getType());
+  }
+
+  private static boolean isNullableTypeVariable(Type type) {
+    if (!(type instanceof TypeVariable)) {
+      return false;
+    }
+    TypeVariable<?> var = (TypeVariable<?>) type;
+    AnnotatedType[] bounds = GET_ANNOTATED_BOUNDS.apply(var);
+    for (AnnotatedType bound : bounds) {
+      // Until Java 15, the isNullableTypeVariable case here won't help:
+      // https://bugs.openjdk.java.net/browse/JDK-8202469
+      if (isNullable(bound.getAnnotations()) || isNullableTypeVariable(bound.getType())) {
+        return true;
+      }
+    }
+    return false;
   }
 
   private static boolean isNullable(Annotation[] annotations) {
@@ -494,12 +515,33 @@
     return false;
   }
 
+  // This is currently required because of j2objc restrictions.
+  private static final Function<TypeVariable<?>, AnnotatedType[]> GET_ANNOTATED_BOUNDS =
+      initGetAnnotatedBounds();
+
+  private static Function<TypeVariable<?>, AnnotatedType[]> initGetAnnotatedBounds() {
+    AnnotatedType[] noBounds = new AnnotatedType[0];
+    Method getAnnotatedBounds;
+    try {
+      getAnnotatedBounds = TypeVariable.class.getMethod("getAnnotatedBounds");
+    } catch (ReflectiveOperationException e) {
+      return v -> noBounds;
+    }
+    return v -> {
+      try {
+        return (AnnotatedType[]) getAnnotatedBounds.invoke(v);
+      } catch (ReflectiveOperationException e) {
+        return noBounds;
+      }
+    };
+  }
+
   private boolean isIgnored(Member member) {
     return member.isSynthetic() || ignoredMembers.contains(member) || isEquals(member);
   }
 
   /**
-   * Returns true if the the given member is a method that overrides {@link Object#equals(Object)}.
+   * Returns true if the given member is a method that overrides {@link Object#equals(Object)}.
    *
    * <p>The documentation for {@link Object#equals} says it should accept null, so don't require an
    * explicit {@code @Nullable} annotation (see <a
diff --git a/guava-testlib/src/com/google/common/testing/SerializableTester.java b/guava-testlib/src/com/google/common/testing/SerializableTester.java
index 65445e5..6298076 100644
--- a/guava-testlib/src/com/google/common/testing/SerializableTester.java
+++ b/guava-testlib/src/com/google/common/testing/SerializableTester.java
@@ -29,7 +29,6 @@
  * serialization tests require more setup. This no-op behavior allows test authors to intersperse
  * {@code SerializableTester} calls with other, GWT-compatible tests.
  *
- *
  * @author Mike Bostock
  * @since 10.0
  */
diff --git a/guava-testlib/test/com/google/common/collect/testing/MapTestSuiteBuilderTests.java b/guava-testlib/test/com/google/common/collect/testing/MapTestSuiteBuilderTests.java
index a7a39cd..5fd0d03 100644
--- a/guava-testlib/test/com/google/common/collect/testing/MapTestSuiteBuilderTests.java
+++ b/guava-testlib/test/com/google/common/collect/testing/MapTestSuiteBuilderTests.java
@@ -26,6 +26,11 @@
 import com.google.common.collect.testing.features.CollectionSize;
 import com.google.common.collect.testing.features.Feature;
 import com.google.common.collect.testing.features.MapFeature;
+import com.google.common.reflect.Reflection;
+import java.io.Serializable;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.AbstractMap;
 import java.util.AbstractSet;
 import java.util.Collection;
@@ -36,6 +41,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Predicate;
 import junit.framework.Test;
 import junit.framework.TestCase;
@@ -53,6 +59,7 @@
     TestSuite suite = new TestSuite(MapTestSuiteBuilderTests.class.getSimpleName());
     suite.addTest(testsForHashMapNullKeysForbidden());
     suite.addTest(testsForHashMapNullValuesForbidden());
+    suite.addTest(testsForSetUpTearDown());
     return suite;
   }
 
@@ -263,4 +270,89 @@
         "HashMap w/out null values",
         ALLOWS_NULL_KEYS);
   }
+
+  /**
+   * Map generator that verifies that {@code setUp()} methods are called in all the test cases. The
+   * {@code setUpRan} parameter is set true by the {@code setUp} that every test case is supposed to
+   * have registered, and set false by the {@code tearDown}. We use a dynamic proxy to intercept all
+   * of the {@code Map} method calls and check that {@code setUpRan} is true.
+   */
+  private static class CheckSetUpHashMapGenerator extends WrappedHashMapGenerator {
+    private final AtomicBoolean setUpRan;
+
+    CheckSetUpHashMapGenerator(AtomicBoolean setUpRan) {
+      this.setUpRan = setUpRan;
+    }
+
+    @Override
+    Map<String, String> wrap(HashMap<String, String> map) {
+      @SuppressWarnings("unchecked")
+      Map<String, String> proxy =
+          Reflection.newProxy(Map.class, new CheckSetUpInvocationHandler(map, setUpRan));
+      return proxy;
+    }
+  }
+
+  /**
+   * Intercepts calls to a {@code Map} to check that {@code setUpRan} is true when they happen. Then
+   * forwards the calls to the underlying {@code Map}.
+   */
+  private static class CheckSetUpInvocationHandler implements InvocationHandler, Serializable {
+    private final Map<String, String> map;
+    private final AtomicBoolean setUpRan;
+
+    CheckSetUpInvocationHandler(Map<String, String> map, AtomicBoolean setUpRan) {
+      this.map = map;
+      this.setUpRan = setUpRan;
+    }
+
+    @Override
+    public Object invoke(Object target, Method method, Object[] args) throws Throwable {
+      assertTrue("setUp should have run", setUpRan.get());
+      try {
+        return method.invoke(map, args);
+      } catch (InvocationTargetException e) {
+        throw e.getCause();
+      } catch (IllegalAccessException e) {
+        throw newLinkageError(e);
+      }
+    }
+  }
+
+  /** Verifies that {@code setUp} and {@code tearDown} are called in all map test cases. */
+  private static Test testsForSetUpTearDown() {
+    final AtomicBoolean setUpRan = new AtomicBoolean();
+    Runnable setUp =
+        new Runnable() {
+          @Override
+          public void run() {
+            assertFalse("previous tearDown should have run before setUp", setUpRan.getAndSet(true));
+          }
+        };
+    Runnable tearDown =
+        new Runnable() {
+          @Override
+          public void run() {
+            assertTrue("setUp should have run", setUpRan.getAndSet(false));
+          }
+        };
+    return MapTestSuiteBuilder.using(new CheckSetUpHashMapGenerator(setUpRan))
+        .named("setUpTearDown")
+        .withFeatures(
+            MapFeature.GENERAL_PURPOSE,
+            MapFeature.ALLOWS_NULL_KEYS,
+            MapFeature.ALLOWS_NULL_VALUES,
+            CollectionFeature.SERIALIZABLE,
+            CollectionFeature.SUPPORTS_ITERATOR_REMOVE,
+            CollectionSize.ANY)
+        .withSetUp(setUp)
+        .withTearDown(tearDown)
+        .createTestSuite();
+  }
+
+  private static LinkageError newLinkageError(Throwable cause) {
+    LinkageError error = new LinkageError(cause.toString());
+    error.initCause(cause);
+    return error;
+  }
 }
diff --git a/guava-testlib/test/com/google/common/testing/FakeTickerTest.java b/guava-testlib/test/com/google/common/testing/FakeTickerTest.java
index 09e4a31..1372b45 100644
--- a/guava-testlib/test/com/google/common/testing/FakeTickerTest.java
+++ b/guava-testlib/test/com/google/common/testing/FakeTickerTest.java
@@ -162,7 +162,7 @@
     final CountDownLatch startLatch = new CountDownLatch(numberOfThreads);
     final CountDownLatch doneLatch = new CountDownLatch(numberOfThreads);
     for (int i = numberOfThreads; i > 0; i--) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError =
           executorService.submit(
               new Callable<Void>() {
diff --git a/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java b/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
index 3c7bf31..a5a20ec 100644
--- a/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
+++ b/guava-testlib/test/com/google/common/testing/NullPointerTesterTest.java
@@ -54,6 +54,7 @@
  * @author Kevin Bourrillion
  * @author Mick Killianey
  */
+@SuppressWarnings("CheckReturnValue")
 public class NullPointerTesterTest extends TestCase {
 
   /** Non-NPE RuntimeException. */
@@ -1483,4 +1484,47 @@
     }
     fail("Should detect problem in " + FailOnOneOfTwoConstructors.class.getSimpleName());
   }
+
+  public static class NullBounds<T extends @Nullable Object, U extends T, X> {
+    boolean xWasCalled;
+
+    @SuppressWarnings("unused") // Called by reflection
+    public void x(X x) {
+      xWasCalled = true;
+      checkNotNull(x);
+    }
+
+    @SuppressWarnings("unused") // Called by reflection
+    public void t(T t) {
+      fail("Method with parameter <T extends @Nullable Object> should not be called");
+    }
+
+    @SuppressWarnings("unused") // Called by reflection
+    public void u(U u) {
+      fail(
+          "Method with parameter <U extends T> where <T extends @Nullable Object> should not be"
+              + " called");
+    }
+
+    @SuppressWarnings("unused") // Called by reflection
+    public <A extends @Nullable Object> void a(A a) {
+      fail("Method with parameter <A extends @Nullable Object> should not be called");
+    }
+
+    @SuppressWarnings("unused") // Called by reflection
+    public <A extends B, B extends @Nullable Object> void b(A a) {
+      fail(
+          "Method with parameter <A extends B> where <B extends @Nullable Object> should not be"
+              + " called");
+    }
+  }
+
+  public void testNullBounds() {
+    // NullBounds has methods whose parameters are type variables that have
+    // "extends @Nullable Object" as a bound. This test ensures that NullPointerTester considers
+    // those parameters to be @Nullable, so it won't call the methods.
+    NullBounds<?, ?, ?> nullBounds = new NullBounds<>();
+    new NullPointerTester().testAllPublicInstanceMethods(nullBounds);
+    assertThat(nullBounds.xWasCalled).isTrue();
+  }
 }
diff --git a/guava-testlib/test/com/google/common/testing/PackageSanityTests.java b/guava-testlib/test/com/google/common/testing/PackageSanityTests.java
index cf446d2..d5483d3 100644
--- a/guava-testlib/test/com/google/common/testing/PackageSanityTests.java
+++ b/guava-testlib/test/com/google/common/testing/PackageSanityTests.java
@@ -16,6 +16,7 @@
 
 package com.google.common.testing;
 
+
 /** Test nulls for the entire package. */
 
 public class PackageSanityTests extends AbstractPackageSanityTests {}
diff --git a/guava-tests/benchmark/com/google/common/base/CharMatcherBenchmark.java b/guava-tests/benchmark/com/google/common/base/CharMatcherBenchmark.java
index e2ba458..9dee99b 100644
--- a/guava-tests/benchmark/com/google/common/base/CharMatcherBenchmark.java
+++ b/guava-tests/benchmark/com/google/common/base/CharMatcherBenchmark.java
@@ -29,7 +29,6 @@
 /**
  * Benchmark for the {@link CharMatcher} class.
  *
- *
  * @author David Beaumont
  * @author Kevin Bourrillion
  * @author David Richter
diff --git a/guava-tests/benchmark/com/google/common/base/StringsRepeatBenchmark.java b/guava-tests/benchmark/com/google/common/base/StringsRepeatBenchmark.java
index 30261da..16e00ef 100644
--- a/guava-tests/benchmark/com/google/common/base/StringsRepeatBenchmark.java
+++ b/guava-tests/benchmark/com/google/common/base/StringsRepeatBenchmark.java
@@ -40,7 +40,7 @@
   }
 
   @Benchmark
-  void oldRepeat(int reps) {
+  void oldRepeat(long reps) {
     for (int i = 0; i < reps; i++) {
       String x = oldRepeat(originalString, count);
       if (x.length() != (originalString.length() * count)) {
@@ -62,7 +62,7 @@
   }
 
   @Benchmark
-  void mikeRepeat(int reps) {
+  void mikeRepeat(long reps) {
     for (int i = 0; i < reps; i++) {
       String x = mikeRepeat(originalString, count);
       if (x.length() != (originalString.length() * count)) {
@@ -95,7 +95,7 @@
   }
 
   @Benchmark
-  void martinRepeat(int reps) {
+  void martinRepeat(long reps) {
     for (int i = 0; i < reps; i++) {
       String x = martinRepeat(originalString, count);
       if (x.length() != (originalString.length() * count)) {
diff --git a/guava-tests/benchmark/com/google/common/base/ToStringHelperBenchmark.java b/guava-tests/benchmark/com/google/common/base/ToStringHelperBenchmark.java
index 6b33599..a555fc4 100644
--- a/guava-tests/benchmark/com/google/common/base/ToStringHelperBenchmark.java
+++ b/guava-tests/benchmark/com/google/common/base/ToStringHelperBenchmark.java
@@ -18,6 +18,8 @@
 
 import com.google.caliper.Benchmark;
 import com.google.caliper.Param;
+import java.util.Arrays;
+import java.util.Collections;
 
 /**
  * Some microbenchmarks for the {@link MoreObjects.ToStringHelper} class.
@@ -26,33 +28,114 @@
  */
 public class ToStringHelperBenchmark {
 
-  @Param({"0", "2", "5", "10"})
+  @Param({"0", "1", "5"})
   int dataSize;
 
-  private static final String NAME = "abcdefgh";
-  private static final String NAME3 = Strings.repeat(NAME, 3);
+  @Param({"false", "true"})
+  boolean omitNulls;
 
-  private static void addEntries(MoreObjects.ToStringHelper helper) {
-    helper
-        .add(NAME, 10)
-        .addValue(10L)
-        .add(NAME, 3.14f)
-        .addValue(3.14d)
-        .add(NAME3, false)
-        .add(NAME3, NAME3)
-        .add(NAME3, 'x');
+  enum Dataset {
+    SMALL {
+      void addEntries(MoreObjects.ToStringHelper helper) {
+        helper
+            .add(SHORT_NAME, 10)
+            .addValue(10L)
+            .add(SHORT_NAME, 3.14f)
+            .addValue(3.14d)
+            .add(LONG_NAME, false)
+            .add(LONG_NAME, LONG_NAME);
+      }
+    },
+    CONDITIONAL {
+      void addEntries(MoreObjects.ToStringHelper helper) {
+        helper
+            .add(SHORT_NAME, "x")
+            .add(LONG_NAME, "y")
+            .add(SHORT_NAME, null)
+            .add(LONG_NAME, null)
+            .addValue("z")
+            .addValue("")
+            .addValue(null)
+            .add(SHORT_NAME, Arrays.asList("A"))
+            .add(LONG_NAME, Arrays.asList("B"))
+            .add(SHORT_NAME, Arrays.asList())
+            .add(LONG_NAME, Arrays.asList())
+            .addValue(Arrays.asList("C"))
+            .addValue(Arrays.asList())
+            .add(SHORT_NAME, Collections.singletonMap("k1", "v1"))
+            .add(LONG_NAME, Collections.singletonMap("k2", "v2"))
+            .addValue(Collections.singletonMap("k3", "v3"))
+            .addValue(Collections.emptyMap())
+            .addValue(null)
+            .add(SHORT_NAME, java.util.Optional.of("1"))
+            .add(LONG_NAME, java.util.Optional.of("1"))
+            .add(SHORT_NAME, java.util.Optional.empty())
+            .add(LONG_NAME, java.util.Optional.empty())
+            .add(SHORT_NAME, Optional.of("2"))
+            .add(SHORT_NAME, Optional.absent())
+            .addValue(null)
+            .add(SHORT_NAME, new int[] {1})
+            .add(LONG_NAME, new int[] {2})
+            .addValue(new int[] {3})
+            .addValue(new int[] {})
+            .addValue(null);
+      }
+    },
+    UNCONDITIONAL {
+      void addEntries(MoreObjects.ToStringHelper helper) {
+        helper
+            .add(SHORT_NAME, false)
+            .add(LONG_NAME, false)
+            .addValue(true)
+            .add(SHORT_NAME, (byte) 1)
+            .add(LONG_NAME, (byte) 2)
+            .addValue((byte) 3)
+            .add(SHORT_NAME, 'A')
+            .add(LONG_NAME, 'B')
+            .addValue('C')
+            .add(SHORT_NAME, (short) 4)
+            .add(LONG_NAME, (short) 5)
+            .addValue((short) 6)
+            .add(SHORT_NAME, 7)
+            .add(LONG_NAME, 8)
+            .addValue(9)
+            .add(SHORT_NAME, 10L)
+            .add(LONG_NAME, 11L)
+            .addValue(12L)
+            .add(SHORT_NAME, 13.0f)
+            .add(LONG_NAME, 14.0f)
+            .addValue(15.0f);
+      }
+    };
+
+    void addEntries(MoreObjects.ToStringHelper helper) {}
+  }
+
+  @Param Dataset dataset;
+
+  private static final String SHORT_NAME = "userId";
+  private static final String LONG_NAME = "fluxCapacitorFailureRate95Percentile";
+
+  private MoreObjects.ToStringHelper newHelper() {
+    MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper("klass");
+    if (omitNulls) {
+      helper = helper.omitNullValues();
+    }
+    return helper;
   }
 
   @Benchmark
   int toString(int reps) {
     int dummy = 0;
     for (int i = 0; i < reps; i++) {
-      MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper("klass").omitNullValues();
+      MoreObjects.ToStringHelper helper = newHelper();
       for (int j = 0; j < dataSize; ++j) {
-        addEntries(helper);
+        dataset.addEntries(helper);
       }
       dummy ^= helper.toString().hashCode();
     }
     return dummy;
   }
+
+  // When omitEmptyValues() is released, remove this method and add a new @Param "omitEmptyValues".
 }
diff --git a/guava-tests/benchmark/com/google/common/collect/ImmutableSetHashFloodingDetectionBenchmark.java b/guava-tests/benchmark/com/google/common/collect/ImmutableSetHashFloodingDetectionBenchmark.java
index 9e45916..9e43bb7 100644
--- a/guava-tests/benchmark/com/google/common/collect/ImmutableSetHashFloodingDetectionBenchmark.java
+++ b/guava-tests/benchmark/com/google/common/collect/ImmutableSetHashFloodingDetectionBenchmark.java
@@ -140,6 +140,50 @@
         }
         return false;
       }
+    },
+    SKIPPING {
+      int maxRunBeforeFallback(int tableSize) {
+        return 13 * IntMath.log2(tableSize, RoundingMode.UNNECESSARY);
+      }
+
+      @Override
+      boolean hashFloodingDetected(Object[] hashTable) {
+        int maxRunBeforeFallback = maxRunBeforeFallback(hashTable.length);
+        int mask = hashTable.length - 1;
+
+        // Invariant: all elements at indices in [knownRunStart, knownRunEnd) are nonnull.
+        // If knownRunStart == knownRunEnd, this is vacuously true.
+        // When knownRunEnd exceeds hashTable.length, it "wraps", detecting runs around the end
+        // of the table.
+        int knownRunStart = 0;
+        int knownRunEnd = 0;
+
+        outerLoop:
+        while (knownRunStart < hashTable.length) {
+          if (knownRunStart == knownRunEnd && hashTable[knownRunStart] == null) {
+            if (hashTable[(knownRunStart + maxRunBeforeFallback - 1) & mask] == null) {
+              // There are only maxRunBeforeFallback - 1 elements between here and there,
+              // so even if they were all nonnull, we wouldn't detect a hash flood.  Therefore,
+              // we can skip them all.
+              knownRunStart += maxRunBeforeFallback;
+            } else {
+              knownRunStart++; // the only case in which maxRunEnd doesn't increase by mRBF
+              // happens about f * (1-f) for f = DESIRED_LOAD_FACTOR, so around 21% of the time
+            }
+            knownRunEnd = knownRunStart;
+          } else {
+            for (int j = knownRunStart + maxRunBeforeFallback - 1; j >= knownRunEnd; j--) {
+              if (hashTable[j & mask] == null) {
+                knownRunEnd = knownRunStart + maxRunBeforeFallback;
+                knownRunStart = j + 1;
+                continue outerLoop;
+              }
+            }
+            return true;
+          }
+        }
+        return false;
+      }
     };
 
     abstract boolean hashFloodingDetected(Object[] array);
diff --git a/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java b/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java
index 02db8fd..ed27840 100644
--- a/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java
+++ b/guava-tests/benchmark/com/google/common/util/concurrent/ExecutionListBenchmark.java
@@ -252,7 +252,7 @@
     final AtomicInteger integer = new AtomicInteger();
     // Execute a bunch of tasks to ensure that our threads are allocated and hot
     for (int i = 0; i < NUM_THREADS * 10; i++) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError =
           executorService.submit(
               new Runnable() {
@@ -334,10 +334,10 @@
       list = impl.newExecutionList();
       listenerLatch = new CountDownLatch(numListeners * NUM_THREADS);
       for (int j = 0; j < NUM_THREADS; j++) {
-        @SuppressWarnings("unused") // go/futurereturn-lsc
+        @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
         Future<?> possiblyIgnoredError = executorService.submit(addTask);
       }
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError = executorService.submit(executeTask);
       returnValue += (int) listenerLatch.getCount();
       listenerLatch.await();
@@ -360,10 +360,10 @@
     for (int i = 0; i < reps; i++) {
       list = impl.newExecutionList();
       listenerLatch = new CountDownLatch(numListeners * NUM_THREADS);
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError = executorService.submit(executeTask);
       for (int j = 0; j < NUM_THREADS; j++) {
-        @SuppressWarnings("unused") // go/futurereturn-lsc
+        @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
         Future<?> possiblyIgnoredError1 = executorService.submit(addTask);
       }
       returnValue += (int) listenerLatch.getCount();
diff --git a/guava-tests/benchmark/com/google/common/util/concurrent/FuturesGetCheckedBenchmark.java b/guava-tests/benchmark/com/google/common/util/concurrent/FuturesGetCheckedBenchmark.java
index dd1883b..c25a8ff 100644
--- a/guava-tests/benchmark/com/google/common/util/concurrent/FuturesGetCheckedBenchmark.java
+++ b/guava-tests/benchmark/com/google/common/util/concurrent/FuturesGetCheckedBenchmark.java
@@ -52,7 +52,8 @@
     NON_CACHING_WITH_CONSTRUCTOR_CHECK(nonCachingWithConstructorCheckValidator()),
     NON_CACHING_WITHOUT_CONSTRUCTOR_CHECK(nonCachingWithoutConstructorCheckValidator()),
     WEAK_SET(weakSetValidator()),
-    CLASS_VALUE(classValueValidator());
+    CLASS_VALUE(classValueValidator()),
+    ;
 
     final GetCheckedTypeValidator validator;
 
diff --git a/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java b/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java
index c1e5201..dafb39b 100644
--- a/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java
+++ b/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedArrayBlockingQueue.java
@@ -36,12 +36,12 @@
  *
  * <p>This is a classic &quot;bounded buffer&quot;, in which a fixed-sized array holds elements
  * inserted by producers and extracted by consumers. Once created, the capacity cannot be increased.
- * Attempts to <tt>put</tt> an element into a full queue will result in the operation blocking;
- * attempts to <tt>take</tt> an element from an empty queue will similarly block.
+ * Attempts to {@code put} an element into a full queue will result in the operation blocking;
+ * attempts to {@code take} an element from an empty queue will similarly block.
  *
  * <p>This class supports an optional fairness policy for ordering waiting producer and consumer
  * threads. By default, this ordering is not guaranteed. However, a queue constructed with fairness
- * set to <tt>true</tt> grants threads access in FIFO order. Fairness generally decreases throughput
+ * set to {@code true} grants threads access in FIFO order. Fairness generally decreases throughput
  * but reduces variability and avoids starvation.
  *
  * <p>This class and its iterator implement all of the <em>optional</em> methods of the {@link
@@ -139,24 +139,24 @@
   }
 
   /**
-   * Creates an <tt>MonitorBasedArrayBlockingQueue</tt> with the given (fixed) capacity and default
+   * Creates an {@code MonitorBasedArrayBlockingQueue} with the given (fixed) capacity and default
    * access policy.
    *
    * @param capacity the capacity of this queue
-   * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1
+   * @throws IllegalArgumentException if {@code capacity} is less than 1
    */
   public MonitorBasedArrayBlockingQueue(int capacity) {
     this(capacity, false);
   }
 
   /**
-   * Creates an <tt>MonitorBasedArrayBlockingQueue</tt> with the given (fixed) capacity and the
+   * Creates an {@code MonitorBasedArrayBlockingQueue} with the given (fixed) capacity and the
    * specified access policy.
    *
    * @param capacity the capacity of this queue
-   * @param fair if <tt>true</tt> then queue accesses for threads blocked on insertion or removal,
-   *     are processed in FIFO order; if <tt>false</tt> the access order is unspecified.
-   * @throws IllegalArgumentException if <tt>capacity</tt> is less than 1
+   * @param fair if {@code true} then queue accesses for threads blocked on insertion or removal,
+   *     are processed in FIFO order; if {@code false} the access order is unspecified.
+   * @throws IllegalArgumentException if {@code capacity} is less than 1
    */
   public MonitorBasedArrayBlockingQueue(int capacity, boolean fair) {
     if (capacity <= 0) throw new IllegalArgumentException();
@@ -179,15 +179,15 @@
   }
 
   /**
-   * Creates an <tt>MonitorBasedArrayBlockingQueue</tt> with the given (fixed) capacity, the
+   * Creates an {@code MonitorBasedArrayBlockingQueue} with the given (fixed) capacity, the
    * specified access policy and initially containing the elements of the given collection, added in
    * traversal order of the collection's iterator.
    *
    * @param capacity the capacity of this queue
-   * @param fair if <tt>true</tt> then queue accesses for threads blocked on insertion or removal,
-   *     are processed in FIFO order; if <tt>false</tt> the access order is unspecified.
+   * @param fair if {@code true} then queue accesses for threads blocked on insertion or removal,
+   *     are processed in FIFO order; if {@code false} the access order is unspecified.
    * @param c the collection of elements to initially contain
-   * @throws IllegalArgumentException if <tt>capacity</tt> is less than <tt>c.size()</tt>, or less
+   * @throws IllegalArgumentException if {@code capacity} is less than {@code c.size()}, or less
    *     than 1.
    * @throws NullPointerException if the specified collection or any of its elements are null
    */
@@ -205,11 +205,11 @@
 
   /**
    * Inserts the specified element at the tail of this queue if it is possible to do so immediately
-   * without exceeding the queue's capacity, returning <tt>true</tt> upon success and throwing an
-   * <tt>IllegalStateException</tt> if this queue is full.
+   * without exceeding the queue's capacity, returning {@code true} upon success and throwing an
+   * {@code IllegalStateException} if this queue is full.
    *
    * @param e the element to add
-   * @return <tt>true</tt> (as specified by {@link Collection#add})
+   * @return {@code true} (as specified by {@link Collection#add})
    * @throws IllegalStateException if this queue is full
    * @throws NullPointerException if the specified element is null
    */
@@ -220,7 +220,7 @@
 
   /**
    * Inserts the specified element at the tail of this queue if it is possible to do so immediately
-   * without exceeding the queue's capacity, returning <tt>true</tt> upon success and <tt>false</tt>
+   * without exceeding the queue's capacity, returning {@code true} upon success and {@code false}
    * if this queue is full. This method is generally preferable to method {@link #add}, which can
    * fail to insert an element only by throwing an exception.
    *
@@ -361,11 +361,11 @@
   /**
    * Returns the number of additional elements that this queue can ideally (in the absence of memory
    * or resource constraints) accept without blocking. This is always equal to the initial capacity
-   * of this queue less the current <tt>size</tt> of this queue.
+   * of this queue less the current {@code size} of this queue.
    *
    * <p>Note that you <em>cannot</em> always tell if an attempt to insert an element will succeed by
-   * inspecting <tt>remainingCapacity</tt> because it may be the case that another thread is about
-   * to insert or remove an element.
+   * inspecting {@code remainingCapacity} because it may be the case that another thread is about to
+   * insert or remove an element.
    */
   @Override
   public int remainingCapacity() {
@@ -380,12 +380,12 @@
 
   /**
    * Removes a single instance of the specified element from this queue, if it is present. More
-   * formally, removes an element <tt>e</tt> such that <tt>o.equals(e)</tt>, if this queue contains
-   * one or more such elements. Returns <tt>true</tt> if this queue contained the specified element
+   * formally, removes an element {@code e} such that {@code o.equals(e)}, if this queue contains
+   * one or more such elements. Returns {@code true} if this queue contained the specified element
    * (or equivalently, if this queue changed as a result of the call).
    *
    * @param o element to be removed from this queue, if present
-   * @return <tt>true</tt> if this queue changed as a result of the call
+   * @return {@code true} if this queue changed as a result of the call
    */
   @Override
   public boolean remove(@Nullable Object o) {
@@ -410,12 +410,12 @@
   }
 
   /**
-   * Returns <tt>true</tt> if this queue contains the specified element. More formally, returns
-   * <tt>true</tt> if and only if this queue contains at least one element <tt>e</tt> such that
-   * <tt>o.equals(e)</tt>.
+   * Returns {@code true} if this queue contains the specified element. More formally, returns
+   * {@code true} if and only if this queue contains at least one element {@code e} such that {@code
+   * o.equals(e)}.
    *
    * @param o object to be checked for containment in this queue
-   * @return <tt>true</tt> if this queue contains the specified element
+   * @return {@code true} if this queue contains the specified element
    */
   @Override
   public boolean contains(@Nullable Object o) {
@@ -474,19 +474,19 @@
    *
    * <p>If this queue fits in the specified array with room to spare (i.e., the array has more
    * elements than this queue), the element in the array immediately following the end of the queue
-   * is set to <tt>null</tt>.
+   * is set to {@code null}.
    *
    * <p>Like the {@link #toArray()} method, this method acts as bridge between array-based and
    * collection-based APIs. Further, this method allows precise control over the runtime type of the
    * output array, and may, under certain circumstances, be used to save allocation costs.
    *
-   * <p>Suppose <tt>x</tt> is a queue known to contain only strings. The following code can be used
-   * to dump the queue into a newly allocated array of <tt>String</tt>:
+   * <p>Suppose {@code x} is a queue known to contain only strings. The following code can be used
+   * to dump the queue into a newly allocated array of {@code String}:
    *
    * <pre>
    *     String[] y = x.toArray(new String[0]);</pre>
    *
-   * <p>Note that <tt>toArray(new Object[0])</tt> is identical in function to <tt>toArray()</tt>.
+   * <p>Note that {@code toArray(new Object[0])} is identical in function to {@code toArray()}.
    *
    * @param a the array into which the elements of the queue are to be stored, if it is big enough;
    *     otherwise, a new array of the same runtime type is allocated for this purpose
@@ -626,8 +626,8 @@
   }
 
   /**
-   * Returns an iterator over the elements in this queue in proper sequence. The returned
-   * <tt>Iterator</tt> is a "weakly consistent" iterator that will never throw {@link
+   * Returns an iterator over the elements in this queue in proper sequence. The returned {@code
+   * Iterator} is a "weakly consistent" iterator that will never throw {@link
    * ConcurrentModificationException}, and guarantees to traverse elements as they existed upon
    * construction of the iterator, and may (but is not guaranteed to) reflect any modifications
    * subsequent to construction.
diff --git a/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java b/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java
index 6e06346..16b648b 100644
--- a/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java
+++ b/guava-tests/benchmark/com/google/common/util/concurrent/MonitorBasedPriorityBlockingQueue.java
@@ -35,23 +35,23 @@
 /**
  * An unbounded {@linkplain BlockingQueue blocking queue} that uses the same ordering rules as class
  * {@link PriorityQueue} and supplies blocking retrieval operations. While this queue is logically
- * unbounded, attempted additions may fail due to resource exhaustion (causing
- * <tt>OutOfMemoryError</tt>). This class does not permit <tt>null</tt> elements. A priority queue
- * relying on {@linkplain Comparable natural ordering} also does not permit insertion of
- * non-comparable objects (doing so results in <tt>ClassCastException</tt>).
+ * unbounded, attempted additions may fail due to resource exhaustion (causing {@code
+ * OutOfMemoryError}). This class does not permit {@code null} elements. A priority queue relying on
+ * {@linkplain Comparable natural ordering} also does not permit insertion of non-comparable objects
+ * (doing so results in {@code ClassCastException}).
  *
  * <p>This class and its iterator implement all of the <em>optional</em> methods of the {@link
  * Collection} and {@link Iterator} interfaces. The Iterator provided in method {@link #iterator()}
  * is <em>not</em> guaranteed to traverse the elements of the MonitorBasedPriorityBlockingQueue in
- * any particular order. If you need ordered traversal, consider using
- * <tt>Arrays.sort(pq.toArray())</tt>. Also, method <tt>drainTo</tt> can be used to <em>remove</em>
- * some or all elements in priority order and place them in another collection.
+ * any particular order. If you need ordered traversal, consider using {@code
+ * Arrays.sort(pq.toArray())}. Also, method {@code drainTo} can be used to <em>remove</em> some or
+ * all elements in priority order and place them in another collection.
  *
  * <p>Operations on this class make no guarantees about the ordering of elements with equal
  * priority. If you need to enforce an ordering, you can define custom classes or comparators that
  * use a secondary key to break ties in primary priority values. For example, here is a class that
  * applies first-in-first-out tie-breaking to comparable elements. To use it, you would insert a
- * <tt>new FIFOEntry(anEntry)</tt> instead of a plain entry object.
+ * {@code new FIFOEntry(anEntry)} instead of a plain entry object.
  *
  * <pre>
  * class FIFOEntry&lt;E extends Comparable&lt;? super E&gt;&gt;
@@ -96,32 +96,32 @@
       };
 
   /**
-   * Creates a <tt>MonitorBasedPriorityBlockingQueue</tt> with the default initial capacity (11)
-   * that orders its elements according to their {@linkplain Comparable natural ordering}.
+   * Creates a {@code MonitorBasedPriorityBlockingQueue} with the default initial capacity (11) that
+   * orders its elements according to their {@linkplain Comparable natural ordering}.
    */
   public MonitorBasedPriorityBlockingQueue() {
     q = new PriorityQueue<E>();
   }
 
   /**
-   * Creates a <tt>MonitorBasedPriorityBlockingQueue</tt> with the specified initial capacity that
+   * Creates a {@code MonitorBasedPriorityBlockingQueue} with the specified initial capacity that
    * orders its elements according to their {@linkplain Comparable natural ordering}.
    *
    * @param initialCapacity the initial capacity for this priority queue
-   * @throws IllegalArgumentException if <tt>initialCapacity</tt> is less than 1
+   * @throws IllegalArgumentException if {@code initialCapacity} is less than 1
    */
   public MonitorBasedPriorityBlockingQueue(int initialCapacity) {
     q = new PriorityQueue<E>(initialCapacity, null);
   }
 
   /**
-   * Creates a <tt>MonitorBasedPriorityBlockingQueue</tt> with the specified initial capacity that
+   * Creates a {@code MonitorBasedPriorityBlockingQueue} with the specified initial capacity that
    * orders its elements according to the specified comparator.
    *
    * @param initialCapacity the initial capacity for this priority queue
    * @param comparator the comparator that will be used to order this priority queue. If {@code
    *     null}, the {@linkplain Comparable natural ordering} of the elements will be used.
-   * @throws IllegalArgumentException if <tt>initialCapacity</tt> is less than 1
+   * @throws IllegalArgumentException if {@code initialCapacity} is less than 1
    */
   public MonitorBasedPriorityBlockingQueue(
       int initialCapacity, @Nullable Comparator<? super E> comparator) {
@@ -129,7 +129,7 @@
   }
 
   /**
-   * Creates a <tt>MonitorBasedPriorityBlockingQueue</tt> containing the elements in the specified
+   * Creates a {@code MonitorBasedPriorityBlockingQueue} containing the elements in the specified
    * collection. If the specified collection is a {@link SortedSet} or a {@link PriorityQueue}, this
    * priority queue will be ordered according to the same ordering. Otherwise, this priority queue
    * will be ordered according to the {@linkplain Comparable natural ordering} of its elements.
@@ -147,7 +147,7 @@
    * Inserts the specified element into this priority queue.
    *
    * @param e the element to add
-   * @return <tt>true</tt> (as specified by {@link Collection#add})
+   * @return {@code true} (as specified by {@link Collection#add})
    * @throws ClassCastException if the specified element cannot be compared with elements currently
    *     in the priority queue according to the priority queue's ordering
    * @throws NullPointerException if the specified element is null
@@ -161,7 +161,7 @@
    * Inserts the specified element into this priority queue.
    *
    * @param e the element to add
-   * @return <tt>true</tt> (as specified by {@link Queue#offer})
+   * @return {@code true} (as specified by {@link Queue#offer})
    * @throws ClassCastException if the specified element cannot be compared with elements currently
    *     in the priority queue according to the priority queue's ordering
    * @throws NullPointerException if the specified element is null
@@ -188,7 +188,7 @@
    * @param e the element to add
    * @param timeout This parameter is ignored as the method never blocks
    * @param unit This parameter is ignored as the method never blocks
-   * @return <tt>true</tt>
+   * @return {@code true}
    * @throws ClassCastException if the specified element cannot be compared with elements currently
    *     in the priority queue according to the priority queue's ordering
    * @throws NullPointerException if the specified element is null
@@ -261,10 +261,10 @@
   }
 
   /**
-   * Returns the comparator used to order the elements in this queue, or <tt>null</tt> if this queue
+   * Returns the comparator used to order the elements in this queue, or {@code null} if this queue
    * uses the {@linkplain Comparable natural ordering} of its elements.
    *
-   * @return the comparator used to order the elements in this queue, or <tt>null</tt> if this queue
+   * @return the comparator used to order the elements in this queue, or {@code null} if this queue
    *     uses the natural ordering of its elements
    */
   public Comparator<? super E> comparator() {
@@ -283,10 +283,10 @@
   }
 
   /**
-   * Always returns <tt>Integer.MAX_VALUE</tt> because a <tt>MonitorBasedPriorityBlockingQueue</tt>
-   * is not capacity constrained.
+   * Always returns {@code Integer.MAX_VALUE} because a {@code MonitorBasedPriorityBlockingQueue} is
+   * not capacity constrained.
    *
-   * @return <tt>Integer.MAX_VALUE</tt>
+   * @return {@code Integer.MAX_VALUE}
    */
   @Override
   public int remainingCapacity() {
@@ -300,7 +300,7 @@
    * specified element (or equivalently, if this queue changed as a result of the call).
    *
    * @param o element to be removed from this queue, if present
-   * @return <tt>true</tt> if this queue changed as a result of the call
+   * @return {@code true} if this queue changed as a result of the call
    */
   @Override
   public boolean remove(@Nullable Object o) {
@@ -319,7 +319,7 @@
    * o.equals(e)}.
    *
    * @param o object to be checked for containment in this queue
-   * @return <tt>true</tt> if this queue contains the specified element
+   * @return {@code true} if this queue contains the specified element
    */
   @Override
   public boolean contains(@Nullable Object o) {
@@ -363,19 +363,19 @@
    *
    * <p>If this queue fits in the specified array with room to spare (i.e., the array has more
    * elements than this queue), the element in the array immediately following the end of the queue
-   * is set to <tt>null</tt>.
+   * is set to {@code null}.
    *
    * <p>Like the {@link #toArray()} method, this method acts as bridge between array-based and
    * collection-based APIs. Further, this method allows precise control over the runtime type of the
    * output array, and may, under certain circumstances, be used to save allocation costs.
    *
-   * <p>Suppose <tt>x</tt> is a queue known to contain only strings. The following code can be used
-   * to dump the queue into a newly allocated array of <tt>String</tt>:
+   * <p>Suppose {@code x} is a queue known to contain only strings. The following code can be used
+   * to dump the queue into a newly allocated array of {@code String}:
    *
    * <pre>
    *     String[] y = x.toArray(new String[0]);</pre>
    *
-   * <p>Note that <tt>toArray(new Object[0])</tt> is identical in function to <tt>toArray()</tt>.
+   * <p>Note that {@code toArray(new Object[0])} is identical in function to {@code toArray()}.
    *
    * @param a the array into which the elements of the queue are to be stored, if it is big enough;
    *     otherwise, a new array of the same runtime type is allocated for this purpose
@@ -474,7 +474,7 @@
 
   /**
    * Returns an iterator over the elements in this queue. The iterator does not return the elements
-   * in any particular order. The returned <tt>Iterator</tt> is a "weakly consistent" iterator that
+   * in any particular order. The returned {@code Iterator} is a "weakly consistent" iterator that
    * will never throw {@link ConcurrentModificationException}, and guarantees to traverse elements
    * as they existed upon construction of the iterator, and may (but is not guaranteed to) reflect
    * any modifications subsequent to construction.
diff --git a/guava-tests/pom.xml b/guava-tests/pom.xml
index bff476b..a40b092 100644
--- a/guava-tests/pom.xml
+++ b/guava-tests/pom.xml
@@ -5,7 +5,7 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>30.0-jre</version>
+    <version>31.0.1-jre</version>
   </parent>
   <artifactId>guava-tests</artifactId>
   <name>Guava Unit Tests</name>
@@ -106,6 +106,9 @@
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>animal-sniffer-maven-plugin</artifactId>
+        <configuration>
+          <checkTestClasses>false</checkTestClasses> <!-- TODO(cpovirk): Consider checking them. -->
+        </configuration>
       </plugin>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
diff --git a/guava-tests/test/com/google/common/base/AbstractIteratorTest.java b/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
index e8f8b93..da732bf 100644
--- a/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
+++ b/guava-tests/test/com/google/common/base/AbstractIteratorTest.java
@@ -171,6 +171,7 @@
     }
   }
 
+
   @GwtIncompatible // weak references
   public void testFreesNextReference() {
     Iterator<Object> itr =
diff --git a/guava-tests/test/com/google/common/base/AndroidIncompatible.java b/guava-tests/test/com/google/common/base/AndroidIncompatible.java
index e3a250d..5e190a3 100644
--- a/guava-tests/test/com/google/common/base/AndroidIncompatible.java
+++ b/guava-tests/test/com/google/common/base/AndroidIncompatible.java
@@ -32,7 +32,6 @@
  * Google-internal Android suite generators. Note that those generators also suppress any test
  * annotated with MediumTest or LargeTest.
  *
- *
  * <p>Why use a custom annotation instead of {@code android.test.suitebuilder.annotation.Suppress}?
  * I'm not completely sure that this is the right choice, but it has various advantages:
  *
diff --git a/guava-tests/test/com/google/common/base/EnumsTest.java b/guava-tests/test/com/google/common/base/EnumsTest.java
index 413f308..d8b13af 100644
--- a/guava-tests/test/com/google/common/base/EnumsTest.java
+++ b/guava-tests/test/com/google/common/base/EnumsTest.java
@@ -79,6 +79,7 @@
     assertThat(Enums.getIfPresent(TestEnum.class, "WOMBAT")).isAbsent();
   }
 
+
   @GwtIncompatible // weak references
   public void testGetIfPresent_doesNotPreventClassUnloading() throws Exception {
     WeakReference<?> shadowLoaderReference = doTestClassUnloading();
diff --git a/guava-tests/test/com/google/common/base/FinalizableReferenceQueueClassLoaderUnloadingTest.java b/guava-tests/test/com/google/common/base/FinalizableReferenceQueueClassLoaderUnloadingTest.java
index 453b23c..ae35c16 100644
--- a/guava-tests/test/com/google/common/base/FinalizableReferenceQueueClassLoaderUnloadingTest.java
+++ b/guava-tests/test/com/google/common/base/FinalizableReferenceQueueClassLoaderUnloadingTest.java
@@ -47,6 +47,7 @@
  * @author Eamonn McManus
  */
 
+
 public class FinalizableReferenceQueueClassLoaderUnloadingTest extends TestCase {
 
   /*
@@ -110,7 +111,8 @@
 
     // Now make a parallel FRQ and an associated FinalizableWeakReference to an object, in order to
     // exercise some classes from the parallel ClassLoader.
-    AtomicReference<Object> sepFrqA = new AtomicReference<Object>(sepFrqC.newInstance());
+    AtomicReference<Object> sepFrqA =
+        new AtomicReference<Object>(sepFrqC.getDeclaredConstructor().newInstance());
     Class<?> sepFwrC = sepLoader.loadClass(MyFinalizableWeakReference.class.getName());
     Constructor<?> sepFwrCons = sepFwrC.getConstructor(Object.class, sepFrqC);
     // The object that we will wrap in FinalizableWeakReference is a Stopwatch.
@@ -240,7 +242,7 @@
     assertNotSame(frqUserC, sepFrqUserC);
     assertSame(sepLoader, sepFrqUserC.getClassLoader());
 
-    Callable<?> sepFrqUser = (Callable<?>) sepFrqUserC.newInstance();
+    Callable<?> sepFrqUser = (Callable<?>) sepFrqUserC.getDeclaredConstructor().newInstance();
     WeakReference<?> finalizableWeakReference = (WeakReference<?>) sepFrqUser.call();
 
     GcFinalization.awaitClear(finalizableWeakReference);
diff --git a/guava-tests/test/com/google/common/base/FinalizableReferenceQueueTest.java b/guava-tests/test/com/google/common/base/FinalizableReferenceQueueTest.java
index b8af398..3b5fd1d 100644
--- a/guava-tests/test/com/google/common/base/FinalizableReferenceQueueTest.java
+++ b/guava-tests/test/com/google/common/base/FinalizableReferenceQueueTest.java
@@ -40,6 +40,7 @@
     frq = null;
   }
 
+
   public void testFinalizeReferentCalled() {
     final MockReference reference = new MockReference(frq = new FinalizableReferenceQueue());
 
@@ -72,6 +73,7 @@
    */
   private WeakReference<ReferenceQueue<Object>> queueReference;
 
+
   public void testThatFinalizerStops() {
     weaklyReferenceQueue();
     GcFinalization.awaitClear(queueReference);
diff --git a/guava-tests/test/com/google/common/base/OptionalTest.java b/guava-tests/test/com/google/common/base/OptionalTest.java
index db7a9e3..f8d8333 100644
--- a/guava-tests/test/com/google/common/base/OptionalTest.java
+++ b/guava-tests/test/com/google/common/base/OptionalTest.java
@@ -85,6 +85,7 @@
     assertFalse(Optional.absent().isPresent());
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testIsPresent_yes() {
     assertTrue(Optional.of("training").isPresent());
   }
@@ -102,6 +103,7 @@
     assertEquals("training", Optional.of("training").get());
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testOr_T_present() {
     assertEquals("a", Optional.of("a").or("default"));
   }
@@ -110,6 +112,7 @@
     assertEquals("default", Optional.absent().or("default"));
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testOr_supplier_present() {
     assertEquals("a", Optional.of("a").or(Suppliers.ofInstance("fallback")));
   }
@@ -128,11 +131,13 @@
     }
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testOr_nullSupplier_present() {
     Supplier<String> nullSupplier = Suppliers.ofInstance(null);
     assertEquals("a", Optional.of("a").or(nullSupplier));
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testOr_Optional_present() {
     assertEquals(Optional.of("a"), Optional.of("a").or(Optional.of("fallback")));
   }
@@ -141,6 +146,7 @@
     assertEquals(Optional.of("fallback"), Optional.absent().or(Optional.of("fallback")));
   }
 
+  @SuppressWarnings("OptionalOfRedundantMethod") // Unit tests for Optional
   public void testOrNull_present() {
     assertEquals("a", Optional.of("a").orNull());
   }
diff --git a/guava-tests/test/com/google/common/base/PreconditionsTest.java b/guava-tests/test/com/google/common/base/PreconditionsTest.java
index 072649f..1add44d 100644
--- a/guava-tests/test/com/google/common/base/PreconditionsTest.java
+++ b/guava-tests/test/com/google/common/base/PreconditionsTest.java
@@ -24,7 +24,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.testing.ArbitraryInstances;
-import com.google.common.testing.NullPointerTester;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -539,8 +538,22 @@
 
   @GwtIncompatible // NullPointerTester
   public void testNullPointers() {
-    NullPointerTester tester = new NullPointerTester();
-    tester.testAllPublicStaticMethods(Preconditions.class);
+    /*
+     * Don't bother testing: Preconditions defines a bunch of methods that accept a template (or
+     * even entire message) that simultaneously:
+     *
+     * - _shouldn't_ be null, so we don't annotate it with @Nullable
+     *
+     * - _can_ be null without causing a runtime failure (because we don't want the interesting
+     *   details of precondition failure to be hidden by an exception we throw about an unexpectedly
+     *   null _failure message_)
+     *
+     * That combination upsets NullPointerTester, which wants any call that passes null for a
+     * non-@Nullable parameter to trigger a NullPointerException.
+     *
+     * (We still define this empty method to keep PackageSanityTests from generating its own
+     * automated nullness tests, which would fail.)
+     */
   }
 
   private static final Object IGNORE_ME =
diff --git a/guava-tests/test/com/google/common/base/StopwatchJavaTimeTest.java b/guava-tests/test/com/google/common/base/StopwatchJavaTimeTest.java
new file mode 100644
index 0000000..35fd5b1
--- /dev/null
+++ b/guava-tests/test/com/google/common/base/StopwatchJavaTimeTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2008 The Guava Authors
+ *
+ * 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 com.google.common.base;
+
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.testing.FakeTicker;
+import java.time.Duration;
+import junit.framework.TestCase;
+
+/** Unit test for the {@code java.time} support in {@link Stopwatch}. */
+@GwtIncompatible
+public class StopwatchJavaTimeTest extends TestCase {
+  private final FakeTicker ticker = new FakeTicker();
+  private final Stopwatch stopwatch = new Stopwatch(ticker);
+
+  public void testElapsed_duration() {
+    stopwatch.start();
+    ticker.advance(999999);
+    assertEquals(Duration.ofNanos(999999), stopwatch.elapsed());
+    ticker.advance(1);
+    assertEquals(Duration.ofMillis(1), stopwatch.elapsed());
+  }
+}
diff --git a/guava-tests/test/com/google/common/base/StopwatchTest.java b/guava-tests/test/com/google/common/base/StopwatchTest.java
index 25ba527..b85ebb7 100644
--- a/guava-tests/test/com/google/common/base/StopwatchTest.java
+++ b/guava-tests/test/com/google/common/base/StopwatchTest.java
@@ -21,9 +21,7 @@
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
 import com.google.common.annotations.GwtCompatible;
-import com.google.common.annotations.GwtIncompatible;
 import com.google.common.testing.FakeTicker;
-import java.time.Duration;
 import junit.framework.TestCase;
 
 /**
@@ -168,15 +166,6 @@
     assertEquals(1, stopwatch.elapsed(MILLISECONDS));
   }
 
-  @GwtIncompatible
-  public void testElapsed_duration() {
-    stopwatch.start();
-    ticker.advance(999999);
-    assertEquals(Duration.ofNanos(999999), stopwatch.elapsed());
-    ticker.advance(1);
-    assertEquals(Duration.ofMillis(1), stopwatch.elapsed());
-  }
-
   public void testToString() {
     stopwatch.start();
     assertEquals("0.000 ns", stopwatch.toString());
diff --git a/guava-tests/test/com/google/common/base/ToStringHelperTest.java b/guava-tests/test/com/google/common/base/ToStringHelperTest.java
index 3f1ef0f..db15f2e 100644
--- a/guava-tests/test/com/google/common/base/ToStringHelperTest.java
+++ b/guava-tests/test/com/google/common/base/ToStringHelperTest.java
@@ -116,15 +116,15 @@
   @GwtIncompatible // Class names are obfuscated in GWT
   public void testToStringHelper_moreThanNineAnonymousClasses() {
     // The nth anonymous class has a name ending like "Outer.$n"
-    Object o1 = new Object() {};
-    Object o2 = new Object() {};
-    Object o3 = new Object() {};
-    Object o4 = new Object() {};
-    Object o5 = new Object() {};
-    Object o6 = new Object() {};
-    Object o7 = new Object() {};
-    Object o8 = new Object() {};
-    Object o9 = new Object() {};
+    Object unused1 = new Object() {};
+    Object unused2 = new Object() {};
+    Object unused3 = new Object() {};
+    Object unused4 = new Object() {};
+    Object unused5 = new Object() {};
+    Object unused6 = new Object() {};
+    Object unused7 = new Object() {};
+    Object unused8 = new Object() {};
+    Object unused9 = new Object() {};
     Object o10 = new Object() {};
     String toTest = MoreObjects.toStringHelper(o10).toString();
     assertEquals("{}", toTest);
@@ -132,15 +132,15 @@
 
   public void testToStringHelperLenient_moreThanNineAnonymousClasses() {
     // The nth anonymous class has a name ending like "Outer.$n"
-    Object o1 = new Object() {};
-    Object o2 = new Object() {};
-    Object o3 = new Object() {};
-    Object o4 = new Object() {};
-    Object o5 = new Object() {};
-    Object o6 = new Object() {};
-    Object o7 = new Object() {};
-    Object o8 = new Object() {};
-    Object o9 = new Object() {};
+    Object unused1 = new Object() {};
+    Object unused2 = new Object() {};
+    Object unused3 = new Object() {};
+    Object unused4 = new Object() {};
+    Object unused5 = new Object() {};
+    Object unused6 = new Object() {};
+    Object unused7 = new Object() {};
+    Object unused8 = new Object() {};
+    Object unused9 = new Object() {};
     Object o10 = new Object() {};
     String toTest = MoreObjects.toStringHelper(o10).toString();
     assertTrue(toTest, toTest.matches(".*\\{\\}"));
@@ -357,7 +357,7 @@
   }
 
   @GwtIncompatible // Class names are obfuscated in GWT
-  public void testToStringOmitNullValues_oneValue() {
+  public void testToStringOmitEmptyValues_oneValue() {
     String toTest =
         MoreObjects.toStringHelper(new TestClass()).omitNullValues().addValue(null).toString();
     assertEquals("TestClass{}", toTest);
diff --git a/guava-tests/test/com/google/common/base/VerifyTest.java b/guava-tests/test/com/google/common/base/VerifyTest.java
index 03d2c2f..37c6efc 100644
--- a/guava-tests/test/com/google/common/base/VerifyTest.java
+++ b/guava-tests/test/com/google/common/base/VerifyTest.java
@@ -19,11 +19,12 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.GwtIncompatible;
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
 /** Unit test for {@link com.google.common.base.Verify}. */
-@GwtCompatible
+@GwtCompatible(emulated = true)
 public class VerifyTest extends TestCase {
   public void testVerify_simple_success() {
     verify(true);
@@ -92,6 +93,11 @@
     }
   }
 
+  @GwtIncompatible // NullPointerTester
+  public void testNullPointers() {
+    // Don't bother testing: Verify is like Preconditions. See the discussion on that class.
+  }
+
   private static final Object IGNORE_ME =
       new Object() {
         @Override
diff --git a/guava-tests/test/com/google/common/cache/CacheBuilderSpecTest.java b/guava-tests/test/com/google/common/cache/CacheBuilderSpecTest.java
index ba2e08e..09f2eb6 100644
--- a/guava-tests/test/com/google/common/cache/CacheBuilderSpecTest.java
+++ b/guava-tests/test/com/google/common/cache/CacheBuilderSpecTest.java
@@ -468,11 +468,13 @@
         .testEquals();
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testMaximumWeight_withWeigher() {
     CacheBuilder<Object, Object> builder = CacheBuilder.from(parse("maximumWeight=9000"));
     builder.weigher(constantWeigher(42)).build(CacheLoader.from(Suppliers.ofInstance(null)));
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testMaximumWeight_withoutWeigher() {
     CacheBuilder<Object, Object> builder = CacheBuilder.from(parse("maximumWeight=9000"));
     try {
@@ -482,11 +484,13 @@
     }
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testMaximumSize_withWeigher() {
     CacheBuilder<Object, Object> builder = CacheBuilder.from(parse("maximumSize=9000"));
     builder.weigher(constantWeigher(42)).build(CacheLoader.from(Suppliers.ofInstance(null)));
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testMaximumSize_withoutWeigher() {
     CacheBuilder<Object, Object> builder = CacheBuilder.from(parse("maximumSize=9000"));
     builder.build(CacheLoader.from(Suppliers.ofInstance(null)));
diff --git a/guava-tests/test/com/google/common/cache/CacheBuilderTest.java b/guava-tests/test/com/google/common/cache/CacheBuilderTest.java
index 8042ea7..16488f3 100644
--- a/guava-tests/test/com/google/common/cache/CacheBuilderTest.java
+++ b/guava-tests/test/com/google/common/cache/CacheBuilderTest.java
@@ -305,6 +305,7 @@
     }
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testTimeToLive_small() {
     CacheBuilder.newBuilder().expireAfterWrite(1, NANOSECONDS).build(identityLoader());
     // well, it didn't blow up.
@@ -352,6 +353,7 @@
     }
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testTimeToIdle_small() {
     CacheBuilder.newBuilder().expireAfterAccess(1, NANOSECONDS).build(identityLoader());
     // well, it didn't blow up.
@@ -380,6 +382,7 @@
     }
   }
 
+  @SuppressWarnings("ReturnValueIgnored")
   public void testTimeToIdleAndToLive() {
     CacheBuilder.newBuilder()
         .expireAfterWrite(1, NANOSECONDS)
@@ -576,7 +579,7 @@
     final CountDownLatch tasksFinished = new CountDownLatch(nTasks);
     for (int i = 0; i < nTasks; i++) {
       final String s = "a" + i;
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError =
           threadPool.submit(
               new Runnable() {
@@ -671,7 +674,7 @@
 
     ExecutorService threadPool = Executors.newFixedThreadPool(nThreads);
     for (int i = 0; i < nTasks; i++) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError =
           threadPool.submit(
               new Runnable() {
diff --git a/guava-tests/test/com/google/common/cache/CacheLoaderTest.java b/guava-tests/test/com/google/common/cache/CacheLoaderTest.java
index 6147ff2..e078ddd 100644
--- a/guava-tests/test/com/google/common/cache/CacheLoaderTest.java
+++ b/guava-tests/test/com/google/common/cache/CacheLoaderTest.java
@@ -18,10 +18,10 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
+import com.google.common.collect.Queues;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-import java.util.LinkedList;
+import java.util.Deque;
 import java.util.Map;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
@@ -36,7 +36,7 @@
 public class CacheLoaderTest extends TestCase {
 
   private static class QueuingExecutor implements Executor {
-    private LinkedList<Runnable> tasks = Lists.newLinkedList();
+    private final Deque<Runnable> tasks = Queues.newArrayDeque();
 
     @Override
     public void execute(Runnable task) {
@@ -79,7 +79,7 @@
     assertEquals(0, loadAllCount.get());
 
     baseLoader.load(new Object());
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = baseLoader.reload(new Object(), new Object());
     baseLoader.loadAll(ImmutableList.of(new Object()));
     assertEquals(1, loadCount.get());
@@ -90,7 +90,7 @@
     CacheLoader<Object, Object> asyncReloader = CacheLoader.asyncReloading(baseLoader, executor);
 
     asyncReloader.load(new Object());
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError1 = asyncReloader.reload(new Object(), new Object());
     asyncReloader.loadAll(ImmutableList.of(new Object()));
     assertEquals(2, loadCount.get());
diff --git a/guava-tests/test/com/google/common/cache/CacheLoadingTest.java b/guava-tests/test/com/google/common/cache/CacheLoadingTest.java
index ba3e7e9..f5ea546 100644
--- a/guava-tests/test/com/google/common/cache/CacheLoadingTest.java
+++ b/guava-tests/test/com/google/common/cache/CacheLoadingTest.java
@@ -1766,6 +1766,7 @@
     assertEquals(0, removalListener.getCount());
   }
 
+
   public void testReloadAfterValueReclamation() throws InterruptedException, ExecutionException {
     CountingLoader countingLoader = new CountingLoader();
     LoadingCache<Object, Object> cache =
@@ -1940,6 +1941,7 @@
     }
   }
 
+
   public void testConcurrentLoading() throws InterruptedException {
     testConcurrentLoading(CacheBuilder.newBuilder());
   }
@@ -1952,6 +1954,7 @@
     testConcurrentLoadingCheckedException(builder);
   }
 
+
   public void testConcurrentExpirationLoading() throws InterruptedException {
     testConcurrentLoading(CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS));
   }
@@ -2181,6 +2184,7 @@
     return resultList;
   }
 
+
   public void testAsMapDuringLoading() throws InterruptedException, ExecutionException {
     final CountDownLatch getStartedSignal = new CountDownLatch(2);
     final CountDownLatch letGetFinishSignal = new CountDownLatch(1);
@@ -2239,6 +2243,7 @@
     assertEquals(refreshKey + suffix, map.get(refreshKey));
   }
 
+
   public void testInvalidateDuringLoading() throws InterruptedException, ExecutionException {
     // computation starts; invalidate() is called on the key being computed, computation finishes
     final CountDownLatch computationStarted = new CountDownLatch(2);
@@ -2295,6 +2300,7 @@
     assertEquals(2, cache.size());
   }
 
+
   public void testInvalidateAndReloadDuringLoading()
       throws InterruptedException, ExecutionException {
     // computation starts; clear() is called, computation finishes
@@ -2367,6 +2373,7 @@
     assertEquals(refreshKey + suffix, map.get(refreshKey));
   }
 
+
   public void testExpandDuringLoading() throws InterruptedException {
     final int count = 3;
     final AtomicInteger callCount = new AtomicInteger();
diff --git a/guava-tests/test/com/google/common/cache/EmptyCachesTest.java b/guava-tests/test/com/google/common/cache/EmptyCachesTest.java
index a56c280..a5e3a59 100644
--- a/guava-tests/test/com/google/common/cache/EmptyCachesTest.java
+++ b/guava-tests/test/com/google/common/cache/EmptyCachesTest.java
@@ -47,6 +47,7 @@
     }
   }
 
+
   public void testInvalidate_empty() {
     for (LoadingCache<Object, Object> cache : caches()) {
       cache.getUnchecked("a");
@@ -68,6 +69,7 @@
     }
   }
 
+
   public void testEquals_null() {
     for (LoadingCache<Object, Object> cache : caches()) {
       assertFalse(cache.equals(null));
@@ -137,6 +139,7 @@
     }
   }
 
+
   public void testKeySet_clear() {
     for (LoadingCache<Object, Object> cache : caches()) {
       warmUp(cache, 0, 100);
@@ -211,6 +214,7 @@
     }
   }
 
+
   public void testValues_clear() {
     for (LoadingCache<Object, Object> cache : caches()) {
       warmUp(cache, 0, 100);
@@ -285,6 +289,7 @@
     }
   }
 
+
   public void testEntrySet_clear() {
     for (LoadingCache<Object, Object> cache : caches()) {
       warmUp(cache, 0, 100);
diff --git a/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java b/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java
index c5681d2..d78db2d 100644
--- a/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java
+++ b/guava-tests/test/com/google/common/cache/ForwardingLoadingCacheTest.java
@@ -90,7 +90,7 @@
 
   public void testSize() {
     when(mock.size()).thenReturn(0L);
-    forward.size();
+    long unused = forward.size();
   }
 
   public void testStats() {
diff --git a/guava-tests/test/com/google/common/cache/LocalCacheMapComputeTest.java b/guava-tests/test/com/google/common/cache/LocalCacheMapComputeTest.java
index 2c1e1e8..3684a70 100644
--- a/guava-tests/test/com/google/common/cache/LocalCacheMapComputeTest.java
+++ b/guava-tests/test/com/google/common/cache/LocalCacheMapComputeTest.java
@@ -18,6 +18,12 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.util.concurrent.UncheckedExecutionException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.function.IntConsumer;
 import java.util.stream.IntStream;
@@ -91,6 +97,31 @@
     assertThat(cache.getIfPresent(key).split(delimiter)).hasLength(count + 1);
   }
 
+  public void testComputeIfPresentRemove() {
+    List<RemovalNotification<Integer, Integer>> notifications = new ArrayList<>();
+    Cache<Integer, Integer> cache =
+        CacheBuilder.newBuilder()
+            .removalListener(
+                new RemovalListener<Integer, Integer>() {
+                  @Override
+                  public void onRemoval(RemovalNotification<Integer, Integer> notification) {
+                    notifications.add(notification);
+                  }
+                })
+            .build();
+    cache.put(1, 2);
+
+    // explicitly remove the existing value
+    cache.asMap().computeIfPresent(1, (key, value) -> null);
+    assertThat(notifications).hasSize(1);
+    CacheTesting.checkEmpty(cache);
+
+    // ensure no zombie entry remains
+    cache.asMap().computeIfPresent(1, (key, value) -> null);
+    assertThat(notifications).hasSize(1);
+    CacheTesting.checkEmpty(cache);
+  }
+
   public void testUpdates() {
     cache.put(key, "1");
     // simultaneous update for same key, some null, some non-null
@@ -113,6 +144,41 @@
     assertEquals(0, cache.size());
   }
 
+  public void testComputeWithLoad() {
+    Queue<RemovalNotification<String, String>> notifications = new ConcurrentLinkedQueue<>();
+    cache =
+        CacheBuilder.newBuilder()
+            .removalListener(
+                new RemovalListener<String, String>() {
+                  @Override
+                  public void onRemoval(RemovalNotification<String, String> notification) {
+                    notifications.add(notification);
+                  }
+                })
+            .expireAfterAccess(500000, TimeUnit.MILLISECONDS)
+            .maximumSize(count)
+            .build();
+
+    cache.put(key, "1");
+    // simultaneous load and deletion
+    doParallelCacheOp(
+        count,
+        n -> {
+          try {
+            cache.get(key, () -> key);
+            cache.asMap().compute(key, (k, v) -> null);
+          } catch (ExecutionException e) {
+            throw new UncheckedExecutionException(e);
+          }
+        });
+
+    CacheTesting.checkEmpty(cache);
+    for (RemovalNotification<String, String> entry : notifications) {
+      assertThat(entry.getKey()).isNotNull();
+      assertThat(entry.getValue()).isNotNull();
+    }
+  }
+
   public void testComputeExceptionally() {
     try {
       doParallelCacheOp(
diff --git a/guava-tests/test/com/google/common/cache/LocalCacheTest.java b/guava-tests/test/com/google/common/cache/LocalCacheTest.java
index f3d3f94..ceecb5d 100644
--- a/guava-tests/test/com/google/common/cache/LocalCacheTest.java
+++ b/guava-tests/test/com/google/common/cache/LocalCacheTest.java
@@ -98,6 +98,7 @@
     }
   }
 
+
   public static Test suite() {
     TestSuite suite = new TestSuite();
     suite.addTestSuite(LocalCacheTest.class);
@@ -713,6 +714,7 @@
     assertTrue(notifications.toString(), notifications.isEmpty());
   }
 
+
   public void testCopyEntry_computing() {
     final CountDownLatch startSignal = new CountDownLatch(1);
     final CountDownLatch computingSignal = new CountDownLatch(1);
@@ -814,6 +816,7 @@
     checkLogged(e);
   }
 
+
   public void testRemovalListener_replaced_computing() {
     final CountDownLatch startSignal = new CountDownLatch(1);
     final CountDownLatch computingSignal = new CountDownLatch(1);
diff --git a/guava-tests/test/com/google/common/cache/LocalLoadingCacheTest.java b/guava-tests/test/com/google/common/cache/LocalLoadingCacheTest.java
index 6b73bdc..8ba9dbc 100644
--- a/guava-tests/test/com/google/common/cache/LocalLoadingCacheTest.java
+++ b/guava-tests/test/com/google/common/cache/LocalLoadingCacheTest.java
@@ -157,7 +157,7 @@
     assertThat(map).containsEntry(three, one);
     assertThat(map).containsEntry(one, two);
 
-    // TODO(cgruber): Confirm with fry@ that this is a reasonable substitute.
+    // TODO(user): Confirm with fry@ that this is a reasonable substitute.
     // Set<Entry<Object, Object>> entries = map.entrySet();
     // assertThat(entries).containsExactly(
     //    Maps.immutableEntry(three, one), Maps.immutableEntry(one, two));
@@ -293,6 +293,7 @@
     assertFalse(segment.recencyQueue.isEmpty());
   }
 
+
   public void testRecursiveComputation() throws InterruptedException {
     final AtomicReference<LoadingCache<Integer, String>> cacheRef = new AtomicReference<>();
     CacheLoader<Integer, String> recursiveLoader =
diff --git a/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java b/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java
index 1e71b63..b02b8ac 100644
--- a/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java
+++ b/guava-tests/test/com/google/common/cache/PopulatedCachesTest.java
@@ -187,6 +187,7 @@
     }
   }
 
+
   public void testKeySet_populated() {
     for (LoadingCache<Object, Object> cache : caches()) {
       Set<Object> keys = cache.asMap().keySet();
@@ -237,6 +238,7 @@
     }
   }
 
+
   public void testEntrySet_populated() {
     for (LoadingCache<Object, Object> cache : caches()) {
       Set<Entry<Object, Object>> entries = cache.asMap().entrySet();
diff --git a/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java b/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
index 4cb9d1b..3592210 100644
--- a/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
+++ b/guava-tests/test/com/google/common/collect/AbstractIteratorTest.java
@@ -137,6 +137,7 @@
     }
   }
 
+
   @GwtIncompatible // weak references
   public void testFreesNextReference() {
     Iterator<Object> itr =
diff --git a/guava-tests/test/com/google/common/collect/DiscreteDomainTest.java b/guava-tests/test/com/google/common/collect/DiscreteDomainTest.java
index 5de3f8d..b9e15fd 100644
--- a/guava-tests/test/com/google/common/collect/DiscreteDomainTest.java
+++ b/guava-tests/test/com/google/common/collect/DiscreteDomainTest.java
@@ -87,4 +87,48 @@
     } catch (IllegalArgumentException expected) {
     }
   }
+
+  public void testCustomOffsetExceptions() {
+    try {
+      new MyIntegerDomain().offset(0, -1);
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+    try {
+      new MyIntegerDomain().offset(Integer.MAX_VALUE, 1);
+      fail();
+    } catch (IllegalArgumentException expected) {
+    }
+  }
+
+  private static final class MyIntegerDomain extends DiscreteDomain<Integer> {
+    static final DiscreteDomain<Integer> DELEGATE = DiscreteDomain.integers();
+
+    @Override
+    public Integer next(Integer value) {
+      return DELEGATE.next(value);
+    }
+
+    @Override
+    public Integer previous(Integer value) {
+      return DELEGATE.previous(value);
+    }
+
+    // Do *not* override offset() to delegate: We want to test the default implementation.
+
+    @Override
+    public long distance(Integer start, Integer end) {
+      return DELEGATE.distance(start, end);
+    }
+
+    @Override
+    public Integer minValue() {
+      return DELEGATE.minValue();
+    }
+
+    @Override
+    public Integer maxValue() {
+      return DELEGATE.maxValue();
+    }
+  }
 }
diff --git a/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java b/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
index 0f95428..fa0a7c1 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableBiMapTest.java
@@ -37,6 +37,7 @@
 import com.google.common.testing.CollectorTester;
 import com.google.common.testing.SerializableTester;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.util.AbstractMap;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumSet;
@@ -426,6 +427,136 @@
           "four",
           5,
           "five");
+      assertMapEquals(
+          ImmutableBiMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6);
+      assertMapEquals(
+          ImmutableBiMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7);
+      assertMapEquals(
+          ImmutableBiMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8);
+      assertMapEquals(
+          ImmutableBiMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8,
+          "nine",
+          9);
+      assertMapEquals(
+          ImmutableBiMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9,
+              "ten", 10),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8,
+          "nine",
+          9,
+          "ten",
+          10);
     }
 
     public void testOfNullKey() {
@@ -465,6 +596,30 @@
       }
     }
 
+    public void testOfEntries() {
+      assertMapEquals(
+          ImmutableBiMap.ofEntries(entry("one", 1), entry("two", 2)), "one", 1, "two", 2);
+    }
+
+    public void testOfEntriesNull() {
+      Entry<Integer, Integer> nullKey = entry(null, 23);
+      try {
+        ImmutableBiMap.ofEntries(nullKey);
+        fail();
+      } catch (NullPointerException expected) {
+      }
+      Entry<Integer, Integer> nullValue = entry(23, null);
+      try {
+        ImmutableBiMap.ofEntries(nullValue);
+        fail();
+      } catch (NullPointerException expected) {
+      }
+    }
+
+    private static <T> Entry<T, T> entry(T key, T value) {
+      return new AbstractMap.SimpleImmutableEntry<>(key, value);
+    }
+
     public void testCopyOfEmptyMap() {
       ImmutableBiMap<String, Integer> copy =
           ImmutableBiMap.copyOf(Collections.<String, Integer>emptyMap());
diff --git a/guava-tests/test/com/google/common/collect/ImmutableListMultimapTest.java b/guava-tests/test/com/google/common/collect/ImmutableListMultimapTest.java
index d270610..4e0bdda 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableListMultimapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableListMultimapTest.java
@@ -32,6 +32,7 @@
 import com.google.common.collect.testing.google.UnmodifiableCollectionTests;
 import com.google.common.testing.CollectorTester;
 import com.google.common.testing.EqualsTester;
+import com.google.common.testing.NullPointerTester;
 import com.google.common.testing.SerializableTester;
 import java.util.Arrays;
 import java.util.Collection;
@@ -601,4 +602,13 @@
     Multimap<String, Integer> multimap = ImmutableListMultimap.of();
     assertSame(multimap, SerializableTester.reserialize(multimap));
   }
+
+  @GwtIncompatible // reflection
+  public void testNulls() throws Exception {
+    NullPointerTester tester = new NullPointerTester();
+    tester.testAllPublicStaticMethods(ImmutableListMultimap.class);
+    tester.ignore(ImmutableListMultimap.class.getMethod("get", Object.class));
+    tester.testAllPublicInstanceMethods(ImmutableListMultimap.of());
+    tester.testAllPublicInstanceMethods(ImmutableListMultimap.of("a", 1));
+  }
 }
diff --git a/guava-tests/test/com/google/common/collect/ImmutableMapTest.java b/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
index 34d1e21..18a17a0 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableMapTest.java
@@ -19,6 +19,7 @@
 import static com.google.common.collect.testing.Helpers.mapEntry;
 import static com.google.common.testing.SerializableTester.reserialize;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -621,6 +622,136 @@
           4,
           "five",
           5);
+      assertMapEquals(
+          ImmutableMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6);
+      assertMapEquals(
+          ImmutableMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7);
+      assertMapEquals(
+          ImmutableMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8);
+      assertMapEquals(
+          ImmutableMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8,
+          "nine",
+          9);
+      assertMapEquals(
+          ImmutableMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9,
+              "ten", 10),
+          "one",
+          1,
+          "two",
+          2,
+          "three",
+          3,
+          "four",
+          4,
+          "five",
+          5,
+          "six",
+          6,
+          "seven",
+          7,
+          "eight",
+          8,
+          "nine",
+          9,
+          "ten",
+          10);
     }
 
     public void testOfNullKey() {
@@ -949,18 +1080,87 @@
 
   public void testEquals() {
     new EqualsTester()
-        .addEqualityGroup(ImmutableMap.of(), ImmutableMap.builder().build())
-        .addEqualityGroup(ImmutableMap.of(1, 1), ImmutableMap.builder().put(1, 1).build())
-        .addEqualityGroup(ImmutableMap.of(1, 1, 2, 2))
-        .addEqualityGroup(ImmutableMap.of(1, 1, 2, 2, 3, 3))
-        .addEqualityGroup(ImmutableMap.of(1, 4, 2, 2, 3, 3))
-        .addEqualityGroup(ImmutableMap.of(1, 1, 2, 4, 3, 3))
-        .addEqualityGroup(ImmutableMap.of(1, 1, 2, 2, 3, 4))
-        .addEqualityGroup(ImmutableMap.of(1, 2, 2, 3, 3, 1))
-        .addEqualityGroup(ImmutableMap.of(1, 1, 2, 2, 3, 3, 4, 4))
+        .addEqualityGroup(
+            ImmutableMap.of(), ImmutableMap.builder().build(), ImmutableMap.ofEntries(), map())
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1),
+            ImmutableMap.builder().put(1, 1).build(),
+            ImmutableMap.ofEntries(entry(1, 1)),
+            map(1, 1))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 2),
+            ImmutableMap.builder().put(1, 1).put(2, 2).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 2)),
+            map(1, 1, 2, 2))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 2, 3, 3),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3)),
+            map(1, 1, 2, 2, 3, 3))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 4, 2, 2, 3, 3),
+            ImmutableMap.builder().put(1, 4).put(2, 2).put(3, 3).build(),
+            ImmutableMap.ofEntries(entry(1, 4), entry(2, 2), entry(3, 3)),
+            map(1, 4, 2, 2, 3, 3))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 4, 3, 3),
+            ImmutableMap.builder().put(1, 1).put(2, 4).put(3, 3).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 4), entry(3, 3)),
+            map(1, 1, 2, 4, 3, 3))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 2, 3, 4),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 4).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 4)),
+            map(1, 1, 2, 2, 3, 4))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 2, 2, 3, 3, 1),
+            ImmutableMap.builder().put(1, 2).put(2, 3).put(3, 1).build(),
+            ImmutableMap.ofEntries(entry(1, 2), entry(2, 3), entry(3, 1)),
+            map(1, 2, 2, 3, 3, 1))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 2, 3, 3, 4, 4),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3), entry(4, 4)),
+            map(1, 1, 2, 2, 3, 3, 4, 4))
+        .addEqualityGroup(
+            ImmutableMap.of(1, 1, 2, 2, 3, 3, 4, 4, 5, 5),
+            ImmutableMap.builder().put(1, 1).put(2, 2).put(3, 3).put(4, 4).put(5, 5).build(),
+            ImmutableMap.ofEntries(entry(1, 1), entry(2, 2), entry(3, 3), entry(4, 4), entry(5, 5)),
+            map(1, 1, 2, 2, 3, 3, 4, 4, 5, 5))
         .testEquals();
   }
 
+  public void testOfEntriesNull() {
+    Entry<Integer, Integer> nullKey = entry(null, 23);
+    try {
+      ImmutableMap.ofEntries(nullKey);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+    Entry<Integer, Integer> nullValue = entry(23, null);
+    try {
+      ImmutableMap.ofEntries(nullValue);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+  }
+
+  private static <T> Map<T, T> map(T... keysAndValues) {
+    assertThat(keysAndValues.length % 2).isEqualTo(0);
+    LinkedHashMap<T, T> map = new LinkedHashMap<>();
+    for (int i = 0; i < keysAndValues.length; i += 2) {
+      T key = keysAndValues[i];
+      T value = keysAndValues[i + 1];
+      T old = map.put(key, value);
+      assertWithMessage("Key %s set to %s and %s", key, value, old).that(old).isNull();
+    }
+    return map;
+  }
+
+  private static <T> Entry<T, T> entry(T key, T value) {
+    return new AbstractMap.SimpleImmutableEntry<>(key, value);
+  }
+
   public void testCopyOfMutableEntryList() {
     List<Entry<String, String>> entryList =
         Arrays.asList(
diff --git a/guava-tests/test/com/google/common/collect/ImmutableMultimapTest.java b/guava-tests/test/com/google/common/collect/ImmutableMultimapTest.java
index 5263258..ac09593 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableMultimapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableMultimapTest.java
@@ -17,11 +17,13 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.GwtIncompatible;
 import com.google.common.collect.ImmutableMultimap.Builder;
 import com.google.common.collect.testing.SampleElements;
 import com.google.common.collect.testing.SampleElements.Unhashables;
 import com.google.common.collect.testing.UnhashableObject;
 import com.google.common.testing.EqualsTester;
+import com.google.common.testing.NullPointerTester;
 import java.util.Arrays;
 import java.util.Map.Entry;
 import junit.framework.TestCase;
@@ -124,4 +126,13 @@
             ImmutableMultimap.of(1, "a", 2, "b"), ImmutableMultimap.of(2, "b", 1, "a"))
         .testEquals();
   }
+
+  @GwtIncompatible // reflection
+  public void testNulls() throws Exception {
+    NullPointerTester tester = new NullPointerTester();
+    tester.testAllPublicStaticMethods(ImmutableMultimap.class);
+    tester.ignore(ImmutableListMultimap.class.getMethod("get", Object.class));
+    tester.testAllPublicInstanceMethods(ImmutableMultimap.of());
+    tester.testAllPublicInstanceMethods(ImmutableMultimap.of("a", 1));
+  }
 }
diff --git a/guava-tests/test/com/google/common/collect/ImmutableRangeMapTest.java b/guava-tests/test/com/google/common/collect/ImmutableRangeMapTest.java
index a245e0c..e5caa62 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableRangeMapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableRangeMapTest.java
@@ -208,6 +208,7 @@
     }
   }
 
+
   public void testSubRangeMap() {
     for (Range<Integer> range1 : RANGES) {
       for (Range<Integer> range2 : RANGES) {
@@ -256,7 +257,7 @@
     SerializableTester.reserializeAndAssert(nonEmptyRangeMap);
   }
 
-  public void testToImmutableRangeSet() {
+  public void testToImmutableRangeMap() {
     Range<Integer> rangeOne = Range.closedOpen(1, 5);
     Range<Integer> rangeTwo = Range.openClosed(6, 7);
     ImmutableRangeMap<Integer, Integer> rangeMap =
diff --git a/guava-tests/test/com/google/common/collect/ImmutableSetMultimapTest.java b/guava-tests/test/com/google/common/collect/ImmutableSetMultimapTest.java
index a1b2c0f..842ba92 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableSetMultimapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableSetMultimapTest.java
@@ -32,6 +32,7 @@
 import com.google.common.collect.testing.google.UnmodifiableCollectionTests;
 import com.google.common.testing.CollectorTester;
 import com.google.common.testing.EqualsTester;
+import com.google.common.testing.NullPointerTester;
 import com.google.common.testing.SerializableTester;
 import java.util.Arrays;
 import java.util.Collection;
@@ -624,4 +625,13 @@
         .put("foo", 3)
         .build();
   }
+
+  @GwtIncompatible // reflection
+  public void testNulls() throws Exception {
+    NullPointerTester tester = new NullPointerTester();
+    tester.testAllPublicStaticMethods(ImmutableSetMultimap.class);
+    tester.ignore(ImmutableSetMultimap.class.getMethod("get", Object.class));
+    tester.testAllPublicInstanceMethods(ImmutableSetMultimap.of());
+    tester.testAllPublicInstanceMethods(ImmutableSetMultimap.of("a", 1));
+  }
 }
diff --git a/guava-tests/test/com/google/common/collect/ImmutableSetTest.java b/guava-tests/test/com/google/common/collect/ImmutableSetTest.java
index 06d6a8e..1828517 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableSetTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableSetTest.java
@@ -378,6 +378,12 @@
         .testEquals();
   }
 
+  /**
+   * The maximum allowed probability of falsely detecting a hash flooding attack if the input is
+   * randomly generated.
+   */
+  private static final double HASH_FLOODING_FPP = 0.001;
+
   public void testReuseBuilderReducingHashTableSizeWithPowerOfTwoTotalElements() {
     ImmutableSet.Builder<Object> builder = ImmutableSet.builderWithExpectedSize(6);
     builder.add(0);
diff --git a/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java b/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
index 03738c0..2136f2a 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableSortedMapTest.java
@@ -320,6 +320,7 @@
       assertMapEquals(map, "five", 5, "four", 4, "one", 1, "three", 3, "two", 2);
     }
 
+    @SuppressWarnings("DoNotCall")
     public void testBuilder_orderEntriesByValueFails() {
       ImmutableSortedMap.Builder<String, Integer> builder = ImmutableSortedMap.naturalOrder();
       try {
@@ -487,6 +488,136 @@
           3,
           "two",
           2);
+      assertMapEquals(
+          ImmutableSortedMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6),
+          "five",
+          5,
+          "four",
+          4,
+          "one",
+          1,
+          "six",
+          6,
+          "three",
+          3,
+          "two",
+          2);
+      assertMapEquals(
+          ImmutableSortedMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7),
+          "five",
+          5,
+          "four",
+          4,
+          "one",
+          1,
+          "seven",
+          7,
+          "six",
+          6,
+          "three",
+          3,
+          "two",
+          2);
+      assertMapEquals(
+          ImmutableSortedMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8),
+          "eight",
+          8,
+          "five",
+          5,
+          "four",
+          4,
+          "one",
+          1,
+          "seven",
+          7,
+          "six",
+          6,
+          "three",
+          3,
+          "two",
+          2);
+      assertMapEquals(
+          ImmutableSortedMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9),
+          "eight",
+          8,
+          "five",
+          5,
+          "four",
+          4,
+          "nine",
+          9,
+          "one",
+          1,
+          "seven",
+          7,
+          "six",
+          6,
+          "three",
+          3,
+          "two",
+          2);
+      assertMapEquals(
+          ImmutableSortedMap.of(
+              "one", 1,
+              "two", 2,
+              "three", 3,
+              "four", 4,
+              "five", 5,
+              "six", 6,
+              "seven", 7,
+              "eight", 8,
+              "nine", 9,
+              "ten", 10),
+          "eight",
+          8,
+          "five",
+          5,
+          "four",
+          4,
+          "nine",
+          9,
+          "one",
+          1,
+          "seven",
+          7,
+          "six",
+          6,
+          "ten",
+          10,
+          "three",
+          3,
+          "two",
+          2);
     }
 
     public void testOfNullKey() {
diff --git a/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java b/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java
index 1f45227..b4cd891 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableSortedSetTest.java
@@ -965,7 +965,7 @@
     assertTrue(Iterables.elementsEqual(LegacyComparable.VALUES_BACKWARD, set));
   }
 
-  @SuppressWarnings({"deprecation", "static-access"})
+  @SuppressWarnings({"deprecation", "static-access", "DoNotCall"})
   public void testBuilderMethod() {
     try {
       ImmutableSortedSet.builder();
diff --git a/guava-tests/test/com/google/common/collect/ImmutableTableTest.java b/guava-tests/test/com/google/common/collect/ImmutableTableTest.java
index fdc1625..d48938c 100644
--- a/guava-tests/test/com/google/common/collect/ImmutableTableTest.java
+++ b/guava-tests/test/com/google/common/collect/ImmutableTableTest.java
@@ -20,13 +20,10 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
-import com.google.common.base.Equivalence;
-import com.google.common.base.MoreObjects;
 import com.google.common.collect.Table.Cell;
 import com.google.common.testing.CollectorTester;
 import com.google.common.testing.SerializableTester;
 import java.util.stream.Collector;
-import java.util.stream.Stream;
 
 /**
  * Tests common methods in {@link ImmutableTable}
@@ -44,153 +41,26 @@
     return builder.build();
   }
 
-  public void testToImmutableTable() {
+  // The bulk of the toImmutableTable tests can be found in TableCollectorsTest.
+  // This gives minimal coverage to the forwarding functions
+  public void testToImmutableTableSanityTest() {
     Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
-        ImmutableTable.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
-    Equivalence<ImmutableTable<String, String, Integer>> equivalence =
-        Equivalence.equals()
-            .<Cell<String, String, Integer>>pairwise()
-            .onResultOf(ImmutableTable::cellSet);
-    CollectorTester.of(collector, equivalence)
-        .expectCollects(
-            new ImmutableTable.Builder<String, String, Integer>()
-                .put("one", "uno", 1)
-                .put("two", "dos", 2)
-                .put("three", "tres", 3)
-                .build(),
-            Tables.immutableCell("one", "uno", 1),
-            Tables.immutableCell("two", "dos", 2),
-            Tables.immutableCell("three", "tres", 3));
+        TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
+    CollectorTester.of(collector)
+        .expectCollects(ImmutableTable.of())
+        .expectCollects(ImmutableTable.of("one", "uno", 1), Tables.immutableCell("one", "uno", 1));
   }
 
-  public void testToImmutableTableConflict() {
+  public void testToImmutableTableMergingSanityTest() {
     Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
-        ImmutableTable.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
-    try {
-      Stream.of(Tables.immutableCell("one", "uno", 1), Tables.immutableCell("one", "uno", 2))
-          .collect(collector);
-      fail("Expected IllegalArgumentException");
-    } catch (IllegalArgumentException expected) {
-    }
-  }
-
-  public void testToImmutableTableNullRowKey() {
-    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
-        ImmutableTable.toImmutableTable(t -> null, Cell::getColumnKey, Cell::getValue);
-    try {
-      Stream.of(Tables.immutableCell("one", "uno", 1)).collect(collector);
-      fail("Expected NullPointerException");
-    } catch (NullPointerException expected) {
-    }
-  }
-
-  public void testToImmutableTableNullColumnKey() {
-    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
-        ImmutableTable.toImmutableTable(Cell::getRowKey, t -> null, Cell::getValue);
-    try {
-      Stream.of(Tables.immutableCell("one", "uno", 1)).collect(collector);
-      fail("Expected NullPointerException");
-    } catch (NullPointerException expected) {
-    }
-  }
-
-  public void testToImmutableTableNullValue() {
-    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
-        ImmutableTable.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, t -> null);
-    try {
-      Stream.of(Tables.immutableCell("one", "uno", 1)).collect(collector);
-      fail("Expected NullPointerException");
-    } catch (NullPointerException expected) {
-    }
-    collector =
-        ImmutableTable.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
-    try {
-      Stream.of(
-              Tables.immutableCell("one", "uno", 1),
-              Tables.immutableCell("one", "uno", (Integer) null))
-          .collect(collector);
-      fail("Expected NullPointerException");
-    } catch (NullPointerException expected) {
-    }
-  }
-
-  public void testToImmutableTableMerging() {
-    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
-        ImmutableTable.toImmutableTable(
+        TableCollectors.toImmutableTable(
             Cell::getRowKey, Cell::getColumnKey, Cell::getValue, Integer::sum);
-    Equivalence<ImmutableTable<String, String, Integer>> equivalence =
-        Equivalence.equals()
-            .<Cell<String, String, Integer>>pairwise()
-            .onResultOf(ImmutableTable::cellSet);
-    CollectorTester.of(collector, equivalence)
+    CollectorTester.of(collector)
+        .expectCollects(ImmutableTable.of())
         .expectCollects(
-            new ImmutableTable.Builder<String, String, Integer>()
-                .put("one", "uno", 1)
-                .put("two", "dos", 6)
-                .put("three", "tres", 3)
-                .build(),
+            ImmutableTable.of("one", "uno", 3),
             Tables.immutableCell("one", "uno", 1),
-            Tables.immutableCell("two", "dos", 2),
-            Tables.immutableCell("three", "tres", 3),
-            Tables.immutableCell("two", "dos", 4));
-  }
-
-  public void testToImmutableTableMergingNullRowKey() {
-    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
-        ImmutableTable.toImmutableTable(
-            t -> null, Cell::getColumnKey, Cell::getValue, Integer::sum);
-    try {
-      Stream.of(Tables.immutableCell("one", "uno", 1)).collect(collector);
-      fail("Expected NullPointerException");
-    } catch (NullPointerException expected) {
-    }
-  }
-
-  public void testToImmutableTableMergingNullColumnKey() {
-    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
-        ImmutableTable.toImmutableTable(Cell::getRowKey, t -> null, Cell::getValue, Integer::sum);
-    try {
-      Stream.of(Tables.immutableCell("one", "uno", 1)).collect(collector);
-      fail("Expected NullPointerException");
-    } catch (NullPointerException expected) {
-    }
-  }
-
-  public void testToImmutableTableMergingNullValue() {
-    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
-        ImmutableTable.toImmutableTable(
-            Cell::getRowKey, Cell::getColumnKey, t -> null, Integer::sum);
-    try {
-      Stream.of(Tables.immutableCell("one", "uno", 1)).collect(collector);
-      fail("Expected NullPointerException");
-    } catch (NullPointerException expected) {
-    }
-    collector =
-        ImmutableTable.toImmutableTable(
-            Cell::getRowKey,
-            Cell::getColumnKey,
-            Cell::getValue,
-            (i, j) -> MoreObjects.firstNonNull(i, 0) + MoreObjects.firstNonNull(j, 0));
-    try {
-      Stream.of(
-              Tables.immutableCell("one", "uno", 1),
-              Tables.immutableCell("one", "uno", (Integer) null))
-          .collect(collector);
-      fail("Expected NullPointerException");
-    } catch (NullPointerException expected) {
-    }
-  }
-
-  public void testToImmutableTableMergingNullMerge() {
-    Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>> collector =
-        ImmutableTable.toImmutableTable(
-            Cell::getRowKey, Cell::getColumnKey, Cell::getValue, (v1, v2) -> null);
-    try {
-      Stream.of(Tables.immutableCell("one", "uno", 1), Tables.immutableCell("one", "uno", 2))
-          .collect(collector);
-      fail("Expected NullPointerException");
-    } catch (NullPointerException expected) {
-    }
+            Tables.immutableCell("one", "uno", 2));
   }
 
   public void testBuilder() {
diff --git a/guava-tests/test/com/google/common/collect/InternersTest.java b/guava-tests/test/com/google/common/collect/InternersTest.java
index 08bdc53..cfa14b8 100644
--- a/guava-tests/test/com/google/common/collect/InternersTest.java
+++ b/guava-tests/test/com/google/common/collect/InternersTest.java
@@ -84,6 +84,7 @@
     assertEquals(concurrencyLevel, internerImpl.map.concurrencyLevel);
   }
 
+
   public void testWeak_afterGC() throws InterruptedException {
     Integer canonical = new Integer(5);
     Integer not = new Integer(5);
diff --git a/guava-tests/test/com/google/common/collect/MoreCollectorsTest.java b/guava-tests/test/com/google/common/collect/MoreCollectorsTest.java
index f5c5f26..65a8971 100644
--- a/guava-tests/test/com/google/common/collect/MoreCollectorsTest.java
+++ b/guava-tests/test/com/google/common/collect/MoreCollectorsTest.java
@@ -57,6 +57,14 @@
     }
   }
 
+  public void testToOptionalMultipleWithNull() {
+    try {
+      Stream.of(1, null).collect(MoreCollectors.toOptional());
+      fail("Expected NullPointerException");
+    } catch (NullPointerException expected) {
+    }
+  }
+
   public void testToOptionalMany() {
     try {
       Stream.of(1, 2, 3, 4, 5, 6).collect(MoreCollectors.toOptional());
diff --git a/guava-tests/test/com/google/common/collect/QueuesTest.java b/guava-tests/test/com/google/common/collect/QueuesTest.java
index 9b45116..ba5f4f0 100644
--- a/guava-tests/test/com/google/common/collect/QueuesTest.java
+++ b/guava-tests/test/com/google/common/collect/QueuesTest.java
@@ -101,15 +101,15 @@
 
   private void testMultipleProducers(BlockingQueue<Object> q) throws InterruptedException {
     for (boolean interruptibly : new boolean[] {true, false}) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError = threadPool.submit(new Producer(q, 20));
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError1 = threadPool.submit(new Producer(q, 20));
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError2 = threadPool.submit(new Producer(q, 20));
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError3 = threadPool.submit(new Producer(q, 20));
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError4 = threadPool.submit(new Producer(q, 20));
 
       List<Object> buf = newArrayList();
@@ -182,7 +182,7 @@
   }
 
   private void testNegativeMaxElements(BlockingQueue<Object> q) throws InterruptedException {
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = threadPool.submit(new Producer(q, 1));
 
     List<Object> buf = newArrayList();
@@ -201,7 +201,7 @@
   }
 
   private void testDrain_throws(BlockingQueue<Object> q) {
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = threadPool.submit(new Interrupter(currentThread()));
     try {
       Queues.drain(q, ImmutableList.of(), 100, MAX_VALUE, NANOSECONDS);
@@ -218,7 +218,7 @@
 
   private void testDrainUninterruptibly_doesNotThrow(final BlockingQueue<Object> q) {
     final Thread mainThread = currentThread();
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError =
         threadPool.submit(
             new Callable<Void>() {
@@ -276,7 +276,7 @@
     }
 
     // but does the wait actually occurs?
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = threadPool.submit(new Interrupter(currentThread()));
     try {
       // if waiting works, this should get stuck
@@ -292,7 +292,7 @@
     assertEquals(0, Queues.drainUninterruptibly(q, ImmutableList.of(), 0, 10, MILLISECONDS));
 
     // but does the wait actually occurs?
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = threadPool.submit(new Interrupter(currentThread()));
 
     Stopwatch timer = Stopwatch.createStarted();
diff --git a/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java b/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java
index 0a11b27..1df6aa1 100644
--- a/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java
+++ b/guava-tests/test/com/google/common/collect/SynchronizedDequeTest.java
@@ -254,6 +254,7 @@
     private static final long serialVersionUID = 0;
   }
 
+  @SuppressWarnings("CheckReturnValue")
   public void testHoldsLockOnAllOperations() {
     create().element();
     create().offer("foo");
@@ -263,8 +264,8 @@
     create().add("foo");
     create().addAll(ImmutableList.of("foo"));
     create().clear();
-    boolean unused = create().contains("foo");
-    boolean unused2 = create().containsAll(ImmutableList.of("foo"));
+    create().contains("foo");
+    create().containsAll(ImmutableList.of("foo"));
     create().equals(new ArrayDeque<>(ImmutableList.of("foo")));
     create().hashCode();
     create().isEmpty();
diff --git a/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java b/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
index 34d1c6f..b07802a 100644
--- a/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
+++ b/guava-tests/test/com/google/common/collect/SynchronizedMapTest.java
@@ -159,11 +159,11 @@
    */
 
   public void testSize() {
-    create().size();
+    int unused = create().size();
   }
 
   public void testIsEmpty() {
-    create().isEmpty();
+    boolean unused = create().isEmpty();
   }
 
   public void testRemove() {
diff --git a/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java b/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java
index ac48846..1e2290d 100644
--- a/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java
+++ b/guava-tests/test/com/google/common/collect/SynchronizedQueueTest.java
@@ -153,6 +153,7 @@
     private static final long serialVersionUID = 0;
   }
 
+  @SuppressWarnings("CheckReturnValue")
   public void testHoldsLockOnAllOperations() {
     create().element();
     create().offer("foo");
@@ -162,8 +163,8 @@
     create().add("foo");
     create().addAll(ImmutableList.of("foo"));
     create().clear();
-    boolean unused = create().contains("foo");
-    boolean unused2 = create().containsAll(ImmutableList.of("foo"));
+    create().contains("foo");
+    create().containsAll(ImmutableList.of("foo"));
     create().equals(new ArrayDeque<>(ImmutableList.of("foo")));
     create().hashCode();
     create().isEmpty();
diff --git a/guava-tests/test/com/google/common/collect/TableCollectorsTest.java b/guava-tests/test/com/google/common/collect/TableCollectorsTest.java
new file mode 100644
index 0000000..98b7074
--- /dev/null
+++ b/guava-tests/test/com/google/common/collect/TableCollectorsTest.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2009 The Guava Authors
+ *
+ * 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 com.google.common.collect;
+
+import static com.google.common.collect.Tables.immutableCell;
+
+import com.google.common.annotations.GwtCompatible;
+import com.google.common.base.Equivalence;
+import com.google.common.base.Function;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.Table.Cell;
+import com.google.common.testing.CollectorTester;
+import java.util.function.BiPredicate;
+import java.util.stream.Collector;
+import java.util.stream.Stream;
+import junit.framework.TestCase;
+
+/** Unit tests for {@link TableCollectors}. */
+@GwtCompatible(emulated = true)
+public class TableCollectorsTest {
+
+  public static final class ToImmutableTableTest extends TestCase {
+    public void testToImmutableTable() {
+      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
+          collector =
+              TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
+      BiPredicate<ImmutableTable<String, String, Integer>, ImmutableTable<String, String, Integer>>
+          equivalence = pairwiseOnResultOf(ImmutableTable::cellSet);
+      CollectorTester.of(collector, equivalence)
+          .expectCollects(
+              new ImmutableTable.Builder<String, String, Integer>()
+                  .put("one", "uno", 1)
+                  .put("two", "dos", 2)
+                  .put("three", "tres", 3)
+                  .build(),
+              immutableCell("one", "uno", 1),
+              immutableCell("two", "dos", 2),
+              immutableCell("three", "tres", 3));
+    }
+
+    public void testToImmutableTableConflict() {
+      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
+          collector =
+              TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
+      try {
+        Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", 2))
+            .collect(collector);
+        fail("Expected IllegalArgumentException");
+      } catch (IllegalArgumentException expected) {
+      }
+    }
+
+    public void testToImmutableTableNullRowKey() {
+      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
+          collector =
+              TableCollectors.toImmutableTable(t -> null, Cell::getColumnKey, Cell::getValue);
+      try {
+        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+        fail("Expected NullPointerException");
+      } catch (NullPointerException expected) {
+      }
+    }
+
+    public void testToImmutableTableNullColumnKey() {
+      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
+          collector = TableCollectors.toImmutableTable(Cell::getRowKey, t -> null, Cell::getValue);
+      try {
+        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+        fail("Expected NullPointerException");
+      } catch (NullPointerException expected) {
+      }
+    }
+
+    public void testToImmutableTableNullValue() {
+      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
+          collector =
+              TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, t -> null);
+      try {
+        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+        fail("Expected NullPointerException");
+      } catch (NullPointerException expected) {
+      }
+      collector =
+          TableCollectors.toImmutableTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue);
+      try {
+        Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", (Integer) null))
+            .collect(collector);
+        fail("Expected NullPointerException");
+      } catch (NullPointerException expected) {
+      }
+    }
+
+    public void testToImmutableTableMerging() {
+      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
+          collector =
+              TableCollectors.toImmutableTable(
+                  Cell::getRowKey, Cell::getColumnKey, Cell::getValue, Integer::sum);
+      BiPredicate<ImmutableTable<String, String, Integer>, ImmutableTable<String, String, Integer>>
+          equivalence = pairwiseOnResultOf(ImmutableTable::cellSet);
+      CollectorTester.of(collector, equivalence)
+          .expectCollects(
+              new ImmutableTable.Builder<String, String, Integer>()
+                  .put("one", "uno", 1)
+                  .put("two", "dos", 6)
+                  .put("three", "tres", 3)
+                  .build(),
+              immutableCell("one", "uno", 1),
+              immutableCell("two", "dos", 2),
+              immutableCell("three", "tres", 3),
+              immutableCell("two", "dos", 4));
+    }
+
+    public void testToImmutableTableMergingNullRowKey() {
+      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
+          collector =
+              TableCollectors.toImmutableTable(
+                  t -> null, Cell::getColumnKey, Cell::getValue, Integer::sum);
+      try {
+        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+        fail("Expected NullPointerException");
+      } catch (NullPointerException expected) {
+      }
+    }
+
+    public void testToImmutableTableMergingNullColumnKey() {
+      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
+          collector =
+              TableCollectors.toImmutableTable(
+                  Cell::getRowKey, t -> null, Cell::getValue, Integer::sum);
+      try {
+        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+        fail("Expected NullPointerException");
+      } catch (NullPointerException expected) {
+      }
+    }
+
+    public void testToImmutableTableMergingNullValue() {
+      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
+          collector =
+              TableCollectors.toImmutableTable(
+                  Cell::getRowKey, Cell::getColumnKey, t -> null, Integer::sum);
+      try {
+        Stream.of(immutableCell("one", "uno", 1)).collect(collector);
+        fail("Expected NullPointerException");
+      } catch (NullPointerException expected) {
+      }
+      collector =
+          TableCollectors.toImmutableTable(
+              Cell::getRowKey,
+              Cell::getColumnKey,
+              Cell::getValue,
+              (i, j) -> MoreObjects.firstNonNull(i, 0) + MoreObjects.firstNonNull(j, 0));
+      try {
+        Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", (Integer) null))
+            .collect(collector);
+        fail("Expected NullPointerException");
+      } catch (NullPointerException expected) {
+      }
+    }
+
+    public void testToImmutableTableMergingNullMerge() {
+      Collector<Cell<String, String, Integer>, ?, ImmutableTable<String, String, Integer>>
+          collector =
+              TableCollectors.toImmutableTable(
+                  Cell::getRowKey, Cell::getColumnKey, Cell::getValue, (v1, v2) -> null);
+      try {
+        Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", 2))
+            .collect(collector);
+        fail("Expected NullPointerException");
+      } catch (NullPointerException expected) {
+      }
+    }
+  }
+
+  public static final class ToTableTest extends TestCase {
+
+    public void testToTable() {
+      Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
+          TableCollectors.toTable(
+              Cell::getRowKey, Cell::getColumnKey, Cell::getValue, HashBasedTable::create);
+      BiPredicate<Table<String, String, Integer>, Table<String, String, Integer>> equivalence =
+          pairwiseOnResultOf(Table::cellSet);
+      CollectorTester.of(collector, equivalence)
+          .expectCollects(
+              new ImmutableTable.Builder<String, String, Integer>()
+                  .put("one", "uno", 1)
+                  .put("two", "dos", 2)
+                  .put("three", "tres", 3)
+                  .build(),
+              immutableCell("one", "uno", 1),
+              immutableCell("two", "dos", 2),
+              immutableCell("three", "tres", 3));
+    }
+
+    public void testToTableNullMerge() {
+      Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
+          TableCollectors.toTable(
+              Cell::getRowKey,
+              Cell::getColumnKey,
+              Cell::getValue,
+              (Integer v1, Integer v2) -> null,
+              HashBasedTable::create);
+      BiPredicate<Table<String, String, Integer>, Table<String, String, Integer>> equivalence =
+          pairwiseOnResultOf(Table::cellSet);
+      CollectorTester.of(collector, equivalence)
+          .expectCollects(
+              ImmutableTable.of(), immutableCell("one", "uno", 1), immutableCell("one", "uno", 2));
+    }
+
+    public void testToTableNullValues() {
+      Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
+          TableCollectors.toTable(
+              Cell::getRowKey,
+              Cell::getColumnKey,
+              Cell::getValue,
+              () -> ArrayTable.create(ImmutableList.of("one"), ImmutableList.of("uno")));
+      try {
+        Stream.of(immutableCell("one", "uno", (Integer) null)).collect(collector);
+        fail("Expected NullPointerException");
+      } catch (NullPointerException expected) {
+      }
+    }
+
+    public void testToTableConflict() {
+      Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
+          TableCollectors.toTable(
+              Cell::getRowKey, Cell::getColumnKey, Cell::getValue, HashBasedTable::create);
+      try {
+        Stream.of(immutableCell("one", "uno", 1), immutableCell("one", "uno", 2))
+            .collect(collector);
+        fail("Expected IllegalStateException");
+      } catch (IllegalStateException expected) {
+      }
+    }
+
+    public void testToTableMerging() {
+      Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
+          TableCollectors.toTable(
+              Cell::getRowKey,
+              Cell::getColumnKey,
+              Cell::getValue,
+              Integer::sum,
+              HashBasedTable::create);
+      BiPredicate<Table<String, String, Integer>, Table<String, String, Integer>> equivalence =
+          pairwiseOnResultOf(Table::cellSet);
+      CollectorTester.of(collector, equivalence)
+          .expectCollects(
+              new ImmutableTable.Builder<String, String, Integer>()
+                  .put("one", "uno", 1)
+                  .put("two", "dos", 6)
+                  .put("three", "tres", 3)
+                  .build(),
+              immutableCell("one", "uno", 1),
+              immutableCell("two", "dos", 2),
+              immutableCell("three", "tres", 3),
+              immutableCell("two", "dos", 4));
+    }
+  }
+
+  // This function specifically returns a BiPredicate, because Guava7’s Equivalence class does not
+  // actually implement BiPredicate, and CollectorTests expects a BiPredicate.
+  static <C, E, R extends Iterable<E>> BiPredicate<C, C> pairwiseOnResultOf(Function<C, R> arg) {
+    Equivalence<C> equivalence = Equivalence.equals().<E>pairwise().onResultOf(arg);
+    return equivalence::equivalent;
+  }
+
+  private TableCollectorsTest() {}
+}
diff --git a/guava-tests/test/com/google/common/collect/TablesTest.java b/guava-tests/test/com/google/common/collect/TablesTest.java
index 084d391..dd56614 100644
--- a/guava-tests/test/com/google/common/collect/TablesTest.java
+++ b/guava-tests/test/com/google/common/collect/TablesTest.java
@@ -18,13 +18,11 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
-import com.google.common.base.Equivalence;
 import com.google.common.collect.Table.Cell;
 import com.google.common.testing.CollectorTester;
 import com.google.common.testing.EqualsTester;
 import com.google.common.testing.SerializableTester;
 import java.util.stream.Collector;
-import java.util.stream.Stream;
 import junit.framework.TestCase;
 
 /**
@@ -35,66 +33,19 @@
 @GwtCompatible(emulated = true)
 public class TablesTest extends TestCase {
 
-  public void testToTable() {
+  // The bulk of the toTable tests can be found in TableCollectorsTest.
+  // This gives minimal coverage to the forwarding functions
+  public void testToTableSanityTest() {
     Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
         Tables.toTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue, HashBasedTable::create);
-    Equivalence<Table<String, String, Integer>> equivalence =
-        Equivalence.equals().<Cell<String, String, Integer>>pairwise().onResultOf(Table::cellSet);
-    CollectorTester.of(collector, equivalence)
-        .expectCollects(
-            new ImmutableTable.Builder<String, String, Integer>()
-                .put("one", "uno", 1)
-                .put("two", "dos", 2)
-                .put("three", "tres", 3)
-                .build(),
-            Tables.immutableCell("one", "uno", 1),
-            Tables.immutableCell("two", "dos", 2),
-            Tables.immutableCell("three", "tres", 3));
+    HashBasedTable<String, String, Integer> expected = HashBasedTable.create();
+    expected.put("one", "uno", 1);
+    CollectorTester.of(collector)
+        .expectCollects(HashBasedTable.create())
+        .expectCollects(expected, Tables.immutableCell("one", "uno", 1));
   }
 
-  public void testToTableNullMerge() {
-    Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
-        Tables.toTable(
-            Cell::getRowKey,
-            Cell::getColumnKey,
-            Cell::getValue,
-            (Integer v1, Integer v2) -> null,
-            HashBasedTable::create);
-    Equivalence<Table<String, String, Integer>> equivalence =
-        Equivalence.equals().<Cell<String, String, Integer>>pairwise().onResultOf(Table::cellSet);
-    CollectorTester.of(collector, equivalence)
-        .expectCollects(
-            ImmutableTable.of(),
-            Tables.immutableCell("one", "uno", 1),
-            Tables.immutableCell("one", "uno", 2));
-  }
-
-  public void testToTableNullValues() {
-    Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
-        Tables.toTable(
-            Cell::getRowKey,
-            Cell::getColumnKey,
-            Cell::getValue,
-            () -> ArrayTable.create(ImmutableList.of("one"), ImmutableList.of("uno")));
-    try {
-      Stream.of(Tables.immutableCell("one", "uno", (Integer) null)).collect(collector);
-      fail("Expected NullPointerException");
-    } catch (NullPointerException expected) {
-    }
-  }
-
-  public void testToTableConflict() {
-    Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
-        Tables.toTable(Cell::getRowKey, Cell::getColumnKey, Cell::getValue, HashBasedTable::create);
-    try {
-      Stream.of(Tables.immutableCell("one", "uno", 1), Tables.immutableCell("one", "uno", 2))
-          .collect(collector);
-      fail("Expected IllegalStateException");
-    } catch (IllegalStateException expected) {
-    }
-  }
-
-  public void testToTableMerging() {
+  public void testToTableMergingSanityTest() {
     Collector<Cell<String, String, Integer>, ?, Table<String, String, Integer>> collector =
         Tables.toTable(
             Cell::getRowKey,
@@ -102,19 +53,12 @@
             Cell::getValue,
             Integer::sum,
             HashBasedTable::create);
-    Equivalence<Table<String, String, Integer>> equivalence =
-        Equivalence.equals().<Cell<String, String, Integer>>pairwise().onResultOf(Table::cellSet);
-    CollectorTester.of(collector, equivalence)
+    HashBasedTable<String, String, Integer> expected = HashBasedTable.create();
+    expected.put("one", "uno", 3);
+    CollectorTester.of(collector)
+        .expectCollects(HashBasedTable.create())
         .expectCollects(
-            new ImmutableTable.Builder<String, String, Integer>()
-                .put("one", "uno", 1)
-                .put("two", "dos", 6)
-                .put("three", "tres", 3)
-                .build(),
-            Tables.immutableCell("one", "uno", 1),
-            Tables.immutableCell("two", "dos", 2),
-            Tables.immutableCell("three", "tres", 3),
-            Tables.immutableCell("two", "dos", 4));
+            expected, Tables.immutableCell("one", "uno", 1), Tables.immutableCell("one", "uno", 2));
   }
 
   @GwtIncompatible // SerializableTester
diff --git a/guava-tests/test/com/google/common/collect/TopKSelectorTest.java b/guava-tests/test/com/google/common/collect/TopKSelectorTest.java
index e21f817..2cebdc3 100644
--- a/guava-tests/test/com/google/common/collect/TopKSelectorTest.java
+++ b/guava-tests/test/com/google/common/collect/TopKSelectorTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.annotations.GwtCompatible;
 import com.google.common.math.IntMath;
 import com.google.common.primitives.Ints;
 import java.math.RoundingMode;
@@ -31,6 +32,7 @@
  *
  * @author Louis Wasserman
  */
+@GwtCompatible
 public class TopKSelectorTest extends TestCase {
 
   public void testNegativeK() {
@@ -119,4 +121,13 @@
     assertThat(top.topK()).containsExactlyElementsIn(Collections.nCopies(k, 0));
     assertThat(compareCalls[0]).isAtMost(10L * n * IntMath.log2(k, RoundingMode.CEILING));
   }
+
+  public void testExceedMaxIteration() {
+    /*
+     * Bug #5692 occurred when TopKSelector called Arrays.sort incorrectly.
+     */
+    TopKSelector<Integer> top = TopKSelector.least(7);
+    top.offerAll(Ints.asList(5, 7, 6, 2, 4, 3, 1, 0, 0, 0, 0, 0, 0, 0));
+    assertThat(top.topK()).isEqualTo(Ints.asList(0, 0, 0, 0, 0, 0, 0));
+  }
 }
diff --git a/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java b/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
index d8ff908..9e57bba 100644
--- a/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
+++ b/guava-tests/test/com/google/common/collect/TreeRangeMapTest.java
@@ -690,6 +690,7 @@
     }
   }
 
+
   public void testSubRangeMapExhaustive() {
     for (Range<Integer> range1 : RANGES) {
       for (Range<Integer> range2 : RANGES) {
diff --git a/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java b/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java
index 498a1a1..b33ab2d 100644
--- a/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java
+++ b/guava-tests/test/com/google/common/collect/TreeRangeSetTest.java
@@ -271,6 +271,7 @@
     return expected;
   }
 
+
   public void testSubRangeSet() {
     for (Range<Integer> range1 : QUERY_RANGES) {
       for (Range<Integer> range2 : QUERY_RANGES) {
@@ -309,6 +310,7 @@
     }
   }
 
+
   public void testSubRangeSetOfComplement() {
     for (Range<Integer> range1 : QUERY_RANGES) {
       for (Range<Integer> range2 : QUERY_RANGES) {
@@ -324,6 +326,7 @@
     }
   }
 
+
   public void testComplementOfSubRangeSet() {
     for (Range<Integer> range1 : QUERY_RANGES) {
       for (Range<Integer> range2 : QUERY_RANGES) {
diff --git a/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java b/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
index 889f0fb..e5e8e7f 100644
--- a/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
+++ b/guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
@@ -792,6 +792,7 @@
     assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
   }
 
+
   @Test
   public void concurrentIteration() throws Exception {
     addEdge(1, 2, "foo");
diff --git a/guava-tests/test/com/google/common/graph/MapCacheTest.java b/guava-tests/test/com/google/common/graph/MapCacheTest.java
index f66b19b..f04f010 100644
--- a/guava-tests/test/com/google/common/graph/MapCacheTest.java
+++ b/guava-tests/test/com/google/common/graph/MapCacheTest.java
@@ -90,25 +90,4 @@
     assertThat(mapCache.remove(fooReference2)).isEqualTo("bar");
     assertThat(mapCache.get(fooReference1)).isNull();
   }
-
-  @Test
-  public void testHandleNulls() {
-    mapCache.put("foo", "bar");
-    mapCache.put("non-null key", null);
-    mapCache.put(null, "non-null value");
-
-    assertThat(mapCache.get("foo")).isEqualTo("bar");
-    assertThat(mapCache.get("non-null key")).isNull();
-    assertThat(mapCache.get(null)).isEqualTo("non-null value");
-
-    assertThat(mapCache.containsKey("foo")).isTrue();
-    assertThat(mapCache.containsKey("bar")).isFalse();
-    assertThat(mapCache.containsKey("non-null key")).isTrue();
-    assertThat(mapCache.containsKey(null)).isTrue();
-
-    // Test again - in reverse order.
-    assertThat(mapCache.get(null)).isEqualTo("non-null value");
-    assertThat(mapCache.get("non-null key")).isNull();
-    assertThat(mapCache.get("foo")).isEqualTo("bar");
-  }
 }
diff --git a/guava-tests/test/com/google/common/graph/ValueGraphTest.java b/guava-tests/test/com/google/common/graph/ValueGraphTest.java
index edc2631..31d41aa 100644
--- a/guava-tests/test/com/google/common/graph/ValueGraphTest.java
+++ b/guava-tests/test/com/google/common/graph/ValueGraphTest.java
@@ -440,6 +440,7 @@
         .inOrder();
   }
 
+
   @Test
   public void concurrentIteration() throws Exception {
     graph = ValueGraphBuilder.directed().build();
diff --git a/guava-tests/test/com/google/common/hash/BloomFilterTest.java b/guava-tests/test/com/google/common/hash/BloomFilterTest.java
index 7c21044..411e097 100644
--- a/guava-tests/test/com/google/common/hash/BloomFilterTest.java
+++ b/guava-tests/test/com/google/common/hash/BloomFilterTest.java
@@ -535,6 +535,7 @@
     assertEquals(BloomFilterStrategies.MURMUR128_MITZ_64, BloomFilterStrategies.values()[1]);
   }
 
+
   public void testNoRaceConditions() throws Exception {
     final BloomFilter<Integer> bloomFilter =
         BloomFilter.create(Funnels.integerFunnel(), 15_000_000, 0.01);
diff --git a/guava-tests/test/com/google/common/hash/Crc32cHashFunctionTest.java b/guava-tests/test/com/google/common/hash/Crc32cHashFunctionTest.java
index 4619cec..3bea975 100644
--- a/guava-tests/test/com/google/common/hash/Crc32cHashFunctionTest.java
+++ b/guava-tests/test/com/google/common/hash/Crc32cHashFunctionTest.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Charsets.UTF_8;
 
 import java.util.Arrays;
+import java.util.Random;
 import junit.framework.TestCase;
 
 /**
@@ -26,14 +27,22 @@
  * @author Kurt Alfred Kluever
  */
 public class Crc32cHashFunctionTest extends TestCase {
+  public void testEmpty() {
+    assertCrc(0, new byte[0]);
+  }
 
   public void testZeros() {
     // Test 32 byte array of 0x00.
     byte[] zeros = new byte[32];
-    Arrays.fill(zeros, (byte) 0x00);
     assertCrc(0x8a9136aa, zeros);
   }
 
+  public void testZeros100() {
+    // Test 100 byte array of 0x00.
+    byte[] zeros = new byte[100];
+    assertCrc(0x07cb9ff6, zeros);
+  }
+
   public void testFull() {
     // Test 32 byte array of 0xFF.
     byte[] fulls = new byte[32];
@@ -41,6 +50,13 @@
     assertCrc(0x62a8ab43, fulls);
   }
 
+  public void testFull100() {
+    // Test 100 byte array of 0xFF.
+    byte[] fulls = new byte[100];
+    Arrays.fill(fulls, (byte) 0xFF);
+    assertCrc(0xbc753add, fulls);
+  }
+
   public void testAscending() {
     // Test 32 byte arrays of ascending.
     byte[] ascending = new byte[32];
@@ -59,6 +75,15 @@
     assertCrc(0x113fdb5c, descending);
   }
 
+  public void testDescending100() {
+    // Test 100 byte arrays of descending.
+    byte[] descending = new byte[100];
+    for (int i = 0; i < 100; i++) {
+      descending[i] = (byte) (99 - i);
+    }
+    assertCrc(0xd022db97, descending);
+  }
+
   public void testScsiReadCommand() {
     // Test SCSI read command.
     byte[] scsiReadCommand =
@@ -87,6 +112,23 @@
     assertCrc(0xBFE92A83, "23456789".getBytes(UTF_8));
   }
 
+  public void testAgainstSimplerImplementation() {
+    Random r = new Random(1234567);
+    for (int length = 0; length < 1000; length++) {
+      byte[] bytes = new byte[length];
+      r.nextBytes(bytes);
+      assertCrc(referenceCrc(bytes), bytes);
+    }
+  }
+
+  private static int referenceCrc(byte[] bytes) {
+    int crc = ~0;
+    for (byte b : bytes) {
+      crc = (crc >>> 8) ^ Crc32cHashFunction.Crc32cHasher.BYTE_TABLE[(crc ^ b) & 0xFF];
+    }
+    return ~crc;
+  }
+
   /**
    * Verifies that the crc of an array of byte data matches the expected value.
    *
@@ -95,7 +137,15 @@
    */
   private static void assertCrc(int expectedCrc, byte[] data) {
     int actualCrc = Hashing.crc32c().hashBytes(data).asInt();
-    assertEquals(expectedCrc, actualCrc);
+    assertEquals(
+        String.format("expected: %08x, actual: %08x", expectedCrc, actualCrc),
+        expectedCrc,
+        actualCrc);
+    int actualCrcHasher = Hashing.crc32c().newHasher().putBytes(data).hash().asInt();
+    assertEquals(
+        String.format("expected: %08x, actual: %08x", expectedCrc, actualCrc),
+        expectedCrc,
+        actualCrcHasher);
   }
 
   // From RFC 3720, Section 12.1, the polynomial generator is 0x11EDC6F41.
@@ -105,7 +155,7 @@
   private static final int CRC32C_GENERATOR = 0x1EDC6F41; // 0x11EDC6F41
   private static final int CRC32C_GENERATOR_FLIPPED = Integer.reverse(CRC32C_GENERATOR);
 
-  public void testCrc32cLookupTable() {
+  public void testCrc32cByteTable() {
     // See Hacker's Delight 2nd Edition, Figure 14-7.
     int[] expected = new int[256];
     for (int i = 0; i < expected.length; i++) {
@@ -117,9 +167,47 @@
       expected[i] = crc;
     }
 
-    int[] actual = Crc32cHashFunction.Crc32cHasher.CRC_TABLE;
+    int[] actual = Crc32cHashFunction.Crc32cHasher.BYTE_TABLE;
     assertTrue(
         "Expected: \n" + Arrays.toString(expected) + "\nActual:\n" + Arrays.toString(actual),
         Arrays.equals(expected, actual));
   }
+
+  static int advanceOneBit(int next) {
+    if ((next & 1) != 0) {
+      return (next >>> 1) ^ CRC32C_GENERATOR_FLIPPED;
+    } else {
+      return next >>> 1;
+    }
+  }
+
+  public void testCrc32cStrideTable() {
+    int next = CRC32C_GENERATOR_FLIPPED;
+    for (int i = 0; i < 12; i++) { // for 3 ints = 12 bytes in between each stride window
+      next = (next >>> 8) ^ Crc32cHashFunction.Crc32cHasher.BYTE_TABLE[next & 0xFF];
+    }
+    int[][] expected = new int[4][256];
+    for (int b = 0; b < 4; ++b) {
+      for (int bit = 128; bit != 0; bit >>= 1) {
+        expected[b][bit] = next;
+        next = advanceOneBit(next);
+      }
+    }
+    for (int b = 0; b < 4; ++b) {
+      expected[b][0] = 0;
+      for (int bit = 2; bit < 256; bit <<= 1) {
+        for (int i = bit + 1; i < (bit << 1); i++) {
+          expected[b][i] = expected[b][bit] ^ expected[b][i ^ bit];
+        }
+      }
+    }
+
+    int[][] actual = Crc32cHashFunction.Crc32cHasher.STRIDE_TABLE;
+    assertTrue(
+        "Expected: \n"
+            + Arrays.deepToString(expected)
+            + "\nActual:\n"
+            + Arrays.deepToString(actual),
+        Arrays.deepEquals(expected, actual));
+  }
 }
diff --git a/guava-tests/test/com/google/common/hash/HashFunctionEnum.java b/guava-tests/test/com/google/common/hash/HashFunctionEnum.java
index c055063..3471747 100644
--- a/guava-tests/test/com/google/common/hash/HashFunctionEnum.java
+++ b/guava-tests/test/com/google/common/hash/HashFunctionEnum.java
@@ -16,6 +16,7 @@
 
 package com.google.common.hash;
 
+
 /**
  * An enum that contains all of the known hash functions.
  *
@@ -31,6 +32,7 @@
   MD5(Hashing.md5()),
   MURMUR3_128(Hashing.murmur3_128()),
   MURMUR3_32(Hashing.murmur3_32()),
+  MURMUR3_32_FIXED(Hashing.murmur3_32_fixed()),
   SHA1(Hashing.sha1()),
   SHA256(Hashing.sha256()),
   SHA384(Hashing.sha384()),
diff --git a/guava-tests/test/com/google/common/hash/HashTestUtils.java b/guava-tests/test/com/google/common/hash/HashTestUtils.java
index 8dfbdb0..9e9944b 100644
--- a/guava-tests/test/com/google/common/hash/HashTestUtils.java
+++ b/guava-tests/test/com/google/common/hash/HashTestUtils.java
@@ -195,8 +195,8 @@
         int limit = pos + random.nextInt(value.length - pos + 1);
         for (PrimitiveSink sink : sinks) {
           ByteBuffer buffer = ByteBuffer.wrap(value);
-          buffer.position(pos);
-          buffer.limit(limit);
+          Java8Compatibility.position(buffer, pos);
+          Java8Compatibility.limit(buffer, limit);
           sink.putBytes(buffer);
           assertEquals(limit, buffer.limit());
           assertEquals(limit, buffer.position());
diff --git a/guava-tests/test/com/google/common/hash/HashingTest.java b/guava-tests/test/com/google/common/hash/HashingTest.java
index dc50299..bc3db34 100644
--- a/guava-tests/test/com/google/common/hash/HashingTest.java
+++ b/guava-tests/test/com/google/common/hash/HashingTest.java
@@ -146,7 +146,7 @@
   // goodFastHash(128) uses Murmur3_128. Use the same epsilon bounds.
   public void testGoodFastHash128() {
     HashTestUtils.check2BitAvalanche(Hashing.goodFastHash(128), 250, 0.20);
-    HashTestUtils.checkAvalanche(Hashing.goodFastHash(128), 250, 0.17);
+    HashTestUtils.checkAvalanche(Hashing.goodFastHash(128), 500, 0.17);
     HashTestUtils.checkNo2BitCharacteristics(Hashing.goodFastHash(128));
     HashTestUtils.checkNoFunnels(Hashing.goodFastHash(128));
     HashTestUtils.assertInvariants(Hashing.goodFastHash(128));
@@ -155,7 +155,7 @@
   // goodFastHash(256) uses Murmur3_128. Use the same epsilon bounds.
   public void testGoodFastHash256() {
     HashTestUtils.check2BitAvalanche(Hashing.goodFastHash(256), 250, 0.20);
-    HashTestUtils.checkAvalanche(Hashing.goodFastHash(256), 250, 0.17);
+    HashTestUtils.checkAvalanche(Hashing.goodFastHash(256), 500, 0.17);
     HashTestUtils.checkNo2BitCharacteristics(Hashing.goodFastHash(256));
     HashTestUtils.checkNoFunnels(Hashing.goodFastHash(256));
     HashTestUtils.assertInvariants(Hashing.goodFastHash(256));
@@ -432,6 +432,9 @@
           .put(Hashing.murmur3_32(), EMPTY_STRING, "00000000")
           .put(Hashing.murmur3_32(), TQBFJOTLD, "23f74f2e")
           .put(Hashing.murmur3_32(), TQBFJOTLDP, "fc8bc4d5")
+          .put(Hashing.murmur3_32_fixed(), EMPTY_STRING, "00000000")
+          .put(Hashing.murmur3_32_fixed(), TQBFJOTLD, "23f74f2e")
+          .put(Hashing.murmur3_32_fixed(), TQBFJOTLDP, "fc8bc4d5")
           .put(Hashing.sha1(), EMPTY_STRING, "da39a3ee5e6b4b0d3255bfef95601890afd80709")
           .put(Hashing.sha1(), TQBFJOTLD, "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12")
           .put(Hashing.sha1(), TQBFJOTLDP, "408d94384216f890ff7a0c3528e8bed1e0b01621")
diff --git a/guava-tests/test/com/google/common/hash/Murmur3Hash32Test.java b/guava-tests/test/com/google/common/hash/Murmur3Hash32Test.java
index de86e4b..181b2a7 100644
--- a/guava-tests/test/com/google/common/hash/Murmur3Hash32Test.java
+++ b/guava-tests/test/com/google/common/hash/Murmur3Hash32Test.java
@@ -17,9 +17,11 @@
 package com.google.common.hash;
 
 import static com.google.common.hash.Hashing.murmur3_32;
+import static com.google.common.hash.Hashing.murmur3_32_fixed;
 
 import com.google.common.base.Charsets;
 import com.google.common.hash.HashTestUtils.HashFn;
+import java.nio.charset.Charset;
 import java.util.Random;
 import junit.framework.TestCase;
 
@@ -51,16 +53,53 @@
         -528633700, murmur3_32().hashUnencodedChars("The quick brown fox jumps over the lazy dog"));
   }
 
-  public void testKnownUtf8StringInputs() {
-    assertHash(0, murmur3_32().hashString("", Charsets.UTF_8));
-    assertHash(0xcfbda5d1, murmur3_32().hashString("k", Charsets.UTF_8));
-    assertHash(0xa167dbf3, murmur3_32().hashString("hell", Charsets.UTF_8));
-    assertHash(0x248bfa47, murmur3_32().hashString("hello", Charsets.UTF_8));
-    assertHash(0x3d41b97c, murmur3_32().hashString("http://www.google.com/", Charsets.UTF_8));
-    assertHash(
-        0x2e4ff723,
-        murmur3_32().hashString("The quick brown fox jumps over the lazy dog", Charsets.UTF_8));
-    assertHash(0xfc5ba834, murmur3_32().hashString("毎月1日,毎週月曜日", Charsets.UTF_8));
+  @SuppressWarnings("deprecation")
+  public void testKnownEncodedStringInputs() {
+    assertStringHash(0, "", Charsets.UTF_8);
+    assertStringHash(0xcfbda5d1, "k", Charsets.UTF_8);
+    assertStringHash(0xa167dbf3, "hell", Charsets.UTF_8);
+    assertStringHash(0x248bfa47, "hello", Charsets.UTF_8);
+    assertStringHash(0x3d41b97c, "http://www.google.com/", Charsets.UTF_8);
+    assertStringHash(0x2e4ff723, "The quick brown fox jumps over the lazy dog", Charsets.UTF_8);
+    assertStringHash(0xb5a4be05, "ABCDefGHI\u0799", Charsets.UTF_8);
+    assertStringHash(0xfc5ba834, "毎月1日,毎週月曜日", Charsets.UTF_8);
+    assertStringHash(0x8a5c3699, "surrogate pair: \uD83D\uDCB0", Charsets.UTF_8);
+
+    assertStringHash(0, "", Charsets.UTF_16LE);
+    assertStringHash(0x288418e4, "k", Charsets.UTF_16LE);
+    assertStringHash(0x5a0cb7c3, "hell", Charsets.UTF_16LE);
+    assertStringHash(0xd7c31989, "hello", Charsets.UTF_16LE);
+    assertStringHash(0x73564d8c, "http://www.google.com/", Charsets.UTF_16LE);
+    assertStringHash(0xe07db09c, "The quick brown fox jumps over the lazy dog", Charsets.UTF_16LE);
+    assertStringHash(0xfefa3e76, "ABCDefGHI\u0799", Charsets.UTF_16LE);
+    assertStringHash(0x6a7be132, "毎月1日,毎週月曜日", Charsets.UTF_16LE);
+    assertStringHash(0x5a2d41c7, "surrogate pair: \uD83D\uDCB0", Charsets.UTF_16LE);
+  }
+
+  @SuppressWarnings("deprecation")
+  private void assertStringHash(int expected, String string, Charset charset) {
+    if (allBmp(string)) {
+      assertHash(expected, murmur3_32().hashString(string, charset));
+    }
+    assertHash(expected, murmur3_32_fixed().hashString(string, charset));
+    assertHash(expected, murmur3_32().newHasher().putString(string, charset).hash());
+    assertHash(expected, murmur3_32_fixed().newHasher().putString(string, charset).hash());
+    assertHash(expected, murmur3_32().hashBytes(string.getBytes(charset)));
+    assertHash(expected, murmur3_32_fixed().hashBytes(string.getBytes(charset)));
+    assertHash(expected, murmur3_32().newHasher().putBytes(string.getBytes(charset)).hash());
+    assertHash(expected, murmur3_32_fixed().newHasher().putBytes(string.getBytes(charset)).hash());
+  }
+
+  private boolean allBmp(String string) {
+    // Ordinarily we'd use something like i += Character.charCount(string.codePointAt(i)) here. But
+    // we can get away with i++ because the whole point of this method is to return false if we find
+    // a code point that doesn't fit in a char.
+    for (int i = 0; i < string.length(); i++) {
+      if (string.codePointAt(i) > 0xffff) {
+        return false;
+      }
+    }
+    return true;
   }
 
   @SuppressWarnings("deprecation")
@@ -71,7 +110,7 @@
   }
 
   @SuppressWarnings("deprecation")
-  public void testStringInputsUtf8() {
+  public void testEncodedStringInputs() {
     Random rng = new Random(0);
     for (int z = 0; z < 100; z++) {
       String str;
@@ -88,9 +127,16 @@
         builder.appendCodePoint(codePoints[i]);
       }
       str = builder.toString();
+      HashCode hashUtf8 = murmur3_32().hashBytes(str.getBytes(Charsets.UTF_8));
       assertEquals(
-          murmur3_32().hashBytes(str.getBytes(Charsets.UTF_8)),
-          murmur3_32().hashString(str, Charsets.UTF_8));
+          hashUtf8, murmur3_32().newHasher().putBytes(str.getBytes(Charsets.UTF_8)).hash());
+      assertEquals(hashUtf8, murmur3_32().hashString(str, Charsets.UTF_8));
+      assertEquals(hashUtf8, murmur3_32().newHasher().putString(str, Charsets.UTF_8).hash());
+      HashCode hashUtf16 = murmur3_32().hashBytes(str.getBytes(Charsets.UTF_16));
+      assertEquals(
+          hashUtf16, murmur3_32().newHasher().putBytes(str.getBytes(Charsets.UTF_16)).hash());
+      assertEquals(hashUtf16, murmur3_32().hashString(str, Charsets.UTF_16));
+      assertEquals(hashUtf16, murmur3_32().newHasher().putString(str, Charsets.UTF_16).hash());
     }
   }
 
@@ -138,8 +184,12 @@
     assertEquals(
         murmur3_32().hashBytes(str.getBytes(Charsets.UTF_8)),
         murmur3_32().hashString(str, Charsets.UTF_8));
+    assertEquals(
+        murmur3_32_fixed().hashBytes(str.getBytes(Charsets.UTF_8)),
+        murmur3_32().hashString(str, Charsets.UTF_8));
   }
 
+  @SuppressWarnings("deprecation")
   public void testInvalidUnicodeHasherPutString() {
     String str =
         new String(
@@ -147,5 +197,8 @@
     assertEquals(
         murmur3_32().hashBytes(str.getBytes(Charsets.UTF_8)),
         murmur3_32().newHasher().putString(str, Charsets.UTF_8).hash());
+    assertEquals(
+        murmur3_32_fixed().hashBytes(str.getBytes(Charsets.UTF_8)),
+        murmur3_32_fixed().newHasher().putString(str, Charsets.UTF_8).hash());
   }
 }
diff --git a/guava-tests/test/com/google/common/io/ByteSourceTest.java b/guava-tests/test/com/google/common/io/ByteSourceTest.java
index f0ba829..3cf6cca 100644
--- a/guava-tests/test/com/google/common/io/ByteSourceTest.java
+++ b/guava-tests/test/com/google/common/io/ByteSourceTest.java
@@ -30,6 +30,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.hash.Hashing;
+import com.google.common.io.Closer.LoggingSuppressor;
 import com.google.common.primitives.UnsignedBytes;
 import com.google.common.testing.TestLogHandler;
 import java.io.ByteArrayOutputStream;
@@ -395,7 +396,7 @@
       ImmutableSet.of(BROKEN_CLOSE_SINK, BROKEN_OPEN_SINK, BROKEN_WRITE_SINK);
 
   public void testCopyExceptions() {
-    if (!Closer.SuppressingSuppressor.isAvailable()) {
+    if (Closer.create().suppressor instanceof LoggingSuppressor) {
       // test that exceptions are logged
 
       TestLogHandler logHandler = new TestLogHandler();
diff --git a/guava-tests/test/com/google/common/io/ByteSourceTester.java b/guava-tests/test/com/google/common/io/ByteSourceTester.java
index 490f1e6..7585412 100644
--- a/guava-tests/test/com/google/common/io/ByteSourceTester.java
+++ b/guava-tests/test/com/google/common/io/ByteSourceTester.java
@@ -38,7 +38,7 @@
 /**
  * A generator of {@code TestSuite} instances for testing {@code ByteSource} implementations.
  * Generates tests of a all methods on a {@code ByteSource} given various inputs the source is
- * expected to contain as well as as sub-suites for testing the {@code CharSource} view and {@code
+ * expected to contain as well as sub-suites for testing the {@code CharSource} view and {@code
  * slice()} views in the same way.
  *
  * @author Colin Decker
diff --git a/guava-tests/test/com/google/common/io/ByteStreamsTest.java b/guava-tests/test/com/google/common/io/ByteStreamsTest.java
index f715303..3ae2c25 100644
--- a/guava-tests/test/com/google/common/io/ByteStreamsTest.java
+++ b/guava-tests/test/com/google/common/io/ByteStreamsTest.java
@@ -51,6 +51,7 @@
     assertThat(out.toByteArray()).isEqualTo(expected);
   }
 
+
   public void testCopyFileChannel() throws IOException {
     final int chunkSize = 14407; // Random prime, unlikely to match any internal chunk size
     ByteArrayOutputStream out = new ByteArrayOutputStream();
diff --git a/guava-tests/test/com/google/common/io/CharSequenceReaderTest.java b/guava-tests/test/com/google/common/io/CharSequenceReaderTest.java
index 12bc17e..dbe94fc 100644
--- a/guava-tests/test/com/google/common/io/CharSequenceReaderTest.java
+++ b/guava-tests/test/com/google/common/io/CharSequenceReaderTest.java
@@ -211,7 +211,7 @@
     reader = new CharSequenceReader(charSequence);
     CharBuffer buf2 = CharBuffer.allocate(expected.length());
     assertEquals(expected.length() == 0 ? -1 : expected.length(), reader.read(buf2));
-    buf2.flip();
+    Java8Compatibility.flip(buf2);
     assertEquals(expected, buf2.toString());
     assertFullyRead(reader);
 
@@ -220,9 +220,9 @@
     buf2 = CharBuffer.allocate(5);
     builder = new StringBuilder();
     while (reader.read(buf2) != -1) {
-      buf2.flip();
+      Java8Compatibility.flip(buf2);
       builder.append(buf2);
-      buf2.clear();
+      Java8Compatibility.clear(buf2);
     }
     assertEquals(expected, builder.toString());
     assertFullyRead(reader);
diff --git a/guava-tests/test/com/google/common/io/CharSourceTest.java b/guava-tests/test/com/google/common/io/CharSourceTest.java
index c4fbe46..787d744 100644
--- a/guava-tests/test/com/google/common/io/CharSourceTest.java
+++ b/guava-tests/test/com/google/common/io/CharSourceTest.java
@@ -26,6 +26,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.io.Closer.LoggingSuppressor;
 import com.google.common.testing.TestLogHandler;
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -288,7 +289,7 @@
       ImmutableSet.of(BROKEN_CLOSE_SINK, BROKEN_OPEN_SINK, BROKEN_WRITE_SINK);
 
   public void testCopyExceptions() {
-    if (!Closer.SuppressingSuppressor.isAvailable()) {
+    if (Closer.create().suppressor instanceof LoggingSuppressor) {
       // test that exceptions are logged
 
       TestLogHandler logHandler = new TestLogHandler();
diff --git a/guava-tests/test/com/google/common/io/CloserTest.java b/guava-tests/test/com/google/common/io/CloserTest.java
index 3d16a09..3876174 100644
--- a/guava-tests/test/com/google/common/io/CloserTest.java
+++ b/guava-tests/test/com/google/common/io/CloserTest.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
+import com.google.common.io.Closer.LoggingSuppressor;
 import com.google.common.testing.TestLogHandler;
 import java.io.Closeable;
 import java.io.IOException;
@@ -311,13 +312,12 @@
   }
 
   public static void testSuppressingSuppressorIfPossible() throws IOException {
+    Closer closer = Closer.create();
     // can't test the JDK7 suppressor when not running on JDK7
-    if (!Closer.SuppressingSuppressor.isAvailable()) {
+    if (closer.suppressor instanceof LoggingSuppressor) {
       return;
     }
 
-    Closer closer = new Closer(new Closer.SuppressingSuppressor());
-
     IOException thrownException = new IOException();
     IOException c1Exception = new IOException();
     RuntimeException c2Exception = new RuntimeException();
diff --git a/guava-tests/test/com/google/common/io/FileBackedOutputStreamTest.java b/guava-tests/test/com/google/common/io/FileBackedOutputStreamTest.java
index 66558e9..6841a41 100644
--- a/guava-tests/test/com/google/common/io/FileBackedOutputStreamTest.java
+++ b/guava-tests/test/com/google/common/io/FileBackedOutputStreamTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.io;
 
+
 import com.google.common.testing.GcFinalization;
 import java.io.File;
 import java.io.IOException;
@@ -29,6 +30,7 @@
  */
 public class FileBackedOutputStreamTest extends IoTestCase {
 
+
   public void testThreshold() throws Exception {
     testThreshold(0, 100, true, false);
     testThreshold(10, 100, true, false);
@@ -76,6 +78,7 @@
     }
   }
 
+
   public void testFinalizeDeletesFile() throws Exception {
     byte[] data = newPreFilledByteArray(100);
     FileBackedOutputStream out = new FileBackedOutputStream(0, true);
@@ -99,6 +102,7 @@
         });
   }
 
+
   public void testThreshold_resetOnFinalize() throws Exception {
     testThreshold(0, 100, true, true);
     testThreshold(10, 100, true, true);
diff --git a/guava-tests/test/com/google/common/io/FilesTest.java b/guava-tests/test/com/google/common/io/FilesTest.java
index e987f60..8446da1 100644
--- a/guava-tests/test/com/google/common/io/FilesTest.java
+++ b/guava-tests/test/com/google/common/io/FilesTest.java
@@ -16,7 +16,6 @@
 
 package com.google.common.io;
 
-import static com.google.common.io.Files.touch;
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.base.Charsets;
@@ -196,7 +195,7 @@
     File temp2 = createTempFile();
     Files.write(ASCII, temp2, Charsets.UTF_8);
     Files.copy(temp1, temp2);
-    assertEquals(ASCII, Files.toString(temp1, Charsets.UTF_8));
+    assertEquals(ASCII, Files.toString(temp2, Charsets.UTF_8));
   }
 
   public void testEqual() throws IOException {
diff --git a/guava-tests/test/com/google/common/io/MoreFilesTest.java b/guava-tests/test/com/google/common/io/MoreFilesTest.java
index 693c7cc..005cf53 100644
--- a/guava-tests/test/com/google/common/io/MoreFilesTest.java
+++ b/guava-tests/test/com/google/common/io/MoreFilesTest.java
@@ -34,6 +34,7 @@
 import java.nio.file.FileSystems;
 import java.nio.file.FileVisitResult;
 import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
 import java.nio.file.SimpleFileVisitor;
 import java.nio.file.attribute.BasicFileAttributes;
@@ -556,6 +557,17 @@
     }
   }
 
+  public void testDeleteRecursively_nonexistingFile_throwsNoSuchFileException() throws IOException {
+    try (FileSystem fs = newTestFileSystem()) {
+      try {
+        MoreFiles.deleteRecursively(fs.getPath("/work/nothere"), ALLOW_INSECURE);
+        fail();
+      } catch (NoSuchFileException expected) {
+        assertThat(expected.getFile()).isEqualTo("/work/nothere");
+      }
+    }
+  }
+
   public void testDeleteDirectoryContents_symlinkToDir_sdsNotSupported_allowInsecure()
       throws IOException {
     try (FileSystem fs = newTestFileSystem()) {
@@ -649,7 +661,7 @@
    */
   private static void startDirectorySymlinkSwitching(
       final Path file, final Path target, ExecutorService executor) {
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError =
         executor.submit(
             new Runnable() {
diff --git a/guava-tests/test/com/google/common/io/PatternFilenameFilterTest.java b/guava-tests/test/com/google/common/io/PatternFilenameFilterTest.java
index 77ace52..94ab1f0 100644
--- a/guava-tests/test/com/google/common/io/PatternFilenameFilterTest.java
+++ b/guava-tests/test/com/google/common/io/PatternFilenameFilterTest.java
@@ -16,6 +16,8 @@
 
 package com.google.common.io;
 
+import com.google.common.testing.NullPointerTester;
+import com.google.common.testing.NullPointerTester.Visibility;
 import java.io.File;
 import java.io.FilenameFilter;
 import java.util.regex.PatternSyntaxException;
@@ -46,4 +48,15 @@
     // Show that dir is ignored
     assertTrue(filter.accept(null, "a"));
   }
+
+  public void testNulls() throws Exception {
+    NullPointerTester tester = new NullPointerTester();
+
+    tester.testConstructors(PatternFilenameFilter.class, Visibility.PACKAGE);
+    tester.testStaticMethods(PatternFilenameFilter.class, Visibility.PACKAGE); // currently none
+
+    // The reason that we skip this method is discussed in a comment on the method.
+    tester.ignore(PatternFilenameFilter.class.getMethod("accept", File.class, String.class));
+    tester.testInstanceMethods(new PatternFilenameFilter(".*"), Visibility.PACKAGE);
+  }
 }
diff --git a/guava-tests/test/com/google/common/io/SourceSinkFactories.java b/guava-tests/test/com/google/common/io/SourceSinkFactories.java
index 9b761d3..d24622d 100644
--- a/guava-tests/test/com/google/common/io/SourceSinkFactories.java
+++ b/guava-tests/test/com/google/common/io/SourceSinkFactories.java
@@ -442,9 +442,9 @@
       StringBuilder builder = new StringBuilder();
       CharBuffer buffer = CharBuffer.allocate(100);
       while (reader.read(buffer) != -1) {
-        buffer.flip();
+        Java8Compatibility.flip(buffer);
         builder.append(buffer);
-        buffer.clear();
+        Java8Compatibility.clear(buffer);
       }
       return builder.toString();
     }
diff --git a/guava-tests/test/com/google/common/math/BigIntegerMathTest.java b/guava-tests/test/com/google/common/math/BigIntegerMathTest.java
index 8a9b4fc..170261b 100644
--- a/guava-tests/test/com/google/common/math/BigIntegerMathTest.java
+++ b/guava-tests/test/com/google/common/math/BigIntegerMathTest.java
@@ -441,7 +441,7 @@
   @GwtIncompatible // TODO
   @AndroidIncompatible // slow
   public void testDivNonZeroExact() {
-    boolean isAndroid = System.getProperties().getProperty("java.runtime.name").contains("Android");
+    boolean isAndroid = System.getProperty("java.runtime.name").contains("Android");
     for (BigInteger p : NONZERO_BIGINTEGER_CANDIDATES) {
       for (BigInteger q : NONZERO_BIGINTEGER_CANDIDATES) {
         if (isAndroid && p.equals(BAD_FOR_ANDROID_P) && q.equals(BAD_FOR_ANDROID_Q)) {
diff --git a/guava-tests/test/com/google/common/math/LongMathTest.java b/guava-tests/test/com/google/common/math/LongMathTest.java
index 2284668..40c2ac9 100644
--- a/guava-tests/test/com/google/common/math/LongMathTest.java
+++ b/guava-tests/test/com/google/common/math/LongMathTest.java
@@ -747,6 +747,7 @@
     }
   }
 
+
   @GwtIncompatible // Slow
   public void testBinomial_exhaustiveNotOverflowing() {
     // Tests all of the inputs to LongMath.binomial that won't cause it to overflow, that weren't
@@ -783,6 +784,7 @@
     }
   }
 
+
   @GwtIncompatible // far too slow
   public void testSqrtOfPerfectSquareAsDoubleIsPerfect() {
     // This takes just over a minute on my machine.
diff --git a/guava-tests/test/com/google/common/math/MathPreconditionsTest.java b/guava-tests/test/com/google/common/math/MathPreconditionsTest.java
index 69719e0..5dbe017 100644
--- a/guava-tests/test/com/google/common/math/MathPreconditionsTest.java
+++ b/guava-tests/test/com/google/common/math/MathPreconditionsTest.java
@@ -289,4 +289,15 @@
       assertThat(expected).hasMessageThat().contains("testCheckNoOverflow_failure(0, 0)");
     }
   }
+
+  public void testNulls() {
+    /*
+     * Don't bother testing. All non-primitive parameters are used only to construct error messages.
+     * We never want to pass null for them, so we haven't annotated them to say that null is
+     * allowed. But at the same time, it seems wasteful to bother inserting the checkNotNull calls
+     * that NullPointerTester wants.
+     *
+     * (This empty method disables the automatic null testing provided by PackageSanityTests.)
+     */
+  }
 }
diff --git a/guava-tests/test/com/google/common/math/TestPlatform.java b/guava-tests/test/com/google/common/math/TestPlatform.java
index 95df331..03eb2ec 100644
--- a/guava-tests/test/com/google/common/math/TestPlatform.java
+++ b/guava-tests/test/com/google/common/math/TestPlatform.java
@@ -26,6 +26,6 @@
   }
 
   static boolean isAndroid() {
-    return System.getProperties().getProperty("java.runtime.name").contains("Android");
+    return System.getProperty("java.runtime.name").contains("Android");
   }
 }
diff --git a/guava-tests/test/com/google/common/net/HostAndPortTest.java b/guava-tests/test/com/google/common/net/HostAndPortTest.java
index 5e7eb2f..65e8096 100644
--- a/guava-tests/test/com/google/common/net/HostAndPortTest.java
+++ b/guava-tests/test/com/google/common/net/HostAndPortTest.java
@@ -59,6 +59,13 @@
     checkFromStringCase("[2001::2]:85", 77, "2001::2", 85, true);
   }
 
+  public void testFromStringNonAsciiDigits() {
+    // Same as testFromStringUnusedDefaultPort but with Gujarati digits for port numbers.
+    checkFromStringCase("gmail.com:૮1", 77, null, -1, false);
+    checkFromStringCase("192.0.2.2:૮૩", 77, null, -1, false);
+    checkFromStringCase("[2001::2]:૮૫", 77, null, -1, false);
+  }
+
   public void testFromStringBadPort() {
     // Out-of-range ports.
     checkFromStringCase("google.com:65536", 1, null, 99, false);
diff --git a/guava-tests/test/com/google/common/net/HttpHeadersTest.java b/guava-tests/test/com/google/common/net/HttpHeadersTest.java
index 9927e6b..5361b3f 100644
--- a/guava-tests/test/com/google/common/net/HttpHeadersTest.java
+++ b/guava-tests/test/com/google/common/net/HttpHeadersTest.java
@@ -50,8 +50,8 @@
             .build();
     ImmutableSet<String> uppercaseAcronyms =
         ImmutableSet.of(
-            "CH", "ID", "DNT", "DNS", "HTTP2", "IP", "MD5", "P3P", "TE", "UA", "UID", "URL", "WWW",
-            "XSS");
+            "CH", "ID", "DNT", "DNS", "ECT", "HTTP2", "IP", "MD5", "P3P", "RTT", "TE", "UA", "UID",
+            "URL", "WWW", "XSS");
     assertConstantNameMatchesString(HttpHeaders.class, specialCases, uppercaseAcronyms);
   }
 
diff --git a/guava-tests/test/com/google/common/net/InetAddressesTest.java b/guava-tests/test/com/google/common/net/InetAddressesTest.java
index ed3aa27..be77e7b 100644
--- a/guava-tests/test/com/google/common/net/InetAddressesTest.java
+++ b/guava-tests/test/com/google/common/net/InetAddressesTest.java
@@ -135,6 +135,20 @@
     assertTrue(InetAddresses.isInetAddress(ipStr));
   }
 
+  public void testForStringIPv4NonAsciiInput() throws UnknownHostException {
+    String ipStr = "૧૯૨.૧૬૮.૦.૧"; // 192.168.0.1 in Gujarati digits
+    // Shouldn't hit DNS, because it's an IP string literal.
+    InetAddress ipv4Addr;
+    try {
+      ipv4Addr = InetAddress.getByName(ipStr);
+    } catch (UnknownHostException e) {
+      // OK: this is probably Android, which is stricter.
+      return;
+    }
+    assertEquals(ipv4Addr, InetAddresses.forString(ipStr));
+    assertTrue(InetAddresses.isInetAddress(ipStr));
+  }
+
   public void testForStringIPv6Input() throws UnknownHostException {
     String ipStr = "3ffe::1";
     // Shouldn't hit DNS, because it's an IP string literal.
@@ -143,6 +157,20 @@
     assertTrue(InetAddresses.isInetAddress(ipStr));
   }
 
+  public void testForStringIPv6NonAsciiInput() throws UnknownHostException {
+    String ipStr = "૩ffe::૧"; // 3ffe::1 with Gujarati digits for 3 and 1
+    // Shouldn't hit DNS, because it's an IP string literal.
+    InetAddress ipv6Addr;
+    try {
+      ipv6Addr = InetAddress.getByName(ipStr);
+    } catch (UnknownHostException e) {
+      // OK: this is probably Android, which is stricter.
+      return;
+    }
+    assertEquals(ipv6Addr, InetAddresses.forString(ipStr));
+    assertTrue(InetAddresses.isInetAddress(ipStr));
+  }
+
   public void testForStringIPv6EightColons() throws UnknownHostException {
     ImmutableSet<String> eightColons =
         ImmutableSet.of("::7:6:5:4:3:2:1", "::7:6:5:4:3:2:0", "7:6:5:4:3:2:1::", "0:6:5:4:3:2:1::");
diff --git a/guava-tests/test/com/google/common/net/InternetDomainNameTest.java b/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
index 09602b7..7113fb4 100644
--- a/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
+++ b/guava-tests/test/com/google/common/net/InternetDomainNameTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.net;
 
+
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Ascii;
diff --git a/guava-tests/test/com/google/common/net/MediaTypeTest.java b/guava-tests/test/com/google/common/net/MediaTypeTest.java
index cec3cdd..574db68 100644
--- a/guava-tests/test/com/google/common/net/MediaTypeTest.java
+++ b/guava-tests/test/com/google/common/net/MediaTypeTest.java
@@ -46,7 +46,6 @@
 import com.google.common.testing.NullPointerTester;
 import java.lang.reflect.Field;
 import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
 import java.nio.charset.UnsupportedCharsetException;
 import java.util.Arrays;
 import junit.framework.TestCase;
@@ -537,7 +536,7 @@
     try {
       mediaType.charset();
       fail();
-    } catch (IllegalCharsetNameException expected) {
+    } catch (IllegalArgumentException expected) {
     }
   }
 
diff --git a/guava-tests/test/com/google/common/primitives/UnsignedLongTest.java b/guava-tests/test/com/google/common/primitives/UnsignedLongTest.java
index dd2a8ab..cfa2862 100644
--- a/guava-tests/test/com/google/common/primitives/UnsignedLongTest.java
+++ b/guava-tests/test/com/google/common/primitives/UnsignedLongTest.java
@@ -36,13 +36,23 @@
   static {
     ImmutableSet.Builder<Long> testLongsBuilder = ImmutableSet.builder();
     ImmutableSet.Builder<BigInteger> testBigIntegersBuilder = ImmutableSet.builder();
+
+    // The values here look like 111...11101...010 in binary, where the initial 111...1110 takes
+    // up exactly as many bits as can be represented in the significand (24 for float, 53 for
+    // double). That final 0 should be rounded up to 1 because the remaining bits make that number
+    // slightly nearer.
+    long floatConversionTest = 0xfffffe8000000002L;
+    long doubleConversionTest = 0xfffffffffffff402L;
+
     for (long i = -3; i <= 3; i++) {
       testLongsBuilder
           .add(i)
           .add(Long.MAX_VALUE + i)
           .add(Long.MIN_VALUE + i)
           .add(Integer.MIN_VALUE + i)
-          .add(Integer.MAX_VALUE + i);
+          .add(Integer.MAX_VALUE + i)
+          .add(floatConversionTest + i)
+          .add(doubleConversionTest + i);
       BigInteger bigI = BigInteger.valueOf(i);
       testBigIntegersBuilder
           .add(bigI)
@@ -130,17 +140,26 @@
     }
   }
 
+  @AndroidIncompatible // b/28251030, re-enable when the fix is everywhere we run this test
   public void testFloatValue() {
     for (long value : TEST_LONGS) {
       UnsignedLong unsignedValue = UnsignedLong.fromLongBits(value);
-      assertEquals(unsignedValue.bigIntegerValue().floatValue(), unsignedValue.floatValue());
+      assertEquals(
+          "Float value of " + unsignedValue,
+          unsignedValue.bigIntegerValue().floatValue(),
+          unsignedValue.floatValue(),
+          0.0f);
     }
   }
 
   public void testDoubleValue() {
     for (long value : TEST_LONGS) {
       UnsignedLong unsignedValue = UnsignedLong.fromLongBits(value);
-      assertEquals(unsignedValue.bigIntegerValue().doubleValue(), unsignedValue.doubleValue());
+      assertEquals(
+          "Double value of " + unsignedValue,
+          unsignedValue.bigIntegerValue().doubleValue(),
+          unsignedValue.doubleValue(),
+          0.0);
     }
   }
 
diff --git a/guava-tests/test/com/google/common/reflect/ClassPathTest.java b/guava-tests/test/com/google/common/reflect/ClassPathTest.java
index 1d21002..797baeb 100644
--- a/guava-tests/test/com/google/common/reflect/ClassPathTest.java
+++ b/guava-tests/test/com/google/common/reflect/ClassPathTest.java
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package com.google.common.reflect;
 
 import static com.google.common.base.Charsets.US_ASCII;
@@ -49,10 +48,7 @@
 import java.net.URLClassLoader;
 import java.security.Permission;
 import java.security.PermissionCollection;
-import java.util.HashSet;
-import java.util.Set;
 import java.util.jar.Attributes;
-import java.util.jar.JarFile;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;
 import java.util.logging.Logger;
@@ -78,7 +74,7 @@
 
   @AndroidIncompatible // Android forbids null parent ClassLoader
   public void testClassPathEntries_emptyURLClassLoader_noParent() {
-    assertThat(ClassPath.Scanner.getClassPathEntries(new URLClassLoader(new URL[0], null)).keySet())
+    assertThat(ClassPath.getClassPathEntries(new URLClassLoader(new URL[0], null)).keySet())
         .isEmpty();
   }
 
@@ -87,7 +83,7 @@
     URL url1 = new URL("file:/a");
     URL url2 = new URL("file:/b");
     URLClassLoader classloader = new URLClassLoader(new URL[] {url1, url2}, null);
-    assertThat(ClassPath.Scanner.getClassPathEntries(classloader))
+    assertThat(ClassPath.getClassPathEntries(classloader))
         .containsExactly(new File("/a"), classloader, new File("/b"), classloader);
   }
 
@@ -97,7 +93,7 @@
     URL url2 = new URL("file:/b");
     URLClassLoader parent = new URLClassLoader(new URL[] {url1}, null);
     URLClassLoader child = new URLClassLoader(new URL[] {url2}, parent) {};
-    assertThat(ClassPath.Scanner.getClassPathEntries(child))
+    assertThat(ClassPath.getClassPathEntries(child))
         .containsExactly(new File("/a"), parent, new File("/b"), child)
         .inOrder();
   }
@@ -107,20 +103,19 @@
     URL url = new URL("file:/a");
     URLClassLoader parent = new URLClassLoader(new URL[] {url}, null);
     URLClassLoader child = new URLClassLoader(new URL[] {url}, parent) {};
-    assertThat(ClassPath.Scanner.getClassPathEntries(child))
-        .containsExactly(new File("/a"), parent);
+    assertThat(ClassPath.getClassPathEntries(child)).containsExactly(new File("/a"), parent);
   }
 
   @AndroidIncompatible // Android forbids null parent ClassLoader
   public void testClassPathEntries_notURLClassLoader_noParent() {
-    assertThat(ClassPath.Scanner.getClassPathEntries(new ClassLoader(null) {})).isEmpty();
+    assertThat(ClassPath.getClassPathEntries(new ClassLoader(null) {})).isEmpty();
   }
 
   @AndroidIncompatible // Android forbids null parent ClassLoader
   public void testClassPathEntries_notURLClassLoader_withParent() throws Exception {
     URL url = new URL("file:/a");
     URLClassLoader parent = new URLClassLoader(new URL[] {url}, null);
-    assertThat(ClassPath.Scanner.getClassPathEntries(new ClassLoader(parent) {}))
+    assertThat(ClassPath.getClassPathEntries(new ClassLoader(parent) {}))
         .containsExactly(new File("/a"), parent);
   }
 
@@ -130,7 +125,7 @@
     URL url2 = new URL("file:/b");
     URLClassLoader grandParent = new URLClassLoader(new URL[] {url1}, null);
     URLClassLoader parent = new URLClassLoader(new URL[] {url2}, grandParent);
-    assertThat(ClassPath.Scanner.getClassPathEntries(new ClassLoader(parent) {}))
+    assertThat(ClassPath.getClassPathEntries(new ClassLoader(parent) {}))
         .containsExactly(new File("/a"), grandParent, new File("/b"), parent);
   }
 
@@ -139,7 +134,7 @@
     URL url = new URL("file:/a");
     URLClassLoader grandParent = new URLClassLoader(new URL[] {url}, null);
     ClassLoader parent = new ClassLoader(grandParent) {};
-    assertThat(ClassPath.Scanner.getClassPathEntries(new ClassLoader(parent) {}))
+    assertThat(ClassPath.getClassPathEntries(new ClassLoader(parent) {}))
         .containsExactly(new File("/a"), grandParent);
   }
 
@@ -148,7 +143,7 @@
   public void testClassPathEntries_URLClassLoader_pathWithSpace() throws Exception {
     URL url = new URL("file:///c:/Documents and Settings/");
     URLClassLoader classloader = new URLClassLoader(new URL[] {url}, null);
-    assertThat(ClassPath.Scanner.getClassPathEntries(classloader))
+    assertThat(ClassPath.getClassPathEntries(classloader))
         .containsExactly(new File("/c:/Documents and Settings/"), classloader);
   }
 
@@ -157,7 +152,7 @@
   public void testClassPathEntries_URLClassLoader_pathWithEscapedSpace() throws Exception {
     URL url = new URL("file:///c:/Documents%20and%20Settings/");
     URLClassLoader classloader = new URLClassLoader(new URL[] {url}, null);
-    assertThat(ClassPath.Scanner.getClassPathEntries(classloader))
+    assertThat(ClassPath.getClassPathEntries(classloader))
         .containsExactly(new File("/c:/Documents and Settings/"), classloader);
   }
 
@@ -180,6 +175,7 @@
         .isEqualTo(new File("/C:\\\u20320 \u22909"));
   }
 
+
   @AndroidIncompatible // Android forbids null parent ClassLoader
   // https://github.com/google/guava/issues/2152
   public void testJarFileWithSpaces() throws Exception {
@@ -188,13 +184,15 @@
     assertThat(ClassPath.from(classloader).getTopLevelClasses()).isNotEmpty();
   }
 
+
   public void testScan_classPathCycle() throws IOException {
     File jarFile = File.createTempFile("with_circular_class_path", ".jar");
     try {
       writeSelfReferencingJarFile(jarFile, "test.txt");
-      ClassPath.DefaultScanner scanner = new ClassPath.DefaultScanner();
-      scanner.scan(jarFile, ClassPathTest.class.getClassLoader());
-      assertThat(scanner.getResources()).hasSize(1);
+      assertThat(
+              new ClassPath.LocationInfo(jarFile, ClassPathTest.class.getClassLoader())
+                  .scanResources())
+          .hasSize(1);
     } finally {
       jarFile.delete();
     }
@@ -220,17 +218,13 @@
 
       createSymbolicLink(left.resolve("sibling"), right);
       createSymbolicLink(right.resolve("sibling"), left);
-
-      ClassPath.DefaultScanner scanner = new ClassPath.DefaultScanner();
-      scanner.scan(root.toFile(), loader);
-
       assertEquals(
           ImmutableSet.of(
               new ResourceInfo(FILE, "left/some.txt", loader),
               new ResourceInfo(FILE, "left/sibling/another.txt", loader),
               new ResourceInfo(FILE, "right/another.txt", loader),
               new ResourceInfo(FILE, "right/sibling/some.txt", loader)),
-          scanner.getResources());
+          new ClassPath.LocationInfo(root.toFile(), loader).scanResources());
     } finally {
       deleteRecursivelyOrLog(root);
     }
@@ -249,83 +243,77 @@
       createFile(root.resolve("some.txt"));
       java.nio.file.Path child = createDirectory(root.resolve("child"));
       createSymbolicLink(child.resolve("grandchild"), root);
-
-      ClassPath.DefaultScanner scanner = new ClassPath.DefaultScanner();
-      scanner.scan(root.toFile(), loader);
-
       assertEquals(
-          ImmutableSet.of(new ResourceInfo(FILE, "some.txt", loader)), scanner.getResources());
+          ImmutableSet.of(new ResourceInfo(FILE, "some.txt", loader)),
+          new ClassPath.LocationInfo(root.toFile(), loader).scanResources());
     } finally {
       deleteRecursivelyOrLog(root);
     }
   }
 
+
   public void testScanFromFile_fileNotExists() throws IOException {
     ClassLoader classLoader = ClassPathTest.class.getClassLoader();
-    ClassPath.DefaultScanner scanner = new ClassPath.DefaultScanner();
-    scanner.scan(new File("no/such/file/anywhere"), classLoader);
-    assertThat(scanner.getResources()).isEmpty();
+    assertThat(
+            new ClassPath.LocationInfo(new File("no/such/file/anywhere"), classLoader)
+                .scanResources())
+        .isEmpty();
   }
 
+
   public void testScanFromFile_notJarFile() throws IOException {
     ClassLoader classLoader = ClassPathTest.class.getClassLoader();
     File notJar = File.createTempFile("not_a_jar", "txt");
-    ClassPath.DefaultScanner scanner = new ClassPath.DefaultScanner();
     try {
-      scanner.scan(notJar, classLoader);
+      assertThat(new ClassPath.LocationInfo(notJar, classLoader).scanResources()).isEmpty();
     } finally {
       notJar.delete();
     }
-    assertThat(scanner.getResources()).isEmpty();
   }
 
   public void testGetClassPathEntry() throws MalformedURLException, URISyntaxException {
     assertEquals(
         new File("/usr/test/dep.jar").toURI(),
-        ClassPath.Scanner.getClassPathEntry(
-                new File("/home/build/outer.jar"), "file:/usr/test/dep.jar")
+        ClassPath.getClassPathEntry(new File("/home/build/outer.jar"), "file:/usr/test/dep.jar")
             .toURI());
     assertEquals(
         new File("/home/build/a.jar").toURI(),
-        ClassPath.Scanner.getClassPathEntry(new File("/home/build/outer.jar"), "a.jar").toURI());
+        ClassPath.getClassPathEntry(new File("/home/build/outer.jar"), "a.jar").toURI());
     assertEquals(
         new File("/home/build/x/y/z").toURI(),
-        ClassPath.Scanner.getClassPathEntry(new File("/home/build/outer.jar"), "x/y/z").toURI());
+        ClassPath.getClassPathEntry(new File("/home/build/outer.jar"), "x/y/z").toURI());
     assertEquals(
         new File("/home/build/x/y/z.jar").toURI(),
-        ClassPath.Scanner.getClassPathEntry(new File("/home/build/outer.jar"), "x/y/z.jar")
-            .toURI());
+        ClassPath.getClassPathEntry(new File("/home/build/outer.jar"), "x/y/z.jar").toURI());
     assertEquals(
         "/home/build/x y.jar",
-        ClassPath.Scanner.getClassPathEntry(new File("/home/build/outer.jar"), "x y.jar")
-            .getFile());
+        ClassPath.getClassPathEntry(new File("/home/build/outer.jar"), "x y.jar").getFile());
   }
 
   public void testGetClassPathFromManifest_nullManifest() {
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(new File("some.jar"), null)).isEmpty();
+    assertThat(ClassPath.getClassPathFromManifest(new File("some.jar"), null)).isEmpty();
   }
 
   public void testGetClassPathFromManifest_noClassPath() throws IOException {
     File jarFile = new File("base.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest(""))).isEmpty();
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest(""))).isEmpty();
   }
 
   public void testGetClassPathFromManifest_emptyClassPath() throws IOException {
     File jarFile = new File("base.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifestClasspath("")))
-        .isEmpty();
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifestClasspath(""))).isEmpty();
   }
 
   public void testGetClassPathFromManifest_badClassPath() throws IOException {
     File jarFile = new File("base.jar");
     Manifest manifest = manifestClasspath("nosuchscheme:an_invalid^path");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest)).isEmpty();
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest)).isEmpty();
   }
 
   public void testGetClassPathFromManifest_pathWithStrangeCharacter() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath("file:the^file.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/the^file.jar"));
   }
 
@@ -333,7 +321,7 @@
     File jarFile = new File("base/some.jar");
     // with/relative/directory is the Class-Path value in the mf file.
     Manifest manifest = manifestClasspath("with/relative/dir");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/with/relative/dir"));
   }
 
@@ -341,7 +329,7 @@
     File jarFile = new File("base/some.jar");
     // with/relative/directory is the Class-Path value in the mf file.
     Manifest manifest = manifestClasspath("with/relative.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/with/relative.jar"));
   }
 
@@ -349,28 +337,28 @@
     File jarFile = new File("base/some.jar");
     // with/relative/directory is the Class-Path value in the mf file.
     Manifest manifest = manifestClasspath("current.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/current.jar"));
   }
 
   public void testGetClassPathFromManifest_absoluteDirectory() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath("file:/with/absolute/dir");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("/with/absolute/dir"));
   }
 
   public void testGetClassPathFromManifest_absoluteJar() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath("file:/with/absolute.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("/with/absolute.jar"));
   }
 
   public void testGetClassPathFromManifest_multiplePaths() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath("file:/with/absolute.jar relative.jar  relative/dir");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(
             fullpath("/with/absolute.jar"),
             fullpath("base/relative.jar"),
@@ -381,14 +369,14 @@
   public void testGetClassPathFromManifest_leadingBlanks() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath(" relative.jar");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/relative.jar"));
   }
 
   public void testGetClassPathFromManifest_trailingBlanks() throws IOException {
     File jarFile = new File("base/some.jar");
     Manifest manifest = manifestClasspath("relative.jar ");
-    assertThat(ClassPath.Scanner.getClassPathFromManifest(jarFile, manifest))
+    assertThat(ClassPath.getClassPathFromManifest(jarFile, manifest))
         .containsExactly(fullpath("base/relative.jar"));
   }
 
@@ -422,6 +410,7 @@
 
   // Test that ResourceInfo.urls() returns identical content to ClassLoader.getResources()
 
+
   public void testGetClassPathUrls() throws Exception {
     String oldPathSeparator = PATH_SEPARATOR.value();
     String oldClassPath = JAVA_CLASS_PATH.value();
@@ -435,7 +424,7 @@
                 "relative/path/to/class/root",
                 "/absolute/path/to/class/root"));
     try {
-      ImmutableList<URL> urls = ClassPath.Scanner.parseJavaClassPath();
+      ImmutableList<URL> urls = ClassPath.parseJavaClassPath();
 
       assertThat(urls.get(0).getProtocol()).isEqualTo("file");
       assertThat(urls.get(0).getAuthority()).isNull();
@@ -462,18 +451,50 @@
 
   private static class Nested {}
 
+
   public void testNulls() throws IOException {
     new NullPointerTester().testAllPublicStaticMethods(ClassPath.class);
     new NullPointerTester()
         .testAllPublicInstanceMethods(ClassPath.from(getClass().getClassLoader()));
   }
 
-  public void testResourceScanner() throws IOException {
-    ResourceScanner scanner = new ResourceScanner();
-    scanner.scan(ClassLoader.getSystemClassLoader());
-    assertThat(scanner.resources).contains("com/google/common/reflect/ClassPathTest.class");
+
+  public void testLocationsFrom_idempotentScan() throws IOException {
+    ImmutableSet<ClassPath.LocationInfo> locations =
+        ClassPath.locationsFrom(getClass().getClassLoader());
+    assertThat(locations).isNotEmpty();
+    for (ClassPath.LocationInfo location : locations) {
+      ImmutableSet<ResourceInfo> resources = location.scanResources();
+      assertThat(location.scanResources()).containsExactlyElementsIn(resources);
+    }
   }
 
+  public void testLocationsFrom_idempotentLocations() {
+    ImmutableSet<ClassPath.LocationInfo> locations =
+        ClassPath.locationsFrom(getClass().getClassLoader());
+    assertThat(ClassPath.locationsFrom(getClass().getClassLoader()))
+        .containsExactlyElementsIn(locations);
+  }
+
+  public void testLocationEquals() {
+    ClassLoader child = getClass().getClassLoader();
+    ClassLoader parent = child.getParent();
+    new EqualsTester()
+        .addEqualityGroup(
+            new ClassPath.LocationInfo(new File("foo.jar"), child),
+            new ClassPath.LocationInfo(new File("foo.jar"), child))
+        .addEqualityGroup(new ClassPath.LocationInfo(new File("foo.jar"), parent))
+        .addEqualityGroup(new ClassPath.LocationInfo(new File("foo"), child))
+        .testEquals();
+  }
+
+
+  public void testScanAllResources() throws IOException {
+    assertThat(scanResourceNames(ClassLoader.getSystemClassLoader()))
+        .contains("com/google/common/reflect/ClassPathTest.class");
+  }
+
+
   public void testExistsThrowsSecurityException() throws IOException, URISyntaxException {
     SecurityManager oldSecurityManager = System.getSecurityManager();
     try {
@@ -488,7 +509,7 @@
     // In Java 9, Logger may read the TZ database. Only disallow reading the class path URLs.
     final PermissionCollection readClassPathFiles =
         new FilePermission("", "read").newPermissionCollection();
-    for (URL url : ClassPath.Scanner.parseJavaClassPath()) {
+    for (URL url : ClassPath.parseJavaClassPath()) {
       if (url.getProtocol().equalsIgnoreCase("file")) {
         file = new File(url.toURI());
         readClassPathFiles.add(new FilePermission(file.getAbsolutePath(), "read"));
@@ -580,47 +601,21 @@
     return new File(new File(path).toURI());
   }
 
-  private static class ResourceScanner extends ClassPath.Scanner {
-    final Set<String> resources = new HashSet<>();
-
-    @Override
-    protected void scanResource(ResourceInfo resource) throws IOException {
-      resources.add(resource.getResourceName());
-    }
-  }
-
   private static URL makeJarUrlWithName(String name) throws IOException {
     File fullPath = new File(Files.createTempDir(), name);
-    File jarFile = JarFileFinder.pickAnyJarFile();
+    File jarFile = pickAnyJarFile();
     Files.copy(jarFile, fullPath);
     return fullPath.toURI().toURL();
   }
 
-  private static final class JarFileFinder extends ClassPath.Scanner {
-
-    private File found;
-
-    static File pickAnyJarFile() throws IOException {
-      JarFileFinder finder = new JarFileFinder();
-      try {
-        finder.scan(JarFileFinder.class.getClassLoader());
-        throw new IllegalStateException("No jar file found!");
-      } catch (StopScanningException expected) {
-        return finder.found;
+  private static File pickAnyJarFile() throws IOException {
+    for (ClassPath.LocationInfo location :
+        ClassPath.locationsFrom(ClassPathTest.class.getClassLoader())) {
+      if (!location.file().isDirectory() && location.file().exists()) {
+        return location.file();
       }
     }
-
-    @Override
-    void scanJarFile(ClassLoader classloader, JarFile file) throws IOException {
-      this.found = new File(file.getName());
-      throw new StopScanningException();
-    }
-
-    @Override
-    protected void scanResource(ResourceInfo resource) {}
-
-    // Special exception just to terminate the scanning when we get any jar file to use.
-    private static final class StopScanningException extends RuntimeException {}
+    throw new AssertionError("Failed to find a jar file");
   }
 
   @AndroidIncompatible // Path (for symlink creation)
@@ -631,4 +626,14 @@
       log.log(WARNING, "Failure cleaning up test directory", e);
     }
   }
+
+  private static ImmutableSet<String> scanResourceNames(ClassLoader loader) throws IOException {
+    ImmutableSet.Builder<String> builder = ImmutableSet.builder();
+    for (ClassPath.LocationInfo location : ClassPath.locationsFrom(loader)) {
+      for (ResourceInfo resource : location.scanResources()) {
+        builder.add(resource.getResourceName());
+      }
+    }
+    return builder.build();
+  }
 }
diff --git a/guava-tests/test/com/google/common/reflect/ElementTest.java b/guava-tests/test/com/google/common/reflect/ElementTest.java
deleted file mode 100644
index abe63ba..0000000
--- a/guava-tests/test/com/google/common/reflect/ElementTest.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright (C) 2012 The Guava Authors
- *
- * 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 com.google.common.reflect;
-
-import com.google.common.testing.EqualsTester;
-import com.google.common.testing.NullPointerTester;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.Constructor;
-import junit.framework.TestCase;
-
-/**
- * Unit tests of {@link Element}.
- *
- * @author Ben Yu
- */
-public class ElementTest extends TestCase {
-
-  public void testPrivateField() throws Exception {
-    Element element = A.field("privateField");
-    assertTrue(element.isPrivate());
-    assertFalse(element.isAbstract());
-    assertFalse(element.isPackagePrivate());
-    assertFalse(element.isProtected());
-    assertFalse(element.isPublic());
-    assertFalse(element.isFinal());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testPackagePrivateField() throws Exception {
-    Element element = A.field("packagePrivateField");
-    assertFalse(element.isPrivate());
-    assertTrue(element.isPackagePrivate());
-    assertFalse(element.isProtected());
-    assertFalse(element.isPublic());
-    assertFalse(element.isFinal());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testProtectedField() throws Exception {
-    Element element = A.field("protectedField");
-    assertFalse(element.isPrivate());
-    assertFalse(element.isPackagePrivate());
-    assertTrue(element.isProtected());
-    assertFalse(element.isPublic());
-    assertFalse(element.isFinal());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testPublicField() throws Exception {
-    Element element = A.field("publicField");
-    assertFalse(element.isPrivate());
-    assertFalse(element.isPackagePrivate());
-    assertFalse(element.isProtected());
-    assertTrue(element.isPublic());
-    assertFalse(element.isFinal());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testFinalField() throws Exception {
-    Element element = A.field("finalField");
-    assertTrue(element.isFinal());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testStaticField() throws Exception {
-    Element element = A.field("staticField");
-    assertTrue(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testVolatileField() throws Exception {
-    Element element = A.field("volatileField");
-    assertTrue(element.isVolatile());
-  }
-
-  public void testTransientField() throws Exception {
-    Element element = A.field("transientField");
-    assertTrue(element.isTransient());
-  }
-
-  public void testConstructor() throws Exception {
-    Element element = A.constructor();
-    assertTrue(element.isPublic());
-    assertFalse(element.isPackagePrivate());
-    assertFalse(element.isAbstract());
-    assertFalse(element.isStatic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testAbstractMethod() throws Exception {
-    Element element = A.method("abstractMethod");
-    assertTrue(element.isPackagePrivate());
-    assertTrue(element.isAbstract());
-    assertFalse(element.isFinal());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testOverridableMethod() throws Exception {
-    Element element = A.method("overridableMethod");
-    assertTrue(element.isPackagePrivate());
-    assertFalse(element.isAbstract());
-    assertFalse(element.isFinal());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testPrivateMethod() throws Exception {
-    Element element = A.method("privateMethod");
-    assertFalse(element.isAbstract());
-    assertTrue(element.isPrivate());
-    assertFalse(element.isPackagePrivate());
-    assertFalse(element.isPublic());
-    assertFalse(element.isProtected());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testProtectedMethod() throws Exception {
-    Element element = A.method("protectedMethod");
-    assertFalse(element.isAbstract());
-    assertFalse(element.isPrivate());
-    assertFalse(element.isPackagePrivate());
-    assertFalse(element.isFinal());
-    assertFalse(element.isPublic());
-    assertTrue(element.isProtected());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testFinalMethod() throws Exception {
-    Element element = A.method("publicFinalMethod");
-    assertFalse(element.isAbstract());
-    assertFalse(element.isPrivate());
-    assertTrue(element.isFinal());
-    assertTrue(element.isPublic());
-    assertTrue(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testNativeMethod() throws Exception {
-    Element element = A.method("nativeMethod");
-    assertTrue(element.isNative());
-    assertTrue(element.isPackagePrivate());
-  }
-
-  public void testSynchronizedMethod() throws Exception {
-    Element element = A.method("synchronizedMethod");
-    assertTrue(element.isSynchronized());
-  }
-
-  public void testUnannotatedMethod() throws Exception {
-    Element element = A.method("notAnnotatedMethod");
-    assertFalse(element.isAnnotationPresent(Tested.class));
-  }
-
-  public void testEquals() throws Exception {
-    new EqualsTester()
-        .addEqualityGroup(A.field("privateField"), A.field("privateField"))
-        .addEqualityGroup(A.field("publicField"))
-        .addEqualityGroup(A.constructor(), A.constructor())
-        .addEqualityGroup(A.method("privateMethod"), A.method("privateMethod"))
-        .addEqualityGroup(A.method("publicFinalMethod"))
-        .testEquals();
-  }
-
-  public void testNulls() {
-    new NullPointerTester().testAllPublicStaticMethods(Element.class);
-  }
-
-  @Retention(RetentionPolicy.RUNTIME)
-  private @interface Tested {}
-
-  private abstract static class A {
-    @Tested private boolean privateField;
-    @Tested int packagePrivateField;
-    @Tested protected int protectedField;
-    @Tested public String publicField;
-    @Tested private static Iterable<String> staticField;
-    @Tested private final Object finalField;
-    private volatile char volatileField;
-    private transient long transientField;
-
-    @Tested
-    public A(Object finalField) {
-      this.finalField = finalField;
-    }
-
-    @Tested
-    abstract void abstractMethod();
-
-    @Tested
-    void overridableMethod() {}
-
-    @Tested
-    protected void protectedMethod() {}
-
-    @Tested
-    private void privateMethod() {}
-
-    @Tested
-    public final void publicFinalMethod() {}
-
-    void notAnnotatedMethod() {}
-
-    static Element field(String name) throws Exception {
-      Element element = new Element(A.class.getDeclaredField(name));
-      assertEquals(name, element.getName());
-      assertEquals(A.class, element.getDeclaringClass());
-      return element;
-    }
-
-    static Element constructor() throws Exception {
-      Constructor<?> constructor = A.class.getDeclaredConstructor(Object.class);
-      Element element = new Element(constructor);
-      assertEquals(constructor.getName(), element.getName());
-      assertEquals(A.class, element.getDeclaringClass());
-      return element;
-    }
-
-    static Element method(String name, Class<?>... parameterTypes) throws Exception {
-      Element element = new Element(A.class.getDeclaredMethod(name, parameterTypes));
-      assertEquals(name, element.getName());
-      assertEquals(A.class, element.getDeclaringClass());
-      return element;
-    }
-
-    native void nativeMethod();
-
-    synchronized void synchronizedMethod() {}
-  }
-}
diff --git a/guava-tests/test/com/google/common/reflect/InvokableTest.java b/guava-tests/test/com/google/common/reflect/InvokableTest.java
index 1b48ba6..3e51c82 100644
--- a/guava-tests/test/com/google/common/reflect/InvokableTest.java
+++ b/guava-tests/test/com/google/common/reflect/InvokableTest.java
@@ -19,13 +19,16 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.testing.EqualsTester;
 import com.google.common.testing.NullPointerTester;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.TypeVariable;
 import java.util.Collections;
@@ -39,6 +42,180 @@
  */
 @AndroidIncompatible // lots of failures, possibly some related to bad equals() implementations?
 public class InvokableTest extends TestCase {
+  // Historically Invokable inherited from java.lang.reflect.AccessibleObject. That's no longer the
+  // case, but we do check that its API still has the same public methods. We exclude some methods
+  // that were added in Java 9 and that people probably weren't calling via Invokable, namely
+  // `boolean canAccess(Object)` and `boolean trySetAccessible()`.
+  public void testApiCompatibleWithAccessibleObject() {
+    ImmutableSet<String> invokableMethods =
+        publicMethodSignatures(Invokable.class, ImmutableSet.<String>of());
+    ImmutableSet<String> accesibleObjectMethods =
+        publicMethodSignatures(AccessibleObject.class, ImmutableSet.of("canAccess"));
+    assertThat(invokableMethods).containsAtLeastElementsIn(accesibleObjectMethods);
+    Class<?> genericDeclaration;
+    try {
+      genericDeclaration = Class.forName("java.lang.reflect.GenericDeclaration");
+      ImmutableSet<String> genericDeclarationMethods =
+          publicMethodSignatures(genericDeclaration, ImmutableSet.<String>of());
+      assertThat(invokableMethods).containsAtLeastElementsIn(genericDeclarationMethods);
+    } catch (ClassNotFoundException e) {
+      // OK: we're on Java 7, which doesn't have this class
+    }
+  }
+
+  private static ImmutableSet<String> publicMethodSignatures(
+      Class<?> c, ImmutableSet<String> ignore) {
+    ImmutableSet.Builder<String> methods = ImmutableSet.builder();
+    for (Method method : c.getMethods()) {
+      if (Modifier.isStatic(method.getModifiers()) || ignore.contains(method.getName())) {
+        continue;
+      }
+      StringBuilder signature =
+          new StringBuilder()
+              .append(typeName(method.getReturnType()))
+              .append(" ")
+              .append(method.getName())
+              .append("(");
+      String sep = "";
+      for (Class<?> param : method.getParameterTypes()) {
+        signature.append(sep).append(typeName(param));
+        sep = ", ";
+      }
+      methods.add(signature.append(")").toString());
+    }
+    return methods.build();
+  }
+
+  private static String typeName(Class<?> type) {
+    return type.isArray() ? typeName(type.getComponentType()) + "[]" : type.getName();
+  }
+
+  public void testConstructor() throws Exception {
+    Invokable<A, A> invokable = A.constructor();
+    assertTrue(invokable.isPublic());
+    assertFalse(invokable.isPackagePrivate());
+    assertFalse(invokable.isAbstract());
+    assertFalse(invokable.isStatic());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testAbstractMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("abstractMethod");
+    assertTrue(invokable.isPackagePrivate());
+    assertTrue(invokable.isAbstract());
+    assertFalse(invokable.isFinal());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testOverridableMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("overridableMethod");
+    assertTrue(invokable.isPackagePrivate());
+    assertFalse(invokable.isAbstract());
+    assertFalse(invokable.isFinal());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testPrivateMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("privateMethod");
+    assertFalse(invokable.isAbstract());
+    assertTrue(invokable.isPrivate());
+    assertFalse(invokable.isPackagePrivate());
+    assertFalse(invokable.isPublic());
+    assertFalse(invokable.isProtected());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testProtectedMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("protectedMethod");
+    assertFalse(invokable.isAbstract());
+    assertFalse(invokable.isPrivate());
+    assertFalse(invokable.isPackagePrivate());
+    assertFalse(invokable.isFinal());
+    assertFalse(invokable.isPublic());
+    assertTrue(invokable.isProtected());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testFinalMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("publicFinalMethod");
+    assertFalse(invokable.isAbstract());
+    assertFalse(invokable.isPrivate());
+    assertTrue(invokable.isFinal());
+    assertTrue(invokable.isPublic());
+    assertTrue(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  public void testNativeMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("nativeMethod");
+    assertTrue(invokable.isNative());
+    assertTrue(invokable.isPackagePrivate());
+  }
+
+  public void testSynchronizedMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("synchronizedMethod");
+    assertTrue(invokable.isSynchronized());
+  }
+
+  public void testUnannotatedMethod() throws Exception {
+    Invokable<?, Object> invokable = A.method("notAnnotatedMethod");
+    assertFalse(invokable.isAnnotationPresent(Tested.class));
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  private @interface Tested {}
+
+  private abstract static class A {
+    @Tested private boolean privateField;
+    @Tested int packagePrivateField;
+    @Tested protected int protectedField;
+    @Tested public String publicField;
+    @Tested private static Iterable<String> staticField;
+    @Tested private final Object finalField;
+    private volatile char volatileField;
+    private transient long transientField;
+
+    @Tested
+    public A(Object finalField) {
+      this.finalField = finalField;
+    }
+
+    @Tested
+    abstract void abstractMethod();
+
+    @Tested
+    void overridableMethod() {}
+
+    @Tested
+    protected void protectedMethod() {}
+
+    @Tested
+    private void privateMethod() {}
+
+    @Tested
+    public final void publicFinalMethod() {}
+
+    void notAnnotatedMethod() {}
+
+    static Invokable<A, A> constructor() throws Exception {
+      Constructor<A> constructor = A.class.getDeclaredConstructor(Object.class);
+      Invokable<A, A> invokable = Invokable.from(constructor);
+      assertEquals(constructor.getName(), invokable.getName());
+      assertEquals(A.class, invokable.getDeclaringClass());
+      return invokable;
+    }
+
+    static Invokable<?, Object> method(String name, Class<?>... parameterTypes) throws Exception {
+      Invokable<?, Object> invokable =
+          Invokable.from(A.class.getDeclaredMethod(name, parameterTypes));
+      assertEquals(name, invokable.getName());
+      assertEquals(A.class, invokable.getDeclaringClass());
+      return invokable;
+    }
+
+    native void nativeMethod();
+
+    synchronized void synchronizedMethod() {}
+  }
 
   public void testConstructor_returnType() throws Exception {
     assertEquals(Prepender.class, Prepender.constructor().getReturnType().getType());
@@ -74,7 +251,7 @@
   public void testConstructor_typeParameters() throws Exception {
     TypeVariable<?>[] variables = Prepender.constructor().getTypeParameters();
     assertThat(variables).hasLength(1);
-    assertEquals("A", variables[0].getName());
+    assertEquals("T", variables[0].getName());
   }
 
   public void testConstructor_parameters() throws Exception {
@@ -530,6 +707,9 @@
 
   public void testEquals() throws Exception {
     new EqualsTester()
+        .addEqualityGroup(A.constructor(), A.constructor())
+        .addEqualityGroup(A.method("privateMethod"), A.method("privateMethod"))
+        .addEqualityGroup(A.method("publicFinalMethod"))
         .addEqualityGroup(Prepender.constructor(), Prepender.constructor())
         .addEqualityGroup(Prepender.constructor(String.class, int.class))
         .addEqualityGroup(Prepender.method("privateMethod"), Prepender.method("privateMethod"))
@@ -562,7 +742,7 @@
     }
 
     // just for testing
-    private <A> Prepender() {
+    private <T> Prepender() {
       this(null, 0);
     }
 
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
index 9b3f0f8..557fc0b 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractExecutionThreadServiceTest.java
@@ -68,6 +68,7 @@
         thrownByExecutionThread);
   }
 
+
   public void testServiceStartStop() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
     assertFalse(service.startUpCalled);
@@ -84,6 +85,7 @@
     executionThread.join();
   }
 
+
   public void testServiceStopIdempotence() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
 
@@ -100,6 +102,7 @@
     executionThread.join();
   }
 
+
   public void testServiceExitingOnItsOwn() throws Exception {
     WaitOnRunService service = new WaitOnRunService();
     service.expectedShutdownState = Service.State.RUNNING;
@@ -170,6 +173,7 @@
     }
   }
 
+
   public void testServiceThrowOnStartUp() throws Exception {
     ThrowOnStartUpService service = new ThrowOnStartUpService();
     assertFalse(service.startUpCalled);
@@ -208,6 +212,7 @@
     }
   }
 
+
   public void testServiceThrowOnRun() throws Exception {
     ThrowOnRunService service = new ThrowOnRunService();
 
@@ -224,6 +229,7 @@
     assertEquals(Service.State.FAILED, service.state());
   }
 
+
   public void testServiceThrowOnRunAndThenAgainOnShutDown() throws Exception {
     ThrowOnRunService service = new ThrowOnRunService();
     service.throwOnShutDown = true;
@@ -265,6 +271,7 @@
     }
   }
 
+
   public void testServiceThrowOnShutDown() throws Exception {
     ThrowOnShutDown service = new ThrowOnShutDown();
 
@@ -324,6 +331,7 @@
     protected void run() throws Exception {}
   }
 
+
   public void testStopWhileStarting_runNotCalled() throws Exception {
     final CountDownLatch started = new CountDownLatch(1);
     FakeService service =
@@ -353,6 +361,7 @@
     assertEquals(0, service.shutdownCalled);
   }
 
+
   public void testDefaultService() throws InterruptedException {
     WaitOnRunService service = new WaitOnRunService();
     service.startAsync().awaitRunning();
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureFallbackAtomicHelperTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureFallbackAtomicHelperTest.java
index 77d04ff..208cf24 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureFallbackAtomicHelperTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureFallbackAtomicHelperTest.java
@@ -107,7 +107,7 @@
 
   private void runTestMethod(ClassLoader classLoader) throws Exception {
     Class<?> test = classLoader.loadClass(AbstractFutureTest.class.getName());
-    test.getMethod(getName()).invoke(test.newInstance());
+    test.getMethod(getName()).invoke(test.getDeclaredConstructor().newInstance());
   }
 
   private void checkHelperVersion(ClassLoader classLoader, String expectedHelperClassName)
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureInnocuousThreadTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureInnocuousThreadTest.java
index e88e7e8..e49af23 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureInnocuousThreadTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureInnocuousThreadTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.util.concurrent;
 
+
 import java.net.URLClassLoader;
 import java.security.Permission;
 import java.util.HashMap;
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
index 3c210ce..e55a31e 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractFutureTest.java
@@ -579,7 +579,7 @@
       final AbstractFuture<String> future = new AbstractFuture<String>() {};
       currentFuture.set(future);
       for (Callable<?> task : allTasks) {
-        @SuppressWarnings("unused") // go/futurereturn-lsc
+        @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
         Future<?> possiblyIgnoredError = executor.submit(task);
       }
       awaitUnchecked(barrier);
@@ -798,7 +798,7 @@
       final AbstractFuture<String> future = new AbstractFuture<String>() {};
       currentFuture.set(future);
       for (Callable<?> task : allTasks) {
-        @SuppressWarnings("unused") // go/futurereturn-lsc
+        @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
         Future<?> possiblyIgnoredError = executor.submit(task);
       }
       awaitUnchecked(barrier);
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
index 16a4cd0..a2411ad 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractScheduledServiceTest.java
@@ -21,6 +21,7 @@
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
+import com.google.common.util.concurrent.AbstractScheduledService.Cancellable;
 import com.google.common.util.concurrent.AbstractScheduledService.Scheduler;
 import com.google.common.util.concurrent.Service.State;
 import com.google.common.util.concurrent.testing.TestingExecutors;
@@ -28,6 +29,7 @@
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.Delayed;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
@@ -388,7 +390,7 @@
 
     public void testFixedRateSchedule() {
       Scheduler schedule = Scheduler.newFixedRateSchedule(initialDelay, delay, unit);
-      Future<?> unused =
+      Cancellable unused =
           schedule.schedule(
               null,
               new ScheduledThreadPoolExecutor(1) {
@@ -396,7 +398,7 @@
                 public ScheduledFuture<?> scheduleAtFixedRate(
                     Runnable command, long initialDelay, long period, TimeUnit unit) {
                   assertSingleCallWithCorrectParameters(command, initialDelay, delay, unit);
-                  return null;
+                  return new ThrowingScheduledFuture<>();
                 }
               },
               testRunnable);
@@ -405,7 +407,7 @@
 
     public void testFixedDelaySchedule() {
       Scheduler schedule = newFixedDelaySchedule(initialDelay, delay, unit);
-      Future<?> unused =
+      Cancellable unused =
           schedule.schedule(
               null,
               new ScheduledThreadPoolExecutor(10) {
@@ -413,13 +415,32 @@
                 public ScheduledFuture<?> scheduleWithFixedDelay(
                     Runnable command, long initialDelay, long delay, TimeUnit unit) {
                   assertSingleCallWithCorrectParameters(command, initialDelay, delay, unit);
-                  return null;
+                  return new ThrowingScheduledFuture<>();
                 }
               },
               testRunnable);
       assertTrue(called);
     }
 
+    private static final class ThrowingScheduledFuture<V> extends ForwardingFuture<V>
+        implements ScheduledFuture<V> {
+      @Override
+      protected Future<V> delegate() {
+        throw new UnsupportedOperationException("test should not care about this");
+      }
+
+      @Override
+      public long getDelay(TimeUnit unit) {
+        throw new UnsupportedOperationException("test should not care about this");
+      }
+
+      @Override
+      public int compareTo(Delayed other) {
+        throw new UnsupportedOperationException("test should not care about this");
+      }
+    }
+
+
     public void testFixedDelayScheduleFarFuturePotentiallyOverflowingScheduleIsNeverReached()
         throws Exception {
       TestAbstractScheduledCustomService service =
@@ -440,6 +461,7 @@
       service.awaitTerminated();
     }
 
+
     public void testCustomSchedulerFarFuturePotentiallyOverflowingScheduleIsNeverReached()
         throws Exception {
       TestAbstractScheduledCustomService service =
@@ -475,6 +497,7 @@
       }
     }
 
+
     public void testCustomSchedule_startStop() throws Exception {
       final CyclicBarrier firstBarrier = new CyclicBarrier(2);
       final CyclicBarrier secondBarrier = new CyclicBarrier(2);
@@ -494,7 +517,7 @@
             }
           };
       TestCustomScheduler scheduler = new TestCustomScheduler();
-      Future<?> future = scheduler.schedule(null, Executors.newScheduledThreadPool(10), task);
+      Cancellable future = scheduler.schedule(null, Executors.newScheduledThreadPool(10), task);
       firstBarrier.await();
       assertEquals(1, scheduler.scheduleCounter.get());
       secondBarrier.await();
@@ -505,6 +528,7 @@
       future.cancel(false);
     }
 
+
     public void testCustomSchedulerServiceStop() throws Exception {
       TestAbstractScheduledCustomService service = new TestAbstractScheduledCustomService();
       service.startAsync().awaitRunning();
@@ -518,6 +542,7 @@
       assertEquals(1, service.numIterations.get());
     }
 
+
     public void testCustomScheduler_deadlock() throws InterruptedException, BrokenBarrierException {
       final CyclicBarrier inGetNextSchedule = new CyclicBarrier(2);
       // This will flakily deadlock, so run it multiple times to increase the flake likelihood
@@ -548,6 +573,7 @@
       }
     }
 
+
     public void testBig() throws Exception {
       TestAbstractScheduledCustomService service =
           new TestAbstractScheduledCustomService() {
@@ -607,6 +633,7 @@
       }
     }
 
+
     public void testCustomSchedulerFailure() throws Exception {
       TestFailingCustomScheduledService service = new TestFailingCustomScheduledService();
       service.startAsync().awaitRunning();
diff --git a/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java b/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
index 5f42106..e3c22a8 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AbstractServiceTest.java
@@ -330,6 +330,7 @@
     }
   }
 
+
   public void testAwaitTerminated() throws Exception {
     final NoOpService service = new NoOpService();
     Thread waiter =
@@ -347,6 +348,7 @@
     assertFalse(waiter.isAlive());
   }
 
+
   public void testAwaitTerminated_FailedService() throws Exception {
     final ManualSwitchedService service = new ManualSwitchedService();
     final AtomicReference<Throwable> exception = Atomics.newReference();
@@ -374,6 +376,7 @@
     assertThat(exception.get()).hasCauseThat().isEqualTo(EXCEPTION);
   }
 
+
   public void testThreadedServiceStartAndWaitStopAndWait() throws Throwable {
     ThreadedService service = new ThreadedService();
     RecordingListener listener = RecordingListener.record(service);
@@ -391,6 +394,7 @@
         listener.getStateHistory());
   }
 
+
   public void testThreadedServiceStopIdempotence() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -406,6 +410,7 @@
     throwIfSet(thrownByExecutionThread);
   }
 
+
   public void testThreadedServiceStopIdempotenceAfterWait() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -423,6 +428,7 @@
     throwIfSet(thrownByExecutionThread);
   }
 
+
   public void testThreadedServiceStopIdempotenceDoubleWait() throws Throwable {
     ThreadedService service = new ThreadedService();
 
@@ -655,6 +661,7 @@
     }
   }
 
+
   public void testAddListenerAfterFailureDoesntCauseDeadlock() throws InterruptedException {
     final StartFailingService service = new StartFailingService();
     service.startAsync();
@@ -674,6 +681,7 @@
     assertFalse(thread + " is deadlocked", thread.isAlive());
   }
 
+
   public void testListenerDoesntDeadlockOnStartAndWaitFromRunning() throws Exception {
     final NoOpThreadedService service = new NoOpThreadedService();
     service.addListener(
@@ -688,6 +696,7 @@
     service.stopAsync();
   }
 
+
   public void testListenerDoesntDeadlockOnStopAndWaitFromTerminated() throws Exception {
     final NoOpThreadedService service = new NoOpThreadedService();
     service.addListener(
diff --git a/guava-tests/test/com/google/common/util/concurrent/AggregateFutureStateFallbackAtomicHelperTest.java b/guava-tests/test/com/google/common/util/concurrent/AggregateFutureStateFallbackAtomicHelperTest.java
index 761f7d7..fec9394 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AggregateFutureStateFallbackAtomicHelperTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AggregateFutureStateFallbackAtomicHelperTest.java
@@ -95,7 +95,7 @@
 
   private void runTestMethod(ClassLoader classLoader) throws Exception {
     Class<?> test = classLoader.loadClass(FuturesTest.class.getName());
-    Object testInstance = test.newInstance();
+    Object testInstance = test.getDeclaredConstructor().newInstance();
     test.getMethod("setUp").invoke(testInstance);
     test.getMethod(getName()).invoke(testInstance);
     test.getMethod("tearDown").invoke(testInstance);
diff --git a/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java b/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
index c892842..df9bd8b 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AtomicDoubleTest.java
@@ -13,6 +13,7 @@
 
 package com.google.common.util.concurrent;
 
+
 /** Unit test for {@link AtomicDouble}. */
 public class AtomicDoubleTest extends JSR166TestCase {
 
diff --git a/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java b/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
index d905dcd..4765825 100644
--- a/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/AtomicLongMapBasherTest.java
@@ -47,7 +47,7 @@
 
     ExecutorService threadPool = Executors.newFixedThreadPool(nThreads);
     for (int i = 0; i < nTasks; i++) {
-      @SuppressWarnings("unused") // go/futurereturn-lsc
+      @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
       Future<?> possiblyIgnoredError =
           threadPool.submit(
               new Runnable() {
diff --git a/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
index 58cf5bb..ab0e5f8 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ClosingFutureTest.java
@@ -38,6 +38,7 @@
 import com.google.common.reflect.Reflection;
 import com.google.common.truth.FailureStrategy;
 import com.google.common.truth.StandardSubjectBuilder;
+import com.google.common.util.concurrent.ClosingFuture.AsyncClosingCallable;
 import com.google.common.util.concurrent.ClosingFuture.AsyncClosingFunction;
 import com.google.common.util.concurrent.ClosingFuture.ClosingCallable;
 import com.google.common.util.concurrent.ClosingFuture.ClosingFunction;
@@ -267,6 +268,76 @@
     assertClosed(closeable1, closeable2);
   }
 
+  public void testSubmitAsync() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.submitAsync(
+            new AsyncClosingCallable<TestCloseable>() {
+              @Override
+              public ClosingFuture<TestCloseable> call(DeferredCloser closer) {
+                closer.eventuallyClose(closeable1, closingExecutor);
+                return ClosingFuture.submit(
+                    new ClosingCallable<TestCloseable>() {
+                      @Override
+                      public TestCloseable call(DeferredCloser deferredCloser) throws Exception {
+                        return closeable2;
+                      }
+                    },
+                    directExecutor());
+              }
+            },
+            executor);
+    assertThat(getFinalValue(closingFuture)).isSameInstanceAs(closeable2);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1);
+    assertStillOpen(closeable2);
+  }
+
+  public void testSubmitAsync_cancelledPipeline() throws Exception {
+    ClosingFuture<TestCloseable> closingFuture =
+        ClosingFuture.submitAsync(
+            waiter.waitFor(
+                new AsyncClosingCallable<TestCloseable>() {
+                  @Override
+                  public ClosingFuture<TestCloseable> call(DeferredCloser closer) throws Exception {
+                    awaitUninterruptibly(futureCancelled);
+                    closer.eventuallyClose(closeable1, closingExecutor);
+                    closer.eventuallyClose(closeable2, closingExecutor);
+                    return ClosingFuture.submit(
+                        new ClosingCallable<TestCloseable>() {
+                          @Override
+                          public TestCloseable call(DeferredCloser deferredCloser)
+                              throws Exception {
+                            deferredCloser.eventuallyClose(closeable3, closingExecutor);
+                            return closeable3;
+                          }
+                        },
+                        directExecutor());
+                  }
+                }),
+            executor);
+    waiter.awaitStarted();
+    cancelFinalStepAndWait(closingFuture);
+    waiter.awaitReturned();
+    assertClosed(closeable1, closeable2, closeable3);
+  }
+
+  public void testSubmitAsync_throws() throws Exception {
+    ClosingFuture<Object> closingFuture =
+        ClosingFuture.submitAsync(
+            new AsyncClosingCallable<Object>() {
+              @Override
+              public ClosingFuture<Object> call(DeferredCloser closer) throws Exception {
+                closer.eventuallyClose(closeable1, closingExecutor);
+                closer.eventuallyClose(closeable2, closingExecutor);
+                throw exception;
+              }
+            },
+            executor);
+    assertFinallyFailsWithException(closingFuture);
+    waitUntilClosed(closingFuture);
+    assertClosed(closeable1, closeable2);
+  }
+
   public void testAutoCloseable() throws Exception {
     AutoCloseable autoCloseable = closeable1::close;
     ClosingFuture<String> closingFuture =
@@ -1854,6 +1925,10 @@
       return waitFor(closingCallable, ClosingCallable.class);
     }
 
+    <V> AsyncClosingCallable<V> waitFor(AsyncClosingCallable<V> asyncClosingCallable) {
+      return waitFor(asyncClosingCallable, AsyncClosingCallable.class);
+    }
+
     <T, U> ClosingFunction<T, U> waitFor(ClosingFunction<T, U> closingFunction) {
       return waitFor(closingFunction, ClosingFunction.class);
     }
diff --git a/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java b/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
index 5abe6ce..18e69b1 100644
--- a/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/CycleDetectingLockFactoryTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.util.concurrent;
 
+
 import com.google.common.base.Joiner;
 import com.google.common.util.concurrent.CycleDetectingLockFactory.Policies;
 import com.google.common.util.concurrent.CycleDetectingLockFactory.Policy;
@@ -441,6 +442,7 @@
     lockD.lock();
   }
 
+
   public void testReentrantLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(lockA);
     thread.start();
@@ -452,6 +454,7 @@
     assertTrue(lockA.tryLock());
   }
 
+
   public void testReentrantWriteLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(writeLockA);
     thread.start();
@@ -465,6 +468,7 @@
     assertTrue(readLockA.tryLock());
   }
 
+
   public void testReentrantReadLock_tryLock() throws Exception {
     LockingThread thread = new LockingThread(readLockA);
     thread.start();
diff --git a/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java b/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
index 34678ed..5bd3cf7 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ExecutionListTest.java
@@ -36,6 +36,7 @@
 
   private final ExecutionList list = new ExecutionList();
 
+
   public void testRunOnPopulatedList() throws Exception {
     Executor exec = Executors.newCachedThreadPool();
     CountDownLatch countDownLatch = new CountDownLatch(3);
@@ -66,6 +67,7 @@
     assertEquals(1, runCalled.get());
   }
 
+
   public void testExecute_idempotentConcurrently() throws InterruptedException {
     final CountDownLatch okayToRun = new CountDownLatch(1);
     final AtomicInteger runCalled = new AtomicInteger();
@@ -101,6 +103,7 @@
     assertEquals(1, runCalled.get());
   }
 
+
   public void testAddAfterRun() throws Exception {
     // Run the previous test
     testRunOnPopulatedList();
diff --git a/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java b/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
index 687f226..1c03f5a 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ExecutionSequencerTest.java
@@ -88,6 +88,7 @@
     assertThat(thirdCallable.called).isTrue();
   }
 
+
   public void testCancellationMultipleThreads() throws Exception {
     final BlockingCallable blockingCallable = new BlockingCallable();
     ListenableFuture<Void> unused = serializer.submit(blockingCallable, executor);
@@ -115,6 +116,7 @@
     assertThat(getDone(future2)).isFalse();
   }
 
+
   public void testSecondTaskWaitsForFirstEvenIfCancelled() throws Exception {
     final BlockingCallable blockingCallable = new BlockingCallable();
     ListenableFuture<Void> future1 = serializer.submit(blockingCallable, executor);
diff --git a/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
index ab53f53..cc4751d 100644
--- a/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/FluentFutureTest.java
@@ -132,6 +132,7 @@
     assertThat(f.get()).isEqualTo(2);
   }
 
+
   @GwtIncompatible // withTimeout
   public void testWithTimeout() throws Exception {
     ScheduledExecutorService executor = newScheduledThreadPool(1);
diff --git a/guava-tests/test/com/google/common/util/concurrent/ForwardingObjectTester.java b/guava-tests/test/com/google/common/util/concurrent/ForwardingObjectTester.java
index 021d96d..84b0426 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ForwardingObjectTester.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ForwardingObjectTester.java
@@ -61,7 +61,7 @@
             new Function<Object, T>() {
               @Override
               public T apply(Object delegate) {
-                T mock = mock(forwarderClass, CALLS_REAL_METHODS.get());
+                T mock = mock(forwarderClass, CALLS_REAL_METHODS);
                 try {
                   T stubber = doReturn(delegate).when(mock);
                   DELEGATE_METHOD.invoke(stubber);
diff --git a/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java b/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
index 2ec1736..3bc69bd 100644
--- a/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/FuturesGetCheckedTest.java
@@ -353,6 +353,7 @@
 
   public static final class WillBeUnloadedException extends Exception {}
 
+
   public void testGetChecked_classUnloading() throws Exception {
     WeakReference<?> classUsedByGetChecked = doTestClassUnloading();
     GcFinalization.awaitClear(classUsedByGetChecked);
@@ -380,5 +381,8 @@
    * environment that forces Futures.getChecked to its fallback WeakSetValidator. One awful way of
    * doing so would be to derive a separate test library by using remove_from_jar to strip out
    * ClassValueValidator.
+   *
+   * Fortunately, we get pretty good coverage "by accident": We run all these tests against the
+   * *backport*, where ClassValueValidator is not present.
    */
 }
diff --git a/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java b/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
index 9586a65..0c3a9ae 100644
--- a/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/FuturesTest.java
@@ -3375,11 +3375,13 @@
         : pseudoTimedGetUninterruptibly(future, 2500, MILLISECONDS);
   }
 
+
   @GwtIncompatible // threads
   public void testAllAsList_extensive() throws InterruptedException {
     runExtensiveMergerTest(Merger.allMerger);
   }
 
+
   @GwtIncompatible // threads
   public void testSuccessfulAsList_extensive() throws InterruptedException {
     runExtensiveMergerTest(Merger.successMerger);
diff --git a/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java b/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
index 2499020..d0fcee2 100644
--- a/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/FuturesTransformAsyncTest.java
@@ -131,6 +131,7 @@
     }
   }
 
+
   public void testFutureCancellableBeforeFunctionCompletion() throws Exception {
     // Set the result in a separate thread since this test runs the function
     // (which will block) in the same thread.
diff --git a/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java b/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
index f0727da..4d7a45f 100644
--- a/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/InterruptibleMonitorTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.util.concurrent;
 
+
 /**
  * Tests for {@link Monitor}'s interruptible methods.
  *
diff --git a/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java b/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
index 8f91bcc..afa7eae 100644
--- a/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/InterruptibleTaskTest.java
@@ -17,12 +17,15 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import java.lang.reflect.Method;
 import java.nio.channels.spi.AbstractInterruptibleChannel;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.AbstractOwnableSynchronizer;
 import java.util.concurrent.locks.LockSupport;
 import junit.framework.TestCase;
 
+
 public final class InterruptibleTaskTest extends TestCase {
 
   // Regression test for a deadlock where a task could be stuck busy waiting for the task to
@@ -51,7 +54,10 @@
           }
 
           @Override
-          void afterRanInterruptibly(Void result, Throwable error) {}
+          void afterRanInterruptiblySuccess(Void result) {}
+
+          @Override
+          void afterRanInterruptiblyFailure(Throwable error) {}
         };
     Thread runner = new Thread(task);
     runner.start();
@@ -114,25 +120,38 @@
           }
 
           @Override
-          void afterRanInterruptibly(Void result, Throwable error) {}
+          void afterRanInterruptiblySuccess(Void result) {}
+
+          @Override
+          void afterRanInterruptiblyFailure(Throwable error) {}
         };
     Thread runner = new Thread(task, "runner");
     runner.start();
     isInterruptibleRegistered.await();
     // trigger the interrupt on another thread since it will block
-    new Thread("Interrupter") {
-      @Override
-      public void run() {
-        task.interruptTask();
-      }
-    }.start();
+    Thread interrupter =
+        new Thread("Interrupter") {
+          @Override
+          public void run() {
+            task.interruptTask();
+          }
+        };
+    interrupter.start();
     // this will happen once the interrupt has been set which means that
     // 1. the runner has been woken up
     // 2. the interrupter is stuck in the call the Thread.interrupt()
 
     // after some period of time the runner thread should become blocked on the task because it is
     // waiting for the slow interrupting thread to complete Thread.interrupt
-    awaitBlockedOn(runner, task);
+    awaitBlockedOnInstanceOf(runner, InterruptibleTask.Blocker.class);
+
+    Object blocker = LockSupport.getBlocker(runner);
+    assertThat(blocker).isInstanceOf(AbstractOwnableSynchronizer.class);
+    Method getExclusiveOwnerThread =
+        AbstractOwnableSynchronizer.class.getDeclaredMethod("getExclusiveOwnerThread");
+    getExclusiveOwnerThread.setAccessible(true);
+    Thread owner = (Thread) getExclusiveOwnerThread.invoke(blocker);
+    assertThat(owner).isSameInstanceAs(interrupter);
 
     slowChannel.exitClose.countDown(); // release the interrupter
 
@@ -142,8 +161,9 @@
   }
 
   // waits for the given thread to be blocked on the given object
-  private static void awaitBlockedOn(Thread t, Object blocker) throws InterruptedException {
-    while (!isThreadBlockedOn(t, blocker)) {
+  private static void awaitBlockedOnInstanceOf(Thread t, Class<?> blocker)
+      throws InterruptedException {
+    while (!isThreadBlockedOnInstanceOf(t, blocker)) {
       if (t.getState() == Thread.State.TERMINATED) {
         throw new RuntimeException("Thread " + t + " exited unexpectedly");
       }
@@ -151,8 +171,8 @@
     }
   }
 
-  private static boolean isThreadBlockedOn(Thread t, Object blocker) {
-    return t.getState() == Thread.State.WAITING && LockSupport.getBlocker(t) == blocker;
+  private static boolean isThreadBlockedOnInstanceOf(Thread t, Class<?> blocker) {
+    return t.getState() == Thread.State.WAITING && blocker.isInstance(LockSupport.getBlocker(t));
   }
 
   static final class SlowChannel extends AbstractInterruptibleChannel {
diff --git a/guava-tests/test/com/google/common/util/concurrent/JSR166TestCase.java b/guava-tests/test/com/google/common/util/concurrent/JSR166TestCase.java
index 8df7ce9..1825c08 100644
--- a/guava-tests/test/com/google/common/util/concurrent/JSR166TestCase.java
+++ b/guava-tests/test/com/google/common/util/concurrent/JSR166TestCase.java
@@ -682,7 +682,7 @@
 
   /**
    * Returns the number of milliseconds since time given by startNanoTime, which must have been
-   * previously returned from a call to {@link System.nanoTime()}.
+   * previously returned from a call to {@link System#nanoTime()}.
    */
   long millisElapsedSince(long startNanoTime) {
     return NANOSECONDS.toMillis(System.nanoTime() - startNanoTime);
diff --git a/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java b/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
index 741ff45..3bb819a 100644
--- a/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/JdkFutureAdaptersTest.java
@@ -100,6 +100,7 @@
     assertTrue(listenableFuture.isDone());
   }
 
+
   public void testListenInPoolThreadUsesGivenExecutor() throws Exception {
     ExecutorService executorService =
         newCachedThreadPool(new ThreadFactoryBuilder().setDaemon(true).build());
@@ -124,6 +125,7 @@
     assertTrue(listenableFuture.isDone());
   }
 
+
   public void testListenInPoolThreadCustomExecutorInterrupted() throws Exception {
     final CountDownLatch submitSuccessful = new CountDownLatch(1);
     ExecutorService executorService =
@@ -233,6 +235,7 @@
     }
   }
 
+
   @SuppressWarnings("IsInstanceIncompatibleType") // intentional.
   public void testListenInPoolThreadRunsListenerAfterRuntimeException() throws Exception {
     RuntimeExceptionThrowingFuture<String> input = new RuntimeExceptionThrowingFuture<>();
diff --git a/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java b/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
index fd51a73..8969a75 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ListenableFutureTaskTest.java
@@ -80,6 +80,7 @@
     super.tearDown();
   }
 
+
   public void testListenerDoesNotRunUntilTaskCompletes() throws Exception {
 
     // Test default state of not started.
@@ -105,6 +106,7 @@
     assertFalse(task.isCancelled());
   }
 
+
   public void testListenerCalledOnException() throws Exception {
     throwException = true;
 
@@ -140,6 +142,7 @@
     assertEquals(1, runLatch.getCount());
   }
 
+
   public void testListenerCalledOnCancelFromRunning() throws Exception {
     exec.execute(task);
     runLatch.await();
diff --git a/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java b/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
index e0eb32e..5fd9b95 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ListenerCallQueueTest.java
@@ -129,6 +129,7 @@
         logHandler.getStoredLogRecords().get(0).getMessage());
   }
 
+
   public void testEnqueueAndDispatch_multithreaded() throws InterruptedException {
     Object listener = new Object();
     ExecutorService service = Executors.newFixedThreadPool(4);
@@ -152,6 +153,7 @@
     }
   }
 
+
   public void testEnqueueAndDispatch_multithreaded_withThrowingRunnable()
       throws InterruptedException {
     Object listener = new Object();
diff --git a/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java b/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
index 08c8f19..fe4e7f5 100644
--- a/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/MoreExecutorsTest.java
@@ -88,6 +88,7 @@
         public void run() {}
       };
 
+
   public void testDirectExecutorServiceServiceInThreadExecution() throws Exception {
     final ListeningExecutorService executor = newDirectExecutorService();
     final ThreadLocal<Integer> threadLocalCount =
@@ -167,6 +168,7 @@
     assertEquals(10, threadLocalCount.get().intValue());
   }
 
+
   public void testDirectExecutorServiceServiceTermination() throws Exception {
     final ExecutorService executor = newDirectExecutorService();
     final CyclicBarrier barrier = new CyclicBarrier(2);
@@ -352,6 +354,7 @@
     verify(delegate).execute(task);
   }
 
+
   public void testListeningDecorator_scheduleSuccess() throws Exception {
     final CountDownLatch completed = new CountDownLatch(1);
     ScheduledThreadPoolExecutor delegate =
@@ -377,6 +380,7 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
+
   public void testListeningDecorator_scheduleFailure() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     ListeningScheduledExecutorService service = listeningDecorator(delegate);
@@ -387,6 +391,7 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
+
   public void testListeningDecorator_schedulePeriodic() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     ListeningScheduledExecutorService service = listeningDecorator(delegate);
@@ -407,6 +412,7 @@
     assertEquals(0, delegate.getQueue().size());
   }
 
+
   public void testListeningDecorator_cancelled() throws Exception {
     ScheduledThreadPoolExecutor delegate = new ScheduledThreadPoolExecutor(1);
     BlockingQueue<?> delegateQueue = delegate.getQueue();
@@ -560,6 +566,7 @@
     }
   }
 
+
   public void testAddDelayedShutdownHook_success() throws InterruptedException {
     TestApplication application = new TestApplication();
     ExecutorService service = mock(ExecutorService.class);
@@ -571,6 +578,7 @@
     shutdownFirst.verify(service).awaitTermination(2, TimeUnit.SECONDS);
   }
 
+
   public void testAddDelayedShutdownHook_interrupted() throws InterruptedException {
     TestApplication application = new TestApplication();
     ExecutorService service = mock(ExecutorService.class);
@@ -580,6 +588,7 @@
     verify(service).shutdown();
   }
 
+
   public void testGetExitingExecutorService_executorSetToUseDaemonThreads() {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor =
@@ -588,6 +597,7 @@
     assertTrue(executor.getThreadFactory().newThread(EMPTY_RUNNABLE).isDaemon());
   }
 
+
   public void testGetExitingExecutorService_executorDelegatesToOriginal() {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor = mock(ThreadPoolExecutor.class);
@@ -597,6 +607,7 @@
     verify(executor).execute(EMPTY_RUNNABLE);
   }
 
+
   public void testGetExitingExecutorService_shutdownHookRegistered() throws InterruptedException {
     TestApplication application = new TestApplication();
     ThreadPoolExecutor executor = mock(ThreadPoolExecutor.class);
@@ -607,6 +618,7 @@
     verify(executor).shutdown();
   }
 
+
   public void testGetExitingScheduledExecutorService_executorSetToUseDaemonThreads() {
     TestApplication application = new TestApplication();
     ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
@@ -614,6 +626,7 @@
     assertTrue(executor.getThreadFactory().newThread(EMPTY_RUNNABLE).isDaemon());
   }
 
+
   public void testGetExitingScheduledExecutorService_executorDelegatesToOriginal() {
     TestApplication application = new TestApplication();
     ScheduledThreadPoolExecutor executor = mock(ScheduledThreadPoolExecutor.class);
@@ -623,6 +636,7 @@
     verify(executor).execute(EMPTY_RUNNABLE);
   }
 
+
   public void testGetScheduledExitingExecutorService_shutdownHookRegistered()
       throws InterruptedException {
     TestApplication application = new TestApplication();
@@ -655,6 +669,7 @@
     assertEquals(oldName, Thread.currentThread().getName());
   }
 
+
   public void testExecutors_nullCheck() throws Exception {
     new ClassSanityTester()
         .setDefault(RateLimiter.class, RateLimiter.create(1.0))
@@ -684,12 +699,14 @@
   /* Half of a 1-second timeout in nanoseconds */
   private static final long HALF_SECOND_NANOS = NANOSECONDS.convert(1L, SECONDS) / 2;
 
+
   public void testShutdownAndAwaitTermination_immediateShutdown() throws Exception {
     ExecutorService service = Executors.newSingleThreadExecutor();
     assertTrue(shutdownAndAwaitTermination(service, 1L, SECONDS));
     assertTrue(service.isTerminated());
   }
 
+
   public void testShutdownAndAwaitTermination_immediateShutdownInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS)).thenReturn(true);
@@ -699,6 +716,7 @@
     verify(service).awaitTermination(HALF_SECOND_NANOS, NANOSECONDS);
   }
 
+
   public void testShutdownAndAwaitTermination_forcedShutDownInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
@@ -711,6 +729,7 @@
     verify(service).shutdownNow();
   }
 
+
   public void testShutdownAndAwaitTermination_nonTerminationInternal() throws Exception {
     ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
@@ -722,6 +741,7 @@
     verify(service).shutdownNow();
   }
 
+
   public void testShutdownAndAwaitTermination_interruptedInternal() throws Exception {
     final ExecutorService service = mock(ExecutorService.class);
     when(service.awaitTermination(HALF_SECOND_NANOS, NANOSECONDS))
diff --git a/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java b/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
index ff9e311..20209e8 100644
--- a/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/SequentialExecutorTest.java
@@ -274,6 +274,7 @@
     assertEquals(1, numCalls.get());
   }
 
+
   public void testTaskThrowsError() throws Exception {
     class MyError extends Error {}
     final CyclicBarrier barrier = new CyclicBarrier(2);
@@ -312,6 +313,7 @@
     }
   }
 
+
   public void testRejectedExecutionThrownWithMultipleCalls() throws Exception {
     final CountDownLatch latch = new CountDownLatch(1);
     final SettableFuture<?> future = SettableFuture.create();
diff --git a/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java b/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
index fbc238e..e8552ed 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ServiceManagerTest.java
@@ -29,6 +29,7 @@
 import com.google.common.testing.TestLogHandler;
 import com.google.common.util.concurrent.Service.State;
 import com.google.common.util.concurrent.ServiceManager.Listener;
+import java.time.Duration;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
@@ -119,19 +120,31 @@
     }
   }
 
+
   public void testServiceStartupTimes() {
     Service a = new NoOpDelayedService(150);
     Service b = new NoOpDelayedService(353);
     ServiceManager serviceManager = new ServiceManager(asList(a, b));
     serviceManager.startAsync().awaitHealthy();
     ImmutableMap<Service, Long> startupTimes = serviceManager.startupTimes();
-    assertEquals(2, startupTimes.size());
-    // TODO(kak): Use assertThat(startupTimes.get(a)).isAtLeast(150);
-    assertTrue(startupTimes.get(a) >= 150);
-    // TODO(kak): Use assertThat(startupTimes.get(b)).isAtLeast(353);
-    assertTrue(startupTimes.get(b) >= 353);
+    assertThat(startupTimes).hasSize(2);
+    assertThat(startupTimes.get(a)).isAtLeast(150);
+    assertThat(startupTimes.get(b)).isAtLeast(353);
   }
 
+
+  public void testServiceStartupDurations() {
+    Service a = new NoOpDelayedService(150);
+    Service b = new NoOpDelayedService(353);
+    ServiceManager serviceManager = new ServiceManager(asList(a, b));
+    serviceManager.startAsync().awaitHealthy();
+    ImmutableMap<Service, Duration> startupTimes = serviceManager.startupDurations();
+    assertThat(startupTimes).hasSize(2);
+    assertThat(startupTimes.get(a)).isAtLeast(Duration.ofMillis(150));
+    assertThat(startupTimes.get(b)).isAtLeast(Duration.ofMillis(353));
+  }
+
+
   public void testServiceStartupTimes_selfStartingServices() {
     // This tests to ensure that:
     // 1. service times are accurate when the service is started by the manager
@@ -157,9 +170,8 @@
     ServiceManager serviceManager = new ServiceManager(asList(a, b));
     serviceManager.startAsync().awaitHealthy();
     ImmutableMap<Service, Long> startupTimes = serviceManager.startupTimes();
-    assertEquals(2, startupTimes.size());
-    // TODO(kak): Use assertThat(startupTimes.get(a)).isAtLeast(150);
-    assertTrue(startupTimes.get(a) >= 150);
+    assertThat(startupTimes).hasSize(2);
+    assertThat(startupTimes.get(a)).isAtLeast(150);
     // Service b startup takes at least 353 millis, but starting the timer is delayed by at least
     // 150 milliseconds. so in a perfect world the timing would be 353-150=203ms, but since either
     // of our sleep calls can be arbitrarily delayed we should just assert that there is a time
@@ -167,6 +179,7 @@
     assertThat(startupTimes.get(b)).isNotNull();
   }
 
+
   public void testServiceStartStop() {
     Service a = new NoOpService();
     Service b = new NoOpService();
@@ -188,6 +201,7 @@
     assertTrue(listener.failedServices.isEmpty());
   }
 
+
   public void testFailStart() throws Exception {
     Service a = new NoOpService();
     Service b = new FailStartService();
@@ -215,6 +229,7 @@
     assertTrue(listener.stoppedCalled);
   }
 
+
   public void testFailRun() throws Exception {
     Service a = new NoOpService();
     Service b = new FailRunService();
@@ -237,6 +252,7 @@
     assertTrue(listener.stoppedCalled);
   }
 
+
   public void testFailStop() throws Exception {
     Service a = new NoOpService();
     Service b = new FailStopService();
@@ -265,6 +281,7 @@
     assertThat(toString).contains("FailStartService");
   }
 
+
   public void testTimeouts() throws Exception {
     Service a = new NoOpDelayedService(50);
     ServiceManager manager = new ServiceManager(asList(a));
diff --git a/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
index 105e8de..9b8b88f 100644
--- a/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/SettableFutureTest.java
@@ -51,16 +51,19 @@
     }
   }
 
+
   public void testSetValue() throws Exception {
     assertTrue(future.set("value"));
     tester.testCompletedFuture("value");
   }
 
+
   public void testSetFailure() throws Exception {
     assertTrue(future.setException(new Exception("failure")));
     tester.testFailedFuture("failure");
   }
 
+
   public void testSetFailureNull() throws Exception {
     try {
       future.setException(null);
@@ -72,6 +75,7 @@
     tester.testFailedFuture("failure");
   }
 
+
   public void testCancel() throws Exception {
     assertTrue(future.cancel(true));
     tester.testCancelledFuture();
diff --git a/guava-tests/test/com/google/common/util/concurrent/StripedTest.java b/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
index 9832c30..fa9d87f 100644
--- a/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/StripedTest.java
@@ -129,6 +129,7 @@
     assertTrue(Striped.lazyWeakLock(256).size() == 256);
   }
 
+
   public void testWeakImplementations() {
     for (Striped<?> striped : weakImplementations()) {
       WeakReference<Object> weakRef = new WeakReference<>(striped.get(new Object()));
@@ -136,6 +137,7 @@
     }
   }
 
+
   public void testWeakReadWrite() {
     Striped<ReadWriteLock> striped = Striped.lazyWeakReadWriteLock(1000);
     Object key = new Object();
@@ -148,6 +150,7 @@
     readLock.unlock();
   }
 
+
   public void testStrongImplementations() {
     for (Striped<?> striped : strongImplementations()) {
       WeakReference<Object> weakRef = new WeakReference<>(striped.get(new Object()));
diff --git a/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java b/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
index a3a7b8e..7684b96 100644
--- a/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/ThreadFactoryBuilderTest.java
@@ -56,6 +56,7 @@
     builder = new ThreadFactoryBuilder();
   }
 
+
   public void testThreadFactoryBuilder_defaults() throws InterruptedException {
     ThreadFactory threadFactory = builder.build();
     Thread thread = threadFactory.newThread(monitoredRunnable);
@@ -92,6 +93,7 @@
     assertThat(thread.getName()).matches("^pool-\\d+-thread-" + threadId + "$");
   }
 
+
   public void testNameFormatWithPercentS_custom() {
     String format = "super-duper-thread-%s";
     ThreadFactory factory = builder.setNameFormat(format).build();
@@ -100,6 +102,7 @@
     }
   }
 
+
   public void testNameFormatWithPercentD_custom() {
     String format = "super-duper-thread-%d";
     ThreadFactory factory = builder.setNameFormat(format).build();
@@ -108,18 +111,21 @@
     }
   }
 
+
   public void testDaemon_false() {
     ThreadFactory factory = builder.setDaemon(false).build();
     Thread thread = factory.newThread(monitoredRunnable);
     assertFalse(thread.isDaemon());
   }
 
+
   public void testDaemon_true() {
     ThreadFactory factory = builder.setDaemon(true).build();
     Thread thread = factory.newThread(monitoredRunnable);
     assertTrue(thread.isDaemon());
   }
 
+
   public void testPriority_custom() {
     for (int i = Thread.MIN_PRIORITY; i <= Thread.MAX_PRIORITY; i++) {
       ThreadFactory factory = builder.setPriority(i).build();
@@ -144,6 +150,7 @@
     }
   }
 
+
   public void testUncaughtExceptionHandler_custom() {
     assertEquals(
         UNCAUGHT_EXCEPTION_HANDLER,
@@ -154,6 +161,7 @@
             .getUncaughtExceptionHandler());
   }
 
+
   public void testBuildMutateBuild() {
     ThreadFactory factory1 = builder.setPriority(1).build();
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
@@ -169,6 +177,7 @@
     unused = builder.build(); // this is *also* allowed
   }
 
+
   public void testBuildMutate() {
     ThreadFactory factory1 = builder.setPriority(1).build();
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
@@ -177,6 +186,7 @@
     assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
   }
 
+
   public void testThreadFactory() throws InterruptedException {
     final String THREAD_NAME = "ludicrous speed";
     final int THREAD_PRIORITY = 1;
diff --git a/guava-tests/test/com/google/common/util/concurrent/TrustedInputFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/TrustedInputFutureTest.java
index d452f96..1f2ecca 100644
--- a/guava-tests/test/com/google/common/util/concurrent/TrustedInputFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/TrustedInputFutureTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.util.concurrent;
 
+
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.util.concurrent.AbstractFuture.TrustedFuture;
 
diff --git a/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
index 47507cd..0d24266 100644
--- a/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/UninterruptibleFutureTest.java
@@ -116,6 +116,7 @@
     assertTrue(sleeper.completed);
   }
 
+
   public void testMakeUninterruptible_timeoutPreservedThroughInterruption()
       throws ExecutionException {
 
@@ -154,26 +155,32 @@
     }
   }
 
+
   public void testMakeUninterruptible_untimed_uninterrupted() throws Exception {
     runUntimedInterruptsTest(0);
   }
 
+
   public void testMakeUninterruptible_untimed_interrupted() throws Exception {
     runUntimedInterruptsTest(1);
   }
 
+
   public void testMakeUninterruptible_untimed_multiplyInterrupted() throws Exception {
     runUntimedInterruptsTest(38);
   }
 
+
   public void testMakeUninterruptible_timed_uninterrupted() throws Exception {
     runTimedInterruptsTest(0);
   }
 
+
   public void testMakeUninterruptible_timed_interrupted() throws Exception {
     runTimedInterruptsTest(1);
   }
 
+
   public void testMakeUninterruptible_timed_multiplyInterrupted() throws Exception {
     runTimedInterruptsTest(38);
   }
@@ -228,6 +235,7 @@
     }
   }
 
+
   public void testMakeUninterruptible_timedGetZeroTimeoutAttempted()
       throws TimeoutException, ExecutionException {
     SettableFuture<String> future = SettableFuture.create();
@@ -240,6 +248,7 @@
     assertEquals(RESULT, getUninterruptibly(future, 0, SECONDS));
   }
 
+
   public void testMakeUninterruptible_timedGetNegativeTimeoutAttempted()
       throws TimeoutException, ExecutionException {
     SettableFuture<String> future = SettableFuture.create();
diff --git a/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java b/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
index 30ce22d..59bf808 100644
--- a/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/UninterruptibleMonitorTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.util.concurrent;
 
+
 /**
  * Tests for {@link Monitor}'s uninterruptible methods.
  *
diff --git a/guava-tests/test/com/google/common/util/concurrent/UntrustedInputFutureTest.java b/guava-tests/test/com/google/common/util/concurrent/UntrustedInputFutureTest.java
index 2d071b5..a6241d2 100644
--- a/guava-tests/test/com/google/common/util/concurrent/UntrustedInputFutureTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/UntrustedInputFutureTest.java
@@ -16,6 +16,7 @@
 
 package com.google.common.util.concurrent;
 
+
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.util.concurrent.AbstractFuture.TrustedFuture;
 
diff --git a/guava-tests/test/com/google/common/util/concurrent/WrappingScheduledExecutorServiceTest.java b/guava-tests/test/com/google/common/util/concurrent/WrappingScheduledExecutorServiceTest.java
index 6a8adfe..8d0183e 100644
--- a/guava-tests/test/com/google/common/util/concurrent/WrappingScheduledExecutorServiceTest.java
+++ b/guava-tests/test/com/google/common/util/concurrent/WrappingScheduledExecutorServiceTest.java
@@ -46,11 +46,11 @@
     MockExecutor mock = new MockExecutor();
     TestExecutor testExecutor = new TestExecutor(mock);
 
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError = testExecutor.schedule(DO_NOTHING, 10, TimeUnit.MINUTES);
     mock.assertLastMethodCalled("scheduleRunnable", 10, TimeUnit.MINUTES);
 
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError1 =
         testExecutor.schedule(Executors.callable(DO_NOTHING), 5, TimeUnit.SECONDS);
     mock.assertLastMethodCalled("scheduleCallable", 5, TimeUnit.SECONDS);
@@ -59,12 +59,12 @@
   public void testSchedule_repeating() {
     MockExecutor mock = new MockExecutor();
     TestExecutor testExecutor = new TestExecutor(mock);
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError =
         testExecutor.scheduleWithFixedDelay(DO_NOTHING, 100, 10, TimeUnit.MINUTES);
     mock.assertLastMethodCalled("scheduleWithFixedDelay", 100, 10, TimeUnit.MINUTES);
 
-    @SuppressWarnings("unused") // go/futurereturn-lsc
+    @SuppressWarnings("unused") // https://errorprone.info/bugpattern/FutureReturnValueIgnored
     Future<?> possiblyIgnoredError1 =
         testExecutor.scheduleAtFixedRate(DO_NOTHING, 3, 7, TimeUnit.SECONDS);
     mock.assertLastMethodCalled("scheduleAtFixedRate", 3, 7, TimeUnit.SECONDS);
diff --git a/guava/pom.xml b/guava/pom.xml
index 20e9af8..4a4f9eb 100644
--- a/guava/pom.xml
+++ b/guava/pom.xml
@@ -5,14 +5,15 @@
   <parent>
     <groupId>com.google.guava</groupId>
     <artifactId>guava-parent</artifactId>
-    <version>30.0-jre</version>
+    <version>31.0.1-jre</version>
   </parent>
   <artifactId>guava</artifactId>
   <packaging>bundle</packaging>
   <name>Guava: Google Core Libraries for Java</name>
+  <url>https://github.com/google/guava</url>
   <description>
     Guava is a suite of core and expanded libraries that include
-    utility classes, google's collections, io classes, and much
+    utility classes, Google's collections, I/O classes, and
     much more.
   </description>
   <dependencies>
diff --git a/guava/src/com/google/common/annotations/Beta.java b/guava/src/com/google/common/annotations/Beta.java
index 47dafe8..f71dc94 100644
--- a/guava/src/com/google/common/annotations/Beta.java
+++ b/guava/src/com/google/common/annotations/Beta.java
@@ -31,7 +31,6 @@
  * work during upgrades. However it is generally inadvisable for <i>libraries</i> (which get
  * included on users' CLASSPATHs, outside the library developers' control) to do so.
  *
- *
  * @author Kevin Bourrillion
  */
 @Retention(RetentionPolicy.CLASS)
diff --git a/guava/src/com/google/common/annotations/GwtCompatible.java b/guava/src/com/google/common/annotations/GwtCompatible.java
index 1391728..4bf6efb 100644
--- a/guava/src/com/google/common/annotations/GwtCompatible.java
+++ b/guava/src/com/google/common/annotations/GwtCompatible.java
@@ -54,7 +54,6 @@
  *
  * <p>Note that a {@code GwtCompatible} type may have some {@link GwtIncompatible} methods.
  *
- *
  * @author Charles Fry
  * @author Hayward Chan
  */
diff --git a/guava/src/com/google/common/base/Absent.java b/guava/src/com/google/common/base/Absent.java
index 4223b39..f96136b 100644
--- a/guava/src/com/google/common/base/Absent.java
+++ b/guava/src/com/google/common/base/Absent.java
@@ -19,10 +19,11 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Collections;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /** Implementation of an {@link Optional} not containing a reference. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class Absent<T> extends Optional<T> {
   static final Absent<Object> INSTANCE = new Absent<>();
 
@@ -61,7 +62,8 @@
   }
 
   @Override
-  public @Nullable T orNull() {
+  @CheckForNull
+  public T orNull() {
     return null;
   }
 
@@ -77,7 +79,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this;
   }
 
diff --git a/guava/src/com/google/common/base/AbstractIterator.java b/guava/src/com/google/common/base/AbstractIterator.java
index 57d8167..bb0a1d3 100644
--- a/guava/src/com/google/common/base/AbstractIterator.java
+++ b/guava/src/com/google/common/base/AbstractIterator.java
@@ -14,12 +14,14 @@
 
 package com.google.common.base;
 
+import static com.google.common.base.NullnessCasts.uncheckedCastNullableTToT;
 import static com.google.common.base.Preconditions.checkState;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -27,7 +29,8 @@
  * reasons).
  */
 @GwtCompatible
-abstract class AbstractIterator<T> implements Iterator<T> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractIterator<T extends @Nullable Object> implements Iterator<T> {
   private State state = State.NOT_READY;
 
   protected AbstractIterator() {}
@@ -39,12 +42,14 @@
     FAILED,
   }
 
-  private @Nullable T next;
+  @CheckForNull private T next;
 
+  @CheckForNull
   protected abstract T computeNext();
 
   @CanIgnoreReturnValue
-  protected final @Nullable T endOfData() {
+  @CheckForNull
+  protected final T endOfData() {
     state = State.DONE;
     return null;
   }
@@ -73,12 +78,14 @@
   }
 
   @Override
+  @ParametricNullness
   public final T next() {
     if (!hasNext()) {
       throw new NoSuchElementException();
     }
     state = State.NOT_READY;
-    T result = next;
+    // Safe because hasNext() ensures that tryToComputeNext() has put a T into `next`.
+    T result = uncheckedCastNullableTToT(next);
     next = null;
     return result;
   }
diff --git a/guava/src/com/google/common/base/Ascii.java b/guava/src/com/google/common/base/Ascii.java
index 0a8ec50..0c651bb 100644
--- a/guava/src/com/google/common/base/Ascii.java
+++ b/guava/src/com/google/common/base/Ascii.java
@@ -37,6 +37,7 @@
  * @since 7.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Ascii {
 
   private Ascii() {}
@@ -439,7 +440,7 @@
   }
 
   /**
-   * If the argument is an {@linkplain #isUpperCase(char) uppercase ASCII character} returns the
+   * If the argument is an {@linkplain #isUpperCase(char) uppercase ASCII character}, returns the
    * lowercase equivalent. Otherwise returns the argument.
    */
   public static char toLowerCase(char c) {
@@ -487,7 +488,7 @@
   }
 
   /**
-   * If the argument is a {@linkplain #isLowerCase(char) lowercase ASCII character} returns the
+   * If the argument is a {@linkplain #isLowerCase(char) lowercase ASCII character}, returns the
    * uppercase equivalent. Otherwise returns the argument.
    */
   public static char toUpperCase(char c) {
@@ -542,7 +543,6 @@
    *   <li>it is safe to use non-ASCII characters in the truncation indicator
    * </ul>
    *
-   *
    * @throws IllegalArgumentException if {@code maxLength} is less than the length of {@code
    *     truncationIndicator}
    * @since 16.0
diff --git a/guava/src/com/google/common/base/CaseFormat.java b/guava/src/com/google/common/base/CaseFormat.java
index 188d0d0..7b393eb 100644
--- a/guava/src/com/google/common/base/CaseFormat.java
+++ b/guava/src/com/google/common/base/CaseFormat.java
@@ -15,10 +15,11 @@
 package com.google.common.base;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Utility class for converting between various ASCII case formats. Behavior is undefined for
@@ -28,6 +29,7 @@
  * @since 1.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public enum CaseFormat {
   /** Hyphenated variable naming convention, e.g., "lower-hyphen". */
   LOWER_HYPHEN(CharMatcher.is('-'), "-") {
@@ -138,14 +140,14 @@
         out = new StringBuilder(s.length() + 4 * format.wordSeparator.length());
         out.append(format.normalizeFirstWord(s.substring(i, j)));
       } else {
-        out.append(format.normalizeWord(s.substring(i, j)));
+        requireNonNull(out).append(format.normalizeWord(s.substring(i, j)));
       }
       out.append(format.wordSeparator);
       i = j + wordSeparator.length();
     }
     return (i == 0)
         ? format.normalizeFirstWord(s)
-        : out.append(format.normalizeWord(s.substring(i))).toString();
+        : requireNonNull(out).append(format.normalizeWord(s.substring(i))).toString();
   }
 
   /**
@@ -179,7 +181,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof StringConverter) {
         StringConverter that = (StringConverter) object;
         return sourceFormat.equals(that.sourceFormat) && targetFormat.equals(that.targetFormat);
diff --git a/guava/src/com/google/common/base/CharMatcher.java b/guava/src/com/google/common/base/CharMatcher.java
index 0291086..e052f80 100644
--- a/guava/src/com/google/common/base/CharMatcher.java
+++ b/guava/src/com/google/common/base/CharMatcher.java
@@ -61,6 +61,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public abstract class CharMatcher implements Predicate<Character> {
   /*
    *           N777777777NO
diff --git a/guava/src/com/google/common/base/Charsets.java b/guava/src/com/google/common/base/Charsets.java
index 2c9563d..7aebea8 100644
--- a/guava/src/com/google/common/base/Charsets.java
+++ b/guava/src/com/google/common/base/Charsets.java
@@ -31,6 +31,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Charsets {
   private Charsets() {}
 
diff --git a/guava/src/com/google/common/base/CommonMatcher.java b/guava/src/com/google/common/base/CommonMatcher.java
index 6d14c6b..d63b46b 100644
--- a/guava/src/com/google/common/base/CommonMatcher.java
+++ b/guava/src/com/google/common/base/CommonMatcher.java
@@ -22,6 +22,7 @@
  * javadoc for details.
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 abstract class CommonMatcher {
   public abstract boolean matches();
 
diff --git a/guava/src/com/google/common/base/CommonPattern.java b/guava/src/com/google/common/base/CommonPattern.java
index 6be5b01..c425d52 100644
--- a/guava/src/com/google/common/base/CommonPattern.java
+++ b/guava/src/com/google/common/base/CommonPattern.java
@@ -22,6 +22,7 @@
  * javadoc for details.
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 abstract class CommonPattern {
   public abstract CommonMatcher matcher(CharSequence t);
 
diff --git a/guava/src/com/google/common/base/Converter.java b/guava/src/com/google/common/base/Converter.java
index a9107bf..208a032 100644
--- a/guava/src/com/google/common/base/Converter.java
+++ b/guava/src/com/google/common/base/Converter.java
@@ -14,6 +14,7 @@
 
 package com.google.common.base;
 
+import static com.google.common.base.NullnessCasts.uncheckedCastNullableTToT;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtCompatible;
@@ -23,7 +24,7 @@
 import com.google.j2objc.annotations.RetainedWith;
 import java.io.Serializable;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A function from {@code A} to {@code B} with an associated <i>reverse</i> function from {@code B}
@@ -55,7 +56,6 @@
  * behavior for all converters; implementations of {@link #doForward} and {@link #doBackward} are
  * guaranteed to never be passed {@code null}, and must never return {@code null}.
  *
- *
  * <h3>Common ways to use</h3>
  *
  * <p>Getting a converter:
@@ -114,11 +114,36 @@
  * @since 16.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
+/*
+ * 1. The type parameter is <T> rather than <T extends @Nullable> so that we can use T in the
+ * doForward and doBackward methods to indicate that the parameter cannot be null. (We also take
+ * advantage of that for convertAll, as discussed on that method.)
+ *
+ * 2. The supertype of this class could be `Function<@Nullable A, @Nullable B>`, since
+ * Converter.apply (like Converter.convert) is capable of accepting null inputs. However, a
+ * supertype of `Function<A, B>` turns out to be massively more useful to callers in practice: They
+ * want their output to be non-null in operations like `stream.map(myConverter)`, and we can
+ * guarantee that as long as we also require the input type to be non-null[*] (which is a
+ * requirement that existing callers already fulfill).
+ *
+ * Disclaimer: Part of the reason that callers are so well adapted to `Function<A, B>` may be that
+ * that is how the signature looked even prior to this comment! So naturally any change can break
+ * existing users, but it can't *fix* existing users because any users who needed
+ * `Function<@Nullable A, @Nullable B>` already had to find a workaround. Still, there is a *ton* of
+ * fallout from trying to switch. I would be shocked if the switch would offer benefits to anywhere
+ * near enough users to justify the costs.
+ *
+ * Fortunately, if anyone does want to use a Converter as a `Function<@Nullable A, @Nullable B>`,
+ * it's easy to get one: `converter::convert`.
+ *
+ * [*] In annotating this class, we're ignoring LegacyConverter.
+ */
 public abstract class Converter<A, B> implements Function<A, B> {
   private final boolean handleNullAutomatically;
 
   // We lazily cache the reverse view to avoid allocating on every call to reverse().
-  @LazyInit @RetainedWith private transient @Nullable Converter<B, A> reverse;
+  @LazyInit @RetainedWith @CheckForNull private transient Converter<B, A> reverse;
 
   /** Constructor for use by subclasses. */
   protected Converter() {
@@ -165,30 +190,67 @@
    * @return the converted value; is null <i>if and only if</i> {@code a} is null
    */
   @CanIgnoreReturnValue
-  public final @Nullable B convert(@Nullable A a) {
+  @CheckForNull
+  public final B convert(@CheckForNull A a) {
     return correctedDoForward(a);
   }
 
-  @Nullable
-  B correctedDoForward(@Nullable A a) {
+  @CheckForNull
+  B correctedDoForward(@CheckForNull A a) {
     if (handleNullAutomatically) {
       // TODO(kevinb): we shouldn't be checking for a null result at runtime. Assert?
       return a == null ? null : checkNotNull(doForward(a));
     } else {
-      return doForward(a);
+      return unsafeDoForward(a);
     }
   }
 
-  @Nullable
-  A correctedDoBackward(@Nullable B b) {
+  @CheckForNull
+  A correctedDoBackward(@CheckForNull B b) {
     if (handleNullAutomatically) {
       // TODO(kevinb): we shouldn't be checking for a null result at runtime. Assert?
       return b == null ? null : checkNotNull(doBackward(b));
     } else {
-      return doBackward(b);
+      return unsafeDoBackward(b);
     }
   }
 
+  /*
+   * LegacyConverter violates the contract of Converter by allowing its doForward and doBackward
+   * methods to accept null. We could avoid having unchecked casts in Converter.java itself if we
+   * could perform a cast to LegacyConverter, but we can't because it's an internal-only class.
+   *
+   * TODO(cpovirk): So make it part of the open-source build, albeit package-private there?
+   *
+   * So we use uncheckedCastNullableTToT here. This is a weird usage of that method: The method is
+   * documented as being for use with type parameters that have parametric nullness. But Converter's
+   * type parameters do not. Still, we use it here so that we can suppress a warning at a smaller
+   * level than the whole method but without performing a runtime null check. That way, we can still
+   * pass null inputs to LegacyConverter, and it can violate the contract of Converter.
+   *
+   * TODO(cpovirk): Could this be simplified if we modified implementations of LegacyConverter to
+   * override methods (probably called "unsafeDoForward" and "unsafeDoBackward") with the same
+   * signatures as the methods below, rather than overriding the same doForward and doBackward
+   * methods as implementations of normal converters do?
+   *
+   * But no matter what we do, it's worth remembering that the resulting code is going to be unsound
+   * in the presence of LegacyConverter, at least in the case of users who view the converter as a
+   * Function<A, B> or who call convertAll (and for any checkers that apply @PolyNull-like semantics
+   * to Converter.convert). So maybe we don't want to think too hard about how to prevent our
+   * checkers from issuing errors related to LegacyConverter, since it turns out that
+   * LegacyConverter does violate the assumptions we make elsewhere.
+   */
+
+  @CheckForNull
+  private B unsafeDoForward(@CheckForNull A a) {
+    return doForward(uncheckedCastNullableTToT(a));
+  }
+
+  @CheckForNull
+  private A unsafeDoBackward(@CheckForNull B b) {
+    return doBackward(uncheckedCastNullableTToT(b));
+  }
+
   /**
    * Returns an iterable that applies {@code convert} to each element of {@code fromIterable}. The
    * conversion is done lazily.
@@ -198,6 +260,16 @@
    * element.
    */
   @CanIgnoreReturnValue
+  /*
+   * Just as Converter could implement `Function<@Nullable A, @Nullable B>` instead of `Function<A,
+   * B>`, convertAll could accept and return iterables with nullable element types. In both cases,
+   * we've chosen to instead use a signature that benefits existing users -- and is still safe.
+   *
+   * For convertAll, I haven't looked as closely at *how* much existing users benefit, so we should
+   * keep an eye out for problems that new users encounter. Note also that convertAll could support
+   * both use cases by using @PolyNull. (By contrast, we can't use @PolyNull for our superinterface
+   * (`implements Function<@PolyNull A, @PolyNull B>`), at least as far as I know.)
+   */
   public Iterable<B> convertAll(final Iterable<? extends A> fromIterable) {
     checkNotNull(fromIterable, "fromIterable");
     return new Iterable<B>() {
@@ -212,6 +284,8 @@
           }
 
           @Override
+          @SuppressWarnings("nullness") // See code comments on convertAll and Converter.apply.
+          @CheckForNull
           public B next() {
             return convert(fromIterator.next());
           }
@@ -265,14 +339,14 @@
     }
 
     @Override
-    @Nullable
-    A correctedDoForward(@Nullable B b) {
+    @CheckForNull
+    A correctedDoForward(@CheckForNull B b) {
       return original.correctedDoBackward(b);
     }
 
     @Override
-    @Nullable
-    B correctedDoBackward(@Nullable A a) {
+    @CheckForNull
+    B correctedDoBackward(@CheckForNull A a) {
       return original.correctedDoForward(a);
     }
 
@@ -282,7 +356,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof ReverseConverter) {
         ReverseConverter<?, ?> that = (ReverseConverter<?, ?>) object;
         return this.original.equals(that.original);
@@ -347,19 +421,19 @@
     }
 
     @Override
-    @Nullable
-    C correctedDoForward(@Nullable A a) {
+    @CheckForNull
+    C correctedDoForward(@CheckForNull A a) {
       return second.correctedDoForward(first.correctedDoForward(a));
     }
 
     @Override
-    @Nullable
-    A correctedDoBackward(@Nullable C c) {
+    @CheckForNull
+    A correctedDoBackward(@CheckForNull C c) {
       return first.correctedDoBackward(second.correctedDoBackward(c));
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof ConverterComposition) {
         ConverterComposition<?, ?, ?> that = (ConverterComposition<?, ?, ?>) object;
         return this.first.equals(that.first) && this.second.equals(that.second);
@@ -386,7 +460,39 @@
   @Deprecated
   @Override
   @CanIgnoreReturnValue
-  public final @Nullable B apply(@Nullable A a) {
+  /*
+   * Even though we implement `Function<A, B>` instead of `Function<@Nullable A, @Nullable B>` (as
+   * discussed in a code comment at the top of the class), we declare our override of Function.apply
+   * to accept and return null. This requires a suppression, but it's safe:
+   *
+   * - Callers who use Converter as a Function<A, B> will neither pass null nor have it returned to
+   *   them. (Or, if they're not using nullness checking, they might be able to pass null and thus
+   *   have null returned to them. But our signature isn't making their existing nullness type error
+   *   any worse.)
+   * - In the relatively unlikely event that anyone calls Converter.apply directly, that caller is
+   *   allowed to pass null but is also forced to deal with a potentially null return.
+   * - Perhaps more important than actual *callers* of this method are various tools that look at
+   *   bytecode. Notably, NullPointerTester expects a method to throw NPE when passed null unless it
+   *   is annotated in a way that identifies its parameter type as potentially including null. (And
+   *   this method does not throw NPE -- nor do we want to enact a dangerous change to make it begin
+   *   doing so.) We can even imagine tools that rewrite bytecode to insert null checks before and
+   *   after calling methods with allegedly non-nullable parameters[*]. If we didn't annotate the
+   *   parameter and return type here, then anyone who used such a tool (and managed to pass null to
+   *   this method, presumably because that user doesn't run a normal nullness checker) could see
+   *   NullPointerException.
+   *
+   * [*] Granted, such tools could conceivably be smart enough to recognize that the apply() method
+   * on a a Function<Foo, Bar> should never allow null inputs and never produce null outputs even if
+   * this specific subclass claims otherwise. Such tools might still produce NPE for calls to this
+   * method. And that is one reason that we should be nervous about "lying" by extending Function<A,
+   * B> in the first place. But for now, we're giving it a try, since extending Function<@Nullable
+   * A, @Nullable B> will cause issues *today*, whereas extending Function<A, B> causes problems in
+   * various hypothetical futures. (Plus, a tool that were that smart would likely already introduce
+   * problems with LegacyConverter.)
+   */
+  @SuppressWarnings("nullness")
+  @CheckForNull
+  public final B apply(@CheckForNull A a) {
     return convert(a);
   }
 
@@ -402,7 +508,7 @@
    * interchangeable.
    */
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return super.equals(object);
   }
 
@@ -451,7 +557,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof FunctionBasedConverter) {
         FunctionBasedConverter<?, ?> that = (FunctionBasedConverter<?, ?>) object;
         return this.forwardFunction.equals(that.forwardFunction)
diff --git a/guava/src/com/google/common/base/Defaults.java b/guava/src/com/google/common/base/Defaults.java
index 92958c1..5d12343 100644
--- a/guava/src/com/google/common/base/Defaults.java
+++ b/guava/src/com/google/common/base/Defaults.java
@@ -17,7 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides default values for all Java types, as defined by the JLS.
@@ -26,11 +26,12 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Defaults {
   private Defaults() {}
 
-  private static final Double DOUBLE_DEFAULT = Double.valueOf(0d);
-  private static final Float FLOAT_DEFAULT = Float.valueOf(0f);
+  private static final Double DOUBLE_DEFAULT = 0d;
+  private static final Float FLOAT_DEFAULT = 0f;
 
   /**
    * Returns the default value of {@code type} as defined by JLS --- {@code 0} for numbers, {@code
@@ -38,26 +39,28 @@
    * {@code void}, {@code null} is returned.
    */
   @SuppressWarnings("unchecked")
-  public static <T> @Nullable T defaultValue(Class<T> type) {
+  @CheckForNull
+  public static <T> T defaultValue(Class<T> type) {
     checkNotNull(type);
-    if (type == boolean.class) {
-      return (T) Boolean.FALSE;
-    } else if (type == char.class) {
-      return (T) Character.valueOf('\0');
-    } else if (type == byte.class) {
-      return (T) Byte.valueOf((byte) 0);
-    } else if (type == short.class) {
-      return (T) Short.valueOf((short) 0);
-    } else if (type == int.class) {
-      return (T) Integer.valueOf(0);
-    } else if (type == long.class) {
-      return (T) Long.valueOf(0L);
-    } else if (type == float.class) {
-      return (T) FLOAT_DEFAULT;
-    } else if (type == double.class) {
-      return (T) DOUBLE_DEFAULT;
-    } else {
-      return null;
+    if (type.isPrimitive()) {
+      if (type == boolean.class) {
+        return (T) Boolean.FALSE;
+      } else if (type == char.class) {
+        return (T) Character.valueOf('\0');
+      } else if (type == byte.class) {
+        return (T) Byte.valueOf((byte) 0);
+      } else if (type == short.class) {
+        return (T) Short.valueOf((short) 0);
+      } else if (type == int.class) {
+        return (T) Integer.valueOf(0);
+      } else if (type == long.class) {
+        return (T) Long.valueOf(0L);
+      } else if (type == float.class) {
+        return (T) FLOAT_DEFAULT;
+      } else if (type == double.class) {
+        return (T) DOUBLE_DEFAULT;
+      }
     }
+    return null;
   }
 }
diff --git a/guava/src/com/google/common/base/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/base/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..890e3a3
--- /dev/null
+++ b/guava/src/com/google/common/base/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.base;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/base/Enums.java b/guava/src/com/google/common/base/Enums.java
index 2a1b429..449b7e3 100644
--- a/guava/src/com/google/common/base/Enums.java
+++ b/guava/src/com/google/common/base/Enums.java
@@ -25,7 +25,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.WeakHashMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Utility methods for working with {@link Enum} instances.
@@ -34,6 +34,7 @@
  * @since 9.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Enums {
 
   private Enums() {}
@@ -128,7 +129,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof StringConverter) {
         StringConverter<?> that = (StringConverter<?>) object;
         return this.enumClass.equals(that.enumClass);
diff --git a/guava/src/com/google/common/base/Equivalence.java b/guava/src/com/google/common/base/Equivalence.java
index b4ac005..fbcd212 100644
--- a/guava/src/com/google/common/base/Equivalence.java
+++ b/guava/src/com/google/common/base/Equivalence.java
@@ -20,6 +20,7 @@
 import com.google.errorprone.annotations.ForOverride;
 import java.io.Serializable;
 import java.util.function.BiPredicate;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -34,7 +35,12 @@
  *     source-compatible</a> since 4.0)
  */
 @GwtCompatible
-public abstract class Equivalence<T> implements BiPredicate<T, T> {
+@ElementTypesAreNonnullByDefault
+/*
+ * The type parameter is <T> rather than <T extends @Nullable> so that we can use T in the
+ * doEquivalent and doHash methods to indicate that the parameter cannot be null.
+ */
+public abstract class Equivalence<T> implements BiPredicate<@Nullable T, @Nullable T> {
   /** Constructor for use by subclasses. */
   protected Equivalence() {}
 
@@ -55,7 +61,7 @@
    * <p>Note that all calls to {@code equivalent(x, y)} are expected to return the same result as
    * long as neither {@code x} nor {@code y} is modified.
    */
-  public final boolean equivalent(@Nullable T a, @Nullable T b) {
+  public final boolean equivalent(@CheckForNull T a, @CheckForNull T b) {
     if (a == b) {
       return true;
     }
@@ -72,7 +78,7 @@
    */
   @Deprecated
   @Override
-  public final boolean test(@Nullable T t, @Nullable T u) {
+  public final boolean test(@CheckForNull T t, @CheckForNull T u) {
     return equivalent(t, u);
   }
 
@@ -105,7 +111,7 @@
    *   <li>{@code hash(null)} is {@code 0}.
    * </ul>
    */
-  public final int hash(@Nullable T t) {
+  public final int hash(@CheckForNull T t) {
     if (t == null) {
       return 0;
     }
@@ -147,7 +153,7 @@
    *
    * @since 10.0
    */
-  public final <F> Equivalence<F> onResultOf(Function<F, ? extends T> function) {
+  public final <F> Equivalence<F> onResultOf(Function<? super F, ? extends @Nullable T> function) {
     return new FunctionalEquivalence<>(function, this);
   }
 
@@ -158,7 +164,7 @@
    *
    * @since 10.0
    */
-  public final <S extends T> Wrapper<S> wrap(@Nullable S reference) {
+  public final <S extends @Nullable T> Wrapper<S> wrap(@ParametricNullness S reference) {
     return new Wrapper<S>(this, reference);
   }
 
@@ -182,17 +188,18 @@
    *
    * @since 10.0
    */
-  public static final class Wrapper<T> implements Serializable {
+  public static final class Wrapper<T extends @Nullable Object> implements Serializable {
     private final Equivalence<? super T> equivalence;
-    private final @Nullable T reference;
+    @ParametricNullness private final T reference;
 
-    private Wrapper(Equivalence<? super T> equivalence, @Nullable T reference) {
+    private Wrapper(Equivalence<? super T> equivalence, @ParametricNullness T reference) {
       this.equivalence = checkNotNull(equivalence);
       this.reference = reference;
     }
 
     /** Returns the (possibly null) reference wrapped by this instance. */
-    public @Nullable T get() {
+    @ParametricNullness
+    public T get() {
       return reference;
     }
 
@@ -202,7 +209,7 @@
      * equivalence.
      */
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj == this) {
         return true;
       }
@@ -252,10 +259,10 @@
    * @since 10.0
    */
   @GwtCompatible(serializable = true)
-  public final <S extends T> Equivalence<Iterable<S>> pairwise() {
+  public final <S extends @Nullable T> Equivalence<Iterable<S>> pairwise() {
     // Ideally, the returned equivalence would support Iterable<? extends T>. However,
     // the need for this is so rare that it's not worth making callers deal with the ugly wildcard.
-    return new PairwiseEquivalence<S>(this);
+    return new PairwiseEquivalence<>(this);
   }
 
   /**
@@ -264,27 +271,28 @@
    *
    * @since 10.0
    */
-  public final Predicate<T> equivalentTo(@Nullable T target) {
+  public final Predicate<@Nullable T> equivalentTo(@CheckForNull T target) {
     return new EquivalentToPredicate<T>(this, target);
   }
 
-  private static final class EquivalentToPredicate<T> implements Predicate<T>, Serializable {
+  private static final class EquivalentToPredicate<T>
+      implements Predicate<@Nullable T>, Serializable {
 
     private final Equivalence<T> equivalence;
-    private final @Nullable T target;
+    @CheckForNull private final T target;
 
-    EquivalentToPredicate(Equivalence<T> equivalence, @Nullable T target) {
+    EquivalentToPredicate(Equivalence<T> equivalence, @CheckForNull T target) {
       this.equivalence = checkNotNull(equivalence);
       this.target = target;
     }
 
     @Override
-    public boolean apply(@Nullable T input) {
+    public boolean apply(@CheckForNull T input) {
       return equivalence.equivalent(input, target);
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (this == obj) {
         return true;
       }
diff --git a/guava/src/com/google/common/base/ExtraObjectsMethodsForWeb.java b/guava/src/com/google/common/base/ExtraObjectsMethodsForWeb.java
index 21cca2c..6770755 100644
--- a/guava/src/com/google/common/base/ExtraObjectsMethodsForWeb.java
+++ b/guava/src/com/google/common/base/ExtraObjectsMethodsForWeb.java
@@ -21,4 +21,5 @@
  * version.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ExtraObjectsMethodsForWeb {}
diff --git a/guava/src/com/google/common/base/FinalizablePhantomReference.java b/guava/src/com/google/common/base/FinalizablePhantomReference.java
index f920575..4f93996 100644
--- a/guava/src/com/google/common/base/FinalizablePhantomReference.java
+++ b/guava/src/com/google/common/base/FinalizablePhantomReference.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.lang.ref.PhantomReference;
 import java.lang.ref.ReferenceQueue;
+import javax.annotation.CheckForNull;
 
 /**
  * Phantom reference with a {@code finalizeReferent()} method which a background thread invokes
@@ -29,6 +30,7 @@
  * @since 2.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class FinalizablePhantomReference<T> extends PhantomReference<T>
     implements FinalizableReference {
   /**
@@ -37,7 +39,7 @@
    * @param referent to phantom reference
    * @param queue that should finalize the referent
    */
-  protected FinalizablePhantomReference(T referent, FinalizableReferenceQueue queue) {
+  protected FinalizablePhantomReference(@CheckForNull T referent, FinalizableReferenceQueue queue) {
     super(referent, queue.queue);
     queue.cleanUp();
   }
diff --git a/guava/src/com/google/common/base/FinalizableReference.java b/guava/src/com/google/common/base/FinalizableReference.java
index 848e7ee..73753c9 100644
--- a/guava/src/com/google/common/base/FinalizableReference.java
+++ b/guava/src/com/google/common/base/FinalizableReference.java
@@ -26,6 +26,7 @@
  */
 @DoNotMock("Use an instance of one of the Finalizable*Reference classes")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface FinalizableReference {
   /**
    * Invoked on a background thread after the referent has been garbage collected unless security
diff --git a/guava/src/com/google/common/base/FinalizableReferenceQueue.java b/guava/src/com/google/common/base/FinalizableReferenceQueue.java
index 3fe706f..5ce1d31 100644
--- a/guava/src/com/google/common/base/FinalizableReferenceQueue.java
+++ b/guava/src/com/google/common/base/FinalizableReferenceQueue.java
@@ -27,7 +27,7 @@
 import java.net.URLClassLoader;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A reference queue with an associated background thread that dequeues references and invokes
@@ -37,7 +37,7 @@
  * finalized. If this object is garbage collected earlier, the backing thread will not invoke {@code
  * finalizeReferent()} on the remaining references.
  *
- * <p>As an example of how this is used, imagine you have a class {@code MyServer} that creates a a
+ * <p>As an example of how this is used, imagine you have a class {@code MyServer} that creates a
  * {@link java.net.ServerSocket ServerSocket}, and you would like to ensure that the {@code
  * ServerSocket} is closed even if the {@code MyServer} object is garbage-collected without calling
  * its {@code close} method. You <em>could</em> use a finalizer to accomplish this, but that has a
@@ -89,6 +89,7 @@
  * @since 2.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public class FinalizableReferenceQueue implements Closeable {
   /*
    * The Finalizer thread keeps a phantom reference to this object. When the client (for example, a
@@ -228,7 +229,7 @@
      *
      * @throws SecurityException if we don't have the appropriate privileges
      */
-    @Nullable
+    @CheckForNull
     Class<?> loadFinalizer();
   }
 
@@ -242,7 +243,8 @@
     @VisibleForTesting static boolean disabled;
 
     @Override
-    public @Nullable Class<?> loadFinalizer() {
+    @CheckForNull
+    public Class<?> loadFinalizer() {
       if (disabled) {
         return null;
       }
@@ -279,7 +281,8 @@
             + "issue, or move Guava to your system class path.";
 
     @Override
-    public @Nullable Class<?> loadFinalizer() {
+    @CheckForNull
+    public Class<?> loadFinalizer() {
       try {
         /*
          * We use URLClassLoader because it's the only concrete class loader implementation in the
diff --git a/guava/src/com/google/common/base/FinalizableSoftReference.java b/guava/src/com/google/common/base/FinalizableSoftReference.java
index 45ecc65..c0e9b6b 100644
--- a/guava/src/com/google/common/base/FinalizableSoftReference.java
+++ b/guava/src/com/google/common/base/FinalizableSoftReference.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.lang.ref.ReferenceQueue;
 import java.lang.ref.SoftReference;
+import javax.annotation.CheckForNull;
 
 /**
  * Soft reference with a {@code finalizeReferent()} method which a background thread invokes after
@@ -27,6 +28,7 @@
  * @since 2.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class FinalizableSoftReference<T> extends SoftReference<T>
     implements FinalizableReference {
   /**
@@ -35,7 +37,7 @@
    * @param referent to softly reference
    * @param queue that should finalize the referent
    */
-  protected FinalizableSoftReference(T referent, FinalizableReferenceQueue queue) {
+  protected FinalizableSoftReference(@CheckForNull T referent, FinalizableReferenceQueue queue) {
     super(referent, queue.queue);
     queue.cleanUp();
   }
diff --git a/guava/src/com/google/common/base/FinalizableWeakReference.java b/guava/src/com/google/common/base/FinalizableWeakReference.java
index fb3b09b..9cca92e 100644
--- a/guava/src/com/google/common/base/FinalizableWeakReference.java
+++ b/guava/src/com/google/common/base/FinalizableWeakReference.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.lang.ref.ReferenceQueue;
 import java.lang.ref.WeakReference;
+import javax.annotation.CheckForNull;
 
 /**
  * Weak reference with a {@code finalizeReferent()} method which a background thread invokes after
@@ -27,6 +28,7 @@
  * @since 2.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class FinalizableWeakReference<T> extends WeakReference<T>
     implements FinalizableReference {
   /**
@@ -35,7 +37,7 @@
    * @param referent to weakly reference
    * @param queue that should finalize the referent
    */
-  protected FinalizableWeakReference(T referent, FinalizableReferenceQueue queue) {
+  protected FinalizableWeakReference(@CheckForNull T referent, FinalizableReferenceQueue queue) {
     super(referent, queue.queue);
     queue.cleanUp();
   }
diff --git a/guava/src/com/google/common/base/Function.java b/guava/src/com/google/common/base/Function.java
index 29b46c0..45287b7 100644
--- a/guava/src/com/google/common/base/Function.java
+++ b/guava/src/com/google/common/base/Function.java
@@ -16,6 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -41,11 +42,13 @@
  */
 @GwtCompatible
 @FunctionalInterface
-public interface Function<F, T> extends java.util.function.Function<F, T> {
+@ElementTypesAreNonnullByDefault
+public interface Function<F extends @Nullable Object, T extends @Nullable Object>
+    extends java.util.function.Function<F, T> {
   @Override
   @CanIgnoreReturnValue // TODO(kevinb): remove this
-  @Nullable
-  T apply(@Nullable F input);
+  @ParametricNullness
+  T apply(@ParametricNullness F input);
 
   /**
    * <i>May</i> return {@code true} if {@code object} is a {@code Function} that behaves identically
@@ -59,5 +62,5 @@
    * disappear. It is best not to depend on it.
    */
   @Override
-  boolean equals(@Nullable Object object);
+  boolean equals(@CheckForNull Object object);
 }
diff --git a/guava/src/com/google/common/base/FunctionalEquivalence.java b/guava/src/com/google/common/base/FunctionalEquivalence.java
index 05b6271..8bb67be 100644
--- a/guava/src/com/google/common/base/FunctionalEquivalence.java
+++ b/guava/src/com/google/common/base/FunctionalEquivalence.java
@@ -19,7 +19,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Equivalence applied on functional result.
@@ -29,14 +29,16 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class FunctionalEquivalence<F, T> extends Equivalence<F> implements Serializable {
 
   private static final long serialVersionUID = 0;
 
-  private final Function<F, ? extends T> function;
+  private final Function<? super F, ? extends T> function;
   private final Equivalence<T> resultEquivalence;
 
-  FunctionalEquivalence(Function<F, ? extends T> function, Equivalence<T> resultEquivalence) {
+  FunctionalEquivalence(
+      Function<? super F, ? extends T> function, Equivalence<T> resultEquivalence) {
     this.function = checkNotNull(function);
     this.resultEquivalence = checkNotNull(resultEquivalence);
   }
@@ -52,7 +54,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/base/Functions.java b/guava/src/com/google/common/base/Functions.java
index be845c6..5337d0e 100644
--- a/guava/src/com/google/common/base/Functions.java
+++ b/guava/src/com/google/common/base/Functions.java
@@ -14,12 +14,14 @@
 
 package com.google.common.base;
 
+import static com.google.common.base.NullnessCasts.uncheckedCastNullableTToT;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -36,6 +38,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Functions {
   private Functions() {}
 
@@ -79,16 +82,17 @@
   /** Returns the identity function. */
   // implementation is "fully variant"; E has become a "pass-through" type
   @SuppressWarnings("unchecked")
-  public static <E> Function<E, E> identity() {
+  public static <E extends @Nullable Object> Function<E, E> identity() {
     return (Function<E, E>) IdentityFunction.INSTANCE;
   }
 
   // enum singleton pattern
-  private enum IdentityFunction implements Function<Object, Object> {
+  private enum IdentityFunction implements Function<@Nullable Object, @Nullable Object> {
     INSTANCE;
 
     @Override
-    public @Nullable Object apply(@Nullable Object o) {
+    @CheckForNull
+    public Object apply(@CheckForNull Object o) {
       return o;
     }
 
@@ -111,7 +115,8 @@
    * key (instead of an exception being thrown), you can use the method reference {@code map::get}
    * instead.
    */
-  public static <K, V> Function<K, V> forMap(Map<K, V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Function<K, V> forMap(
+      Map<K, V> map) {
     return new FunctionForMapNoDefault<>(map);
   }
 
@@ -128,11 +133,14 @@
    * @return function that returns {@code map.get(a)} when {@code a} is a key, or {@code
    *     defaultValue} otherwise
    */
-  public static <K, V> Function<K, V> forMap(Map<K, ? extends V> map, @Nullable V defaultValue) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Function<K, V> forMap(
+      Map<K, ? extends V> map, @ParametricNullness V defaultValue) {
     return new ForMapWithDefault<>(map, defaultValue);
   }
 
-  private static class FunctionForMapNoDefault<K, V> implements Function<K, V>, Serializable {
+  private static class FunctionForMapNoDefault<
+          K extends @Nullable Object, V extends @Nullable Object>
+      implements Function<K, V>, Serializable {
     final Map<K, V> map;
 
     FunctionForMapNoDefault(Map<K, V> map) {
@@ -140,14 +148,16 @@
     }
 
     @Override
-    public V apply(@Nullable K key) {
+    @ParametricNullness
+    public V apply(@ParametricNullness K key) {
       V result = map.get(key);
       checkArgument(result != null || map.containsKey(key), "Key '%s' not present in map", key);
-      return result;
+      // The unchecked cast is safe because of the containsKey check.
+      return uncheckedCastNullableTToT(result);
     }
 
     @Override
-    public boolean equals(@Nullable Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof FunctionForMapNoDefault) {
         FunctionForMapNoDefault<?, ?> that = (FunctionForMapNoDefault<?, ?>) o;
         return map.equals(that.map);
@@ -168,23 +178,28 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static class ForMapWithDefault<K, V> implements Function<K, V>, Serializable {
+  private static class ForMapWithDefault<K extends @Nullable Object, V extends @Nullable Object>
+      implements Function<K, V>, Serializable {
     final Map<K, ? extends V> map;
-    final @Nullable V defaultValue;
+    @ParametricNullness final V defaultValue;
 
-    ForMapWithDefault(Map<K, ? extends V> map, @Nullable V defaultValue) {
+    ForMapWithDefault(Map<K, ? extends V> map, @ParametricNullness V defaultValue) {
       this.map = checkNotNull(map);
       this.defaultValue = defaultValue;
     }
 
     @Override
-    public V apply(@Nullable K key) {
+    @ParametricNullness
+    public V apply(@ParametricNullness K key) {
       V result = map.get(key);
-      return (result != null || map.containsKey(key)) ? result : defaultValue;
+      // The unchecked cast is safe because of the containsKey check.
+      return (result != null || map.containsKey(key))
+          ? uncheckedCastNullableTToT(result)
+          : defaultValue;
     }
 
     @Override
-    public boolean equals(@Nullable Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof ForMapWithDefault) {
         ForMapWithDefault<?, ?> that = (ForMapWithDefault<?, ?>) o;
         return map.equals(that.map) && Objects.equal(defaultValue, that.defaultValue);
@@ -218,11 +233,14 @@
    * @return the composition of {@code f} and {@code g}
    * @see <a href="//en.wikipedia.org/wiki/Function_composition">function composition</a>
    */
-  public static <A, B, C> Function<A, C> compose(Function<B, C> g, Function<A, ? extends B> f) {
+  public static <A extends @Nullable Object, B extends @Nullable Object, C extends @Nullable Object>
+      Function<A, C> compose(Function<B, C> g, Function<A, ? extends B> f) {
     return new FunctionComposition<>(g, f);
   }
 
-  private static class FunctionComposition<A, B, C> implements Function<A, C>, Serializable {
+  private static class FunctionComposition<
+          A extends @Nullable Object, B extends @Nullable Object, C extends @Nullable Object>
+      implements Function<A, C>, Serializable {
     private final Function<B, C> g;
     private final Function<A, ? extends B> f;
 
@@ -232,12 +250,13 @@
     }
 
     @Override
-    public C apply(@Nullable A a) {
+    @ParametricNullness
+    public C apply(@ParametricNullness A a) {
       return g.apply(f.apply(a));
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof FunctionComposition) {
         FunctionComposition<?, ?, ?> that = (FunctionComposition<?, ?, ?>) obj;
         return f.equals(that.f) && g.equals(that.g);
@@ -267,12 +286,14 @@
    *
    * <p><b>Java 8 users:</b> use the method reference {@code predicate::test} instead.
    */
-  public static <T> Function<T, Boolean> forPredicate(Predicate<T> predicate) {
+  public static <T extends @Nullable Object> Function<T, Boolean> forPredicate(
+      Predicate<T> predicate) {
     return new PredicateFunction<T>(predicate);
   }
 
   /** @see Functions#forPredicate */
-  private static class PredicateFunction<T> implements Function<T, Boolean>, Serializable {
+  private static class PredicateFunction<T extends @Nullable Object>
+      implements Function<T, Boolean>, Serializable {
     private final Predicate<T> predicate;
 
     private PredicateFunction(Predicate<T> predicate) {
@@ -280,12 +301,12 @@
     }
 
     @Override
-    public Boolean apply(@Nullable T t) {
+    public Boolean apply(@ParametricNullness T t) {
       return predicate.apply(t);
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof PredicateFunction) {
         PredicateFunction<?> that = (PredicateFunction<?>) obj;
         return predicate.equals(that.predicate);
@@ -314,24 +335,27 @@
    * @param value the constant value for the function to return
    * @return a function that always returns {@code value}
    */
-  public static <E> Function<Object, E> constant(@Nullable E value) {
-    return new ConstantFunction<E>(value);
+  public static <E extends @Nullable Object> Function<@Nullable Object, E> constant(
+      @ParametricNullness E value) {
+    return new ConstantFunction<>(value);
   }
 
-  private static class ConstantFunction<E> implements Function<Object, E>, Serializable {
-    private final @Nullable E value;
+  private static class ConstantFunction<E extends @Nullable Object>
+      implements Function<@Nullable Object, E>, Serializable {
+    @ParametricNullness private final E value;
 
-    public ConstantFunction(@Nullable E value) {
+    public ConstantFunction(@ParametricNullness E value) {
       this.value = value;
     }
 
     @Override
-    public E apply(@Nullable Object from) {
+    @ParametricNullness
+    public E apply(@CheckForNull Object from) {
       return value;
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof ConstantFunction) {
         ConstantFunction<?> that = (ConstantFunction<?>) obj;
         return Objects.equal(value, that.value);
@@ -359,12 +383,14 @@
    *
    * @since 10.0
    */
-  public static <T> Function<Object, T> forSupplier(Supplier<T> supplier) {
-    return new SupplierFunction<T>(supplier);
+  public static <F extends @Nullable Object, T extends @Nullable Object> Function<F, T> forSupplier(
+      Supplier<T> supplier) {
+    return new SupplierFunction<>(supplier);
   }
 
   /** @see Functions#forSupplier */
-  private static class SupplierFunction<T> implements Function<Object, T>, Serializable {
+  private static class SupplierFunction<F extends @Nullable Object, T extends @Nullable Object>
+      implements Function<F, T>, Serializable {
 
     private final Supplier<T> supplier;
 
@@ -373,14 +399,15 @@
     }
 
     @Override
-    public T apply(@Nullable Object input) {
+    @ParametricNullness
+    public T apply(@ParametricNullness F input) {
       return supplier.get();
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof SupplierFunction) {
-        SupplierFunction<?> that = (SupplierFunction<?>) obj;
+        SupplierFunction<?, ?> that = (SupplierFunction<?, ?>) obj;
         return this.supplier.equals(that.supplier);
       }
       return false;
diff --git a/guava/src/com/google/common/base/Java8Compatibility.java b/guava/src/com/google/common/base/Java8Compatibility.java
new file mode 100644
index 0000000..edc8b73
--- /dev/null
+++ b/guava/src/com/google/common/base/Java8Compatibility.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2020 The Guava Authors
+ *
+ * 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 com.google.common.base;
+
+import com.google.common.annotations.GwtIncompatible;
+import java.nio.Buffer;
+
+/**
+ * Wrappers around {@link Buffer} methods that are covariantly overridden in Java 9+. See
+ * https://github.com/google/guava/issues/3990
+ */
+@GwtIncompatible
+@ElementTypesAreNonnullByDefault
+final class Java8Compatibility {
+  static void clear(Buffer b) {
+    b.clear();
+  }
+
+  static void flip(Buffer b) {
+    b.flip();
+  }
+
+  static void limit(Buffer b, int limit) {
+    b.limit(limit);
+  }
+
+  static void position(Buffer b, int position) {
+    b.position(position);
+  }
+
+  private Java8Compatibility() {}
+}
diff --git a/guava/src/com/google/common/base/JdkPattern.java b/guava/src/com/google/common/base/JdkPattern.java
index f7791db..4788398 100644
--- a/guava/src/com/google/common/base/JdkPattern.java
+++ b/guava/src/com/google/common/base/JdkPattern.java
@@ -20,6 +20,7 @@
 import java.util.regex.Pattern;
 
 /** A regex pattern implementation which is backed by the {@link Pattern}. */
+@ElementTypesAreNonnullByDefault
 @GwtIncompatible
 final class JdkPattern extends CommonPattern implements Serializable {
   private final Pattern pattern;
diff --git a/guava/src/com/google/common/base/Joiner.java b/guava/src/com/google/common/base/Joiner.java
index 922c1eb..0f3d6e4 100644
--- a/guava/src/com/google/common/base/Joiner.java
+++ b/guava/src/com/google/common/base/Joiner.java
@@ -15,6 +15,7 @@
 package com.google.common.base;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -25,6 +26,7 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -63,6 +65,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class Joiner {
   /** Returns a joiner which automatically places {@code separator} between consecutive elements. */
   public static Joiner on(String separator) {
@@ -84,12 +87,19 @@
     this.separator = prototype.separator;
   }
 
+  /*
+   * In this file, we use <? extends @Nullable Object> instead of <?> to work around a Kotlin bug
+   * (see b/189937072 until we file a bug against Kotlin itself). (The two should be equivalent, so
+   * we normally prefer the shorter one.)
+   */
+
   /**
    * Appends the string representation of each of {@code parts}, using the previously configured
    * separator between each, to {@code appendable}.
    */
   @CanIgnoreReturnValue
-  public <A extends Appendable> A appendTo(A appendable, Iterable<?> parts) throws IOException {
+  public <A extends Appendable> A appendTo(A appendable, Iterable<? extends @Nullable Object> parts)
+      throws IOException {
     return appendTo(appendable, parts.iterator());
   }
 
@@ -100,7 +110,8 @@
    * @since 11.0
    */
   @CanIgnoreReturnValue
-  public <A extends Appendable> A appendTo(A appendable, Iterator<?> parts) throws IOException {
+  public <A extends Appendable> A appendTo(A appendable, Iterator<? extends @Nullable Object> parts)
+      throws IOException {
     checkNotNull(appendable);
     if (parts.hasNext()) {
       appendable.append(toString(parts.next()));
@@ -117,14 +128,18 @@
    * separator between each, to {@code appendable}.
    */
   @CanIgnoreReturnValue
-  public final <A extends Appendable> A appendTo(A appendable, Object[] parts) throws IOException {
+  public final <A extends Appendable> A appendTo(A appendable, @Nullable Object[] parts)
+      throws IOException {
     return appendTo(appendable, Arrays.asList(parts));
   }
 
   /** Appends to {@code appendable} the string representation of each of the remaining arguments. */
   @CanIgnoreReturnValue
   public final <A extends Appendable> A appendTo(
-      A appendable, @Nullable Object first, @Nullable Object second, Object... rest)
+      A appendable,
+      @CheckForNull Object first,
+      @CheckForNull Object second,
+      @Nullable Object... rest)
       throws IOException {
     return appendTo(appendable, iterable(first, second, rest));
   }
@@ -135,7 +150,8 @@
    * Iterable)}, except that it does not throw {@link IOException}.
    */
   @CanIgnoreReturnValue
-  public final StringBuilder appendTo(StringBuilder builder, Iterable<?> parts) {
+  public final StringBuilder appendTo(
+      StringBuilder builder, Iterable<? extends @Nullable Object> parts) {
     return appendTo(builder, parts.iterator());
   }
 
@@ -147,7 +163,8 @@
    * @since 11.0
    */
   @CanIgnoreReturnValue
-  public final StringBuilder appendTo(StringBuilder builder, Iterator<?> parts) {
+  public final StringBuilder appendTo(
+      StringBuilder builder, Iterator<? extends @Nullable Object> parts) {
     try {
       appendTo((Appendable) builder, parts);
     } catch (IOException impossible) {
@@ -162,7 +179,7 @@
    * Iterable)}, except that it does not throw {@link IOException}.
    */
   @CanIgnoreReturnValue
-  public final StringBuilder appendTo(StringBuilder builder, Object[] parts) {
+  public final StringBuilder appendTo(StringBuilder builder, @Nullable Object[] parts) {
     return appendTo(builder, Arrays.asList(parts));
   }
 
@@ -173,7 +190,10 @@
    */
   @CanIgnoreReturnValue
   public final StringBuilder appendTo(
-      StringBuilder builder, @Nullable Object first, @Nullable Object second, Object... rest) {
+      StringBuilder builder,
+      @CheckForNull Object first,
+      @CheckForNull Object second,
+      @Nullable Object... rest) {
     return appendTo(builder, iterable(first, second, rest));
   }
 
@@ -181,7 +201,7 @@
    * Returns a string containing the string representation of each of {@code parts}, using the
    * previously configured separator between each.
    */
-  public final String join(Iterable<?> parts) {
+  public final String join(Iterable<? extends @Nullable Object> parts) {
     return join(parts.iterator());
   }
 
@@ -191,7 +211,7 @@
    *
    * @since 11.0
    */
-  public final String join(Iterator<?> parts) {
+  public final String join(Iterator<? extends @Nullable Object> parts) {
     return appendTo(new StringBuilder(), parts).toString();
   }
 
@@ -199,7 +219,7 @@
    * Returns a string containing the string representation of each of {@code parts}, using the
    * previously configured separator between each.
    */
-  public final String join(Object[] parts) {
+  public final String join(@Nullable Object[] parts) {
     return join(Arrays.asList(parts));
   }
 
@@ -207,7 +227,8 @@
    * Returns a string containing the string representation of each argument, using the previously
    * configured separator between each.
    */
-  public final String join(@Nullable Object first, @Nullable Object second, Object... rest) {
+  public final String join(
+      @CheckForNull Object first, @CheckForNull Object second, @Nullable Object... rest) {
     return join(iterable(first, second, rest));
   }
 
@@ -219,7 +240,7 @@
     checkNotNull(nullText);
     return new Joiner(this) {
       @Override
-      CharSequence toString(@Nullable Object part) {
+      CharSequence toString(@CheckForNull Object part) {
         return (part == null) ? nullText : Joiner.this.toString(part);
       }
 
@@ -242,7 +263,8 @@
   public Joiner skipNulls() {
     return new Joiner(this) {
       @Override
-      public <A extends Appendable> A appendTo(A appendable, Iterator<?> parts) throws IOException {
+      public <A extends Appendable> A appendTo(
+          A appendable, Iterator<? extends @Nullable Object> parts) throws IOException {
         checkNotNull(appendable, "appendable");
         checkNotNull(parts, "parts");
         while (parts.hasNext()) {
@@ -448,21 +470,41 @@
     }
   }
 
-  CharSequence toString(Object part) {
-    checkNotNull(part); // checkNotNull for GWT (do not optimize).
+  CharSequence toString(@CheckForNull Object part) {
+    /*
+     * requireNonNull is not safe: Joiner.on(...).join(somethingThatContainsNull) will indeed throw.
+     * However, Joiner.on(...).useForNull(...).join(somethingThatContainsNull) *is* safe -- because
+     * it returns a subclass of Joiner that overrides this method to tolerate null inputs.
+     *
+     * Unfortunately, we don't distinguish between these two cases in our public API: Joiner.on(...)
+     * and Joiner.on(...).useForNull(...) both declare the same return type: plain Joiner. To ensure
+     * that users *can* pass null arguments to Joiner, we annotate it as if it always tolerates null
+     * inputs, rather than as if it never tolerates them.
+     *
+     * We rely on checkers to implement special cases to catch dangerous calls to join(), etc. based
+     * on what they know about the particular Joiner instances the calls are performed on.
+     *
+     * (In addition to useForNull, we also offer skipNulls. It, too, tolerates null inputs, but its
+     * tolerance is implemented differently: Its implementation avoids calling this toString(Object)
+     * method in the first place.)
+     */
+    requireNonNull(part);
     return (part instanceof CharSequence) ? (CharSequence) part : part.toString();
   }
 
-  private static Iterable<Object> iterable(
-      final Object first, final Object second, final Object[] rest) {
+  private static Iterable<@Nullable Object> iterable(
+      @CheckForNull final Object first,
+      @CheckForNull final Object second,
+      final @Nullable Object[] rest) {
     checkNotNull(rest);
-    return new AbstractList<Object>() {
+    return new AbstractList<@Nullable Object>() {
       @Override
       public int size() {
         return rest.length + 2;
       }
 
       @Override
+      @CheckForNull
       public Object get(int index) {
         switch (index) {
           case 0:
diff --git a/guava/src/com/google/common/base/MoreObjects.java b/guava/src/com/google/common/base/MoreObjects.java
index cf901b5..16e12bb 100644
--- a/guava/src/com/google/common/base/MoreObjects.java
+++ b/guava/src/com/google/common/base/MoreObjects.java
@@ -18,8 +18,14 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import java.lang.reflect.Array;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import java.util.Collection;
+import java.util.Map;
+import java.util.OptionalDouble;
+import java.util.OptionalInt;
+import java.util.OptionalLong;
+import javax.annotation.CheckForNull;
 
 /**
  * Helper functions that operate on any {@code Object}, and are not already provided in {@link
@@ -33,6 +39,7 @@
  * @since 18.0 (since 2.0 as {@code Objects})
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class MoreObjects {
   /**
    * Returns the first of two given parameters that is not {@code null}, if either is, or otherwise
@@ -54,7 +61,24 @@
    * @throws NullPointerException if both {@code first} and {@code second} are null
    * @since 18.0 (since 3.0 as {@code Objects.firstNonNull()}).
    */
-  public static <T> T firstNonNull(@Nullable T first, @Nullable T second) {
+  /*
+   * We annotate firstNonNull in a way that protects against NullPointerException at the cost of
+   * forbidding some reasonable calls.
+   *
+   * The more permissive signature would be to accept (@CheckForNull T first, @CheckForNull T
+   * second), since it's OK for `second` to be null as long as `first` is not also null. But we
+   * expect for that flexibility to be useful relatively rarely: The more common use case is to
+   * supply a clearly non-null default, like `firstNonNull(someString, "")`. And users who really
+   * know that `first` is guaranteed non-null when `second` is null can write the logic out
+   * longhand, including a requireNonNull call, which calls attention to the fact that the static
+   * analyzer can't prove that the operation is safe.
+   *
+   * This matches the signature we currently have for requireNonNullElse in our own checker. (And
+   * that in turn matches that method's signature under the Checker Framework.) As always, we could
+   * consider the more flexible signature if we judge it worth the risks. If we do, we would likely
+   * update both methods so that they continue to match.
+   */
+  public static <T> T firstNonNull(@CheckForNull T first, T second) {
     if (first != null) {
       return first;
     }
@@ -145,6 +169,7 @@
     private final ValueHolder holderHead = new ValueHolder();
     private ValueHolder holderTail = holderHead;
     private boolean omitNullValues = false;
+    private boolean omitEmptyValues = false;
 
     /** Use {@link MoreObjects#toStringHelper(Object)} to create an instance. */
     private ToStringHelper(String className) {
@@ -170,7 +195,7 @@
      * called, in which case this name/value pair will not be added.
      */
     @CanIgnoreReturnValue
-    public ToStringHelper add(String name, @Nullable Object value) {
+    public ToStringHelper add(String name, @CheckForNull Object value) {
       return addHolder(name, value);
     }
 
@@ -181,7 +206,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, boolean value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -191,7 +216,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, char value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -201,7 +226,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, double value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -211,7 +236,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, float value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -221,7 +246,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, int value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -231,7 +256,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper add(String name, long value) {
-      return addHolder(name, String.valueOf(value));
+      return addUnconditionalHolder(name, String.valueOf(value));
     }
 
     /**
@@ -241,7 +266,7 @@
      * readable name.
      */
     @CanIgnoreReturnValue
-    public ToStringHelper addValue(@Nullable Object value) {
+    public ToStringHelper addValue(@CheckForNull Object value) {
       return addHolder(value);
     }
 
@@ -255,7 +280,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(boolean value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
     }
 
     /**
@@ -268,7 +293,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(char value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
     }
 
     /**
@@ -281,7 +306,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(double value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
     }
 
     /**
@@ -294,7 +319,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(float value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
     }
 
     /**
@@ -307,7 +332,7 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(int value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
     }
 
     /**
@@ -320,7 +345,31 @@
      */
     @CanIgnoreReturnValue
     public ToStringHelper addValue(long value) {
-      return addHolder(String.valueOf(value));
+      return addUnconditionalHolder(String.valueOf(value));
+    }
+
+    private static boolean isEmpty(Object value) {
+      // Put types estimated to be most frequent first.
+      if (value instanceof CharSequence) {
+        return ((CharSequence) value).length() == 0;
+      } else if (value instanceof Collection) {
+        return ((Collection<?>) value).isEmpty();
+      } else if (value instanceof Map) {
+        return ((Map<?, ?>) value).isEmpty();
+      } else if (value instanceof java.util.Optional) {
+        return !((java.util.Optional<?>) value).isPresent();
+      } else if (value instanceof OptionalInt) {
+        return !((OptionalInt) value).isPresent();
+      } else if (value instanceof OptionalLong) {
+        return !((OptionalLong) value).isPresent();
+      } else if (value instanceof OptionalDouble) {
+        return !((OptionalDouble) value).isPresent();
+      } else if (value instanceof Optional) {
+        return !((Optional) value).isPresent();
+      } else if (value.getClass().isArray()) {
+        return Array.getLength(value) == 0;
+      }
+      return false;
     }
 
     /**
@@ -335,13 +384,17 @@
     public String toString() {
       // create a copy to keep it consistent in case value changes
       boolean omitNullValuesSnapshot = omitNullValues;
+      boolean omitEmptyValuesSnapshot = omitEmptyValues;
       String nextSeparator = "";
       StringBuilder builder = new StringBuilder(32).append(className).append('{');
       for (ValueHolder valueHolder = holderHead.next;
           valueHolder != null;
           valueHolder = valueHolder.next) {
         Object value = valueHolder.value;
-        if (!omitNullValuesSnapshot || value != null) {
+        if (valueHolder instanceof UnconditionalValueHolder
+            || (value == null
+                ? !omitNullValuesSnapshot
+                : (!omitEmptyValuesSnapshot || !isEmpty(value)))) {
           builder.append(nextSeparator);
           nextSeparator = ", ";
 
@@ -366,24 +419,51 @@
       return valueHolder;
     }
 
-    private ToStringHelper addHolder(@Nullable Object value) {
+    private ToStringHelper addHolder(@CheckForNull Object value) {
       ValueHolder valueHolder = addHolder();
       valueHolder.value = value;
       return this;
     }
 
-    private ToStringHelper addHolder(String name, @Nullable Object value) {
+    private ToStringHelper addHolder(String name, @CheckForNull Object value) {
       ValueHolder valueHolder = addHolder();
       valueHolder.value = value;
       valueHolder.name = checkNotNull(name);
       return this;
     }
 
-    private static final class ValueHolder {
-      @Nullable String name;
-      @Nullable Object value;
-      @Nullable ValueHolder next;
+    private UnconditionalValueHolder addUnconditionalHolder() {
+      UnconditionalValueHolder valueHolder = new UnconditionalValueHolder();
+      holderTail = holderTail.next = valueHolder;
+      return valueHolder;
     }
+
+    private ToStringHelper addUnconditionalHolder(Object value) {
+      UnconditionalValueHolder valueHolder = addUnconditionalHolder();
+      valueHolder.value = value;
+      return this;
+    }
+
+    private ToStringHelper addUnconditionalHolder(String name, Object value) {
+      UnconditionalValueHolder valueHolder = addUnconditionalHolder();
+      valueHolder.value = value;
+      valueHolder.name = checkNotNull(name);
+      return this;
+    }
+
+    // Holder object for values that might be null and/or empty.
+    private static class ValueHolder {
+      @CheckForNull String name;
+      @CheckForNull Object value;
+      @CheckForNull ValueHolder next;
+    }
+
+    /**
+     * Holder object for values that cannot be null or empty (will be printed unconditionally). This
+     * helps to shortcut most calls to isEmpty(), which is important because the check for emptiness
+     * is relatively expensive. Use a subtype so this also doesn't need any extra storage.
+     */
+    private static final class UnconditionalValueHolder extends ValueHolder {}
   }
 
   private MoreObjects() {}
diff --git a/guava/src/com/google/common/base/NullnessCasts.java b/guava/src/com/google/common/base/NullnessCasts.java
new file mode 100644
index 0000000..1ada6bf
--- /dev/null
+++ b/guava/src/com/google/common/base/NullnessCasts.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.base;
+
+import com.google.common.annotations.GwtCompatible;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/** A utility method to perform unchecked casts to suppress errors produced by nullness analyses. */
+@GwtCompatible
+@ElementTypesAreNonnullByDefault
+final class NullnessCasts {
+  /**
+   * Accepts a {@code @Nullable T} and returns a plain {@code T}, without performing any check that
+   * that conversion is safe.
+   *
+   * <p>This method is intended to help with usages of type parameters that have {@linkplain
+   * ParametricNullness parametric nullness}. If a type parameter instead ranges over only non-null
+   * types (or if the type is a non-variable type, like {@code String}), then code should almost
+   * never use this method, preferring instead to call {@code requireNonNull} so as to benefit from
+   * its runtime check.
+   *
+   * <p>An example use case for this method is in implementing an {@code Iterator<T>} whose {@code
+   * next} field is lazily initialized. The type of that field would be {@code @Nullable T}, and the
+   * code would be responsible for populating a "real" {@code T} (which might still be the value
+   * {@code null}!) before returning it to callers. Depending on how the code is structured, a
+   * nullness analysis might not understand that the field has been populated. To avoid that problem
+   * without having to add {@code @SuppressWarnings}, the code can call this method.
+   *
+   * <p>Why <i>not</i> just add {@code SuppressWarnings}? The problem is that this method is
+   * typically useful for {@code return} statements. That leaves the code with two options: Either
+   * add the suppression to the whole method (which turns off checking for a large section of code),
+   * or extract a variable, and put the suppression on that. However, a local variable typically
+   * doesn't work: Because nullness analyses typically infer the nullness of local variables,
+   * there's no way to assign a {@code @Nullable T} to a field {@code T foo;} and instruct the
+   * analysis that that means "plain {@code T}" rather than the inferred type {@code @Nullable T}.
+   * (Even if supported added {@code @NonNull}, that would not help, since the problem case
+   * addressed by this method is the case in which {@code T} has parametric nullness -- and thus its
+   * value may be legitimately {@code null}.)
+   */
+  @ParametricNullness
+  @SuppressWarnings("nullness")
+  static <T extends @Nullable Object> T uncheckedCastNullableTToT(@CheckForNull T t) {
+    return t;
+  }
+
+  private NullnessCasts() {}
+}
diff --git a/guava/src/com/google/common/base/Objects.java b/guava/src/com/google/common/base/Objects.java
index ed513d2..bd6b0d9 100644
--- a/guava/src/com/google/common/base/Objects.java
+++ b/guava/src/com/google/common/base/Objects.java
@@ -16,6 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.Arrays;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -29,6 +30,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Objects extends ExtraObjectsMethodsForWeb {
   private Objects() {}
 
@@ -48,7 +50,7 @@
    * <p><b>Note for Java 7 and later:</b> This method should be treated as deprecated; use {@link
    * java.util.Objects#equals} instead.
    */
-  public static boolean equal(@Nullable Object a, @Nullable Object b) {
+  public static boolean equal(@CheckForNull Object a, @CheckForNull Object b) {
     return a == b || (a != null && a.equals(b));
   }
 
@@ -73,7 +75,7 @@
    * <p><b>Note for Java 7 and later:</b> This method should be treated as deprecated; use {@link
    * java.util.Objects#hash} instead.
    */
-  public static int hashCode(@Nullable Object @Nullable ... objects) {
+  public static int hashCode(@CheckForNull @Nullable Object... objects) {
     return Arrays.hashCode(objects);
   }
 }
diff --git a/guava/src/com/google/common/base/Optional.java b/guava/src/com/google/common/base/Optional.java
index 51966f6..b47705e 100644
--- a/guava/src/com/google/common/base/Optional.java
+++ b/guava/src/com/google/common/base/Optional.java
@@ -15,14 +15,14 @@
 package com.google.common.base;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import com.google.errorprone.annotations.DoNotMock;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable object that may contain a non-null reference to another object. Each instance of
@@ -82,6 +82,7 @@
  */
 @DoNotMock("Use Optional.of(value) or Optional.absent()")
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 public abstract class Optional<T> implements Serializable {
   /**
    * Returns an {@code Optional} instance with no contained reference.
@@ -112,7 +113,7 @@
    * <p><b>Comparison to {@code java.util.Optional}:</b> this method is equivalent to Java 8's
    * {@code Optional.ofNullable}.
    */
-  public static <T> Optional<T> fromNullable(@Nullable T nullableReference) {
+  public static <T> Optional<T> fromNullable(@CheckForNull T nullableReference) {
     return (nullableReference == null) ? Optional.<T>absent() : new Present<T>(nullableReference);
   }
 
@@ -122,8 +123,8 @@
    *
    * @since 21.0
    */
-  public static <T> @Nullable Optional<T> fromJavaUtil(
-      java.util.@Nullable Optional<T> javaUtilOptional) {
+  @CheckForNull
+  public static <T> Optional<T> fromJavaUtil(@CheckForNull java.util.Optional<T> javaUtilOptional) {
     return (javaUtilOptional == null) ? null : fromNullable(javaUtilOptional.orElse(null));
   }
 
@@ -140,8 +141,8 @@
    *
    * @since 21.0
    */
-  public static <T> java.util.@Nullable Optional<T> toJavaUtil(
-      @Nullable Optional<T> googleOptional) {
+  @CheckForNull
+  public static <T> java.util.Optional<T> toJavaUtil(@CheckForNull Optional<T> googleOptional) {
     return googleOptional == null ? null : googleOptional.toJavaUtil();
   }
 
@@ -248,7 +249,8 @@
    * <p><b>Comparison to {@code java.util.Optional}:</b> this method is equivalent to Java 8's
    * {@code Optional.orElse(null)}.
    */
-  public abstract @Nullable T orNull();
+  @CheckForNull
+  public abstract T orNull();
 
   /**
    * Returns an immutable singleton {@link Set} whose only element is the contained instance if it
@@ -296,7 +298,7 @@
    * <p><b>Comparison to {@code java.util.Optional}:</b> no differences.
    */
   @Override
-  public abstract boolean equals(@Nullable Object object);
+  public abstract boolean equals(@CheckForNull Object object);
 
   /**
    * Returns a hash code for this instance.
@@ -341,6 +343,7 @@
               checkNotNull(optionals.iterator());
 
           @Override
+          @CheckForNull
           protected T computeNext() {
             while (iterator.hasNext()) {
               Optional<? extends T> optional = iterator.next();
diff --git a/guava/src/com/google/common/base/PairwiseEquivalence.java b/guava/src/com/google/common/base/PairwiseEquivalence.java
index 89cb562..74be27f 100644
--- a/guava/src/com/google/common/base/PairwiseEquivalence.java
+++ b/guava/src/com/google/common/base/PairwiseEquivalence.java
@@ -17,14 +17,16 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.Iterator;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 @GwtCompatible(serializable = true)
-final class PairwiseEquivalence<T> extends Equivalence<Iterable<T>> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class PairwiseEquivalence<E, T extends @Nullable E> extends Equivalence<Iterable<T>>
+    implements Serializable {
+  final Equivalence<E> elementEquivalence;
 
-  final Equivalence<? super T> elementEquivalence;
-
-  PairwiseEquivalence(Equivalence<? super T> elementEquivalence) {
+  PairwiseEquivalence(Equivalence<E> elementEquivalence) {
     this.elementEquivalence = Preconditions.checkNotNull(elementEquivalence);
   }
 
@@ -52,9 +54,9 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof PairwiseEquivalence) {
-      PairwiseEquivalence<?> that = (PairwiseEquivalence<?>) object;
+      PairwiseEquivalence<?, ?> that = (PairwiseEquivalence<?, ?>) object;
       return this.elementEquivalence.equals(that.elementEquivalence);
     }
 
diff --git a/guava/src/com/google/common/base/ParametricNullness.java b/guava/src/com/google/common/base/ParametricNullness.java
new file mode 100644
index 0000000..c736055
--- /dev/null
+++ b/guava/src/com/google/common/base/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.base;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/base/PatternCompiler.java b/guava/src/com/google/common/base/PatternCompiler.java
index 813a25f..72a45fa 100644
--- a/guava/src/com/google/common/base/PatternCompiler.java
+++ b/guava/src/com/google/common/base/PatternCompiler.java
@@ -22,6 +22,7 @@
  * java.util.ServiceLoader} mechanism.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 interface PatternCompiler {
   /**
    * Compiles the given pattern.
diff --git a/guava/src/com/google/common/base/Platform.java b/guava/src/com/google/common/base/Platform.java
index 54b2dfc..644e89c 100644
--- a/guava/src/com/google/common/base/Platform.java
+++ b/guava/src/com/google/common/base/Platform.java
@@ -21,7 +21,7 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.regex.Pattern;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Methods factored out so that they can be emulated differently in GWT.
@@ -29,6 +29,7 @@
  * @author Jesse Wilson
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class Platform {
   private static final Logger logger = Logger.getLogger(Platform.class.getName());
   private static final PatternCompiler patternCompiler = loadPatternCompiler();
@@ -54,15 +55,28 @@
     return String.format(Locale.ROOT, "%.4g", value);
   }
 
-  static boolean stringIsNullOrEmpty(@Nullable String string) {
+  static boolean stringIsNullOrEmpty(@CheckForNull String string) {
     return string == null || string.isEmpty();
   }
 
-  static String nullToEmpty(@Nullable String string) {
+  /**
+   * Returns the string if it is not null, or an empty string otherwise.
+   *
+   * @param string the string to test and possibly return
+   * @return {@code string} if it is not null; {@code ""} otherwise
+   */
+  static String nullToEmpty(@CheckForNull String string) {
     return (string == null) ? "" : string;
   }
 
-  static String emptyToNull(@Nullable String string) {
+  /**
+   * Returns the string if it is not empty, or a null string otherwise.
+   *
+   * @param string the string to test and possibly return
+   * @return {@code string} if it is not empty; {@code null} otherwise
+   */
+  @CheckForNull
+  static String emptyToNull(@CheckForNull String string) {
     return stringIsNullOrEmpty(string) ? null : string;
   }
 
@@ -114,6 +128,5 @@
             + " warning because you are sending a Guava type over GWT-RPC, which will break. You"
             + " can identify which type by looking at the class name in the attached stack trace.",
         new Throwable());
-
   }
 }
diff --git a/guava/src/com/google/common/base/Preconditions.java b/guava/src/com/google/common/base/Preconditions.java
index 30cc374..13ff77b 100644
--- a/guava/src/com/google/common/base/Preconditions.java
+++ b/guava/src/com/google/common/base/Preconditions.java
@@ -18,7 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
-import org.checkerframework.checker.nullness.qual.NonNull;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -114,9 +114,12 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Preconditions {
   private Preconditions() {}
 
+  // TODO(cpovirk): Standardize parameter names (expression vs. b, reference vs. obj).
+
   /**
    * Ensures the truth of an expression involving one or more parameters to the calling method.
    *
@@ -137,7 +140,7 @@
    *     string using {@link String#valueOf(Object)}
    * @throws IllegalArgumentException if {@code expression} is false
    */
-  public static void checkArgument(boolean expression, @Nullable Object errorMessage) {
+  public static void checkArgument(boolean expression, @CheckForNull Object errorMessage) {
     if (!expression) {
       throw new IllegalArgumentException(String.valueOf(errorMessage));
     }
@@ -158,8 +161,8 @@
    */
   public static void checkArgument(
       boolean expression,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object @Nullable ... errorMessageArgs) {
+      String errorMessageTemplate,
+      @CheckForNull @Nullable Object... errorMessageArgs) {
     if (!expression) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, errorMessageArgs));
     }
@@ -172,7 +175,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkArgument(boolean b, @Nullable String errorMessageTemplate, char p1) {
+  public static void checkArgument(boolean b, String errorMessageTemplate, char p1) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -185,7 +188,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkArgument(boolean b, @Nullable String errorMessageTemplate, int p1) {
+  public static void checkArgument(boolean b, String errorMessageTemplate, int p1) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -198,7 +201,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkArgument(boolean b, @Nullable String errorMessageTemplate, long p1) {
+  public static void checkArgument(boolean b, String errorMessageTemplate, long p1) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -212,7 +215,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -225,8 +228,33 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, char p1, char p2) {
+  public static void checkArgument(boolean b, String errorMessageTemplate, char p1, char p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, char p1, int p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, char p1, long p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -240,7 +268,46 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, char p1, int p2) {
+      boolean b, String errorMessageTemplate, char p1, @CheckForNull Object p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, int p1, char p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, int p1, int p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, int p1, long p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -254,7 +321,46 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, char p1, long p2) {
+      boolean b, String errorMessageTemplate, int p1, @CheckForNull Object p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, long p1, char p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, long p1, int p2) {
+    if (!b) {
+      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving one or more parameters to the calling method.
+   *
+   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkArgument(boolean b, String errorMessageTemplate, long p1, long p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -268,7 +374,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, char p1, @Nullable Object p2) {
+      boolean b, String errorMessageTemplate, long p1, @CheckForNull Object p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -282,7 +388,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, int p1, char p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, char p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -296,7 +402,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, int p1, int p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, int p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -310,7 +416,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, int p1, long p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, long p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -324,119 +430,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, int p1, @Nullable Object p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, long p1, char p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, long p1, int p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, long p1, long p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, long p1, @Nullable Object p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, char p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, int p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, long p2) {
-    if (!b) {
-      throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving one or more parameters to the calling method.
-   *
-   * <p>See {@link #checkArgument(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkArgument(
-      boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, @Nullable Object p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, @CheckForNull Object p2) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -451,10 +445,10 @@
    */
   public static void checkArgument(
       boolean b,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object p1,
-      @Nullable Object p2,
-      @Nullable Object p3) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2, p3));
     }
@@ -469,11 +463,11 @@
    */
   public static void checkArgument(
       boolean b,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object p1,
-      @Nullable Object p2,
-      @Nullable Object p3,
-      @Nullable Object p4) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3,
+      @CheckForNull Object p4) {
     if (!b) {
       throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, p1, p2, p3, p4));
     }
@@ -503,7 +497,7 @@
    * @throws IllegalStateException if {@code expression} is false
    * @see Verify#verify Verify.verify()
    */
-  public static void checkState(boolean expression, @Nullable Object errorMessage) {
+  public static void checkState(boolean expression, @CheckForNull Object errorMessage) {
     if (!expression) {
       throw new IllegalStateException(String.valueOf(errorMessage));
     }
@@ -526,8 +520,16 @@
    */
   public static void checkState(
       boolean expression,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object @Nullable ... errorMessageArgs) {
+      /*
+       * TODO(cpovirk): Consider removing @CheckForNull here, as we've done with the other methods'
+       * errorMessageTemplate parameters: It it unlikely that callers intend for their string
+       * template to be null (though we do handle that case gracefully at runtime). I've left this
+       * one as it is because one of our users has defined a wrapper API around Preconditions,
+       * declaring a checkState method that accepts a possibly null template. So we'd need to update
+       * that user first.
+       */
+      @CheckForNull String errorMessageTemplate,
+      @CheckForNull @Nullable Object... errorMessageArgs) {
     if (!expression) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, errorMessageArgs));
     }
@@ -541,7 +543,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(boolean b, @Nullable String errorMessageTemplate, char p1) {
+  public static void checkState(boolean b, String errorMessageTemplate, char p1) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -555,7 +557,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(boolean b, @Nullable String errorMessageTemplate, int p1) {
+  public static void checkState(boolean b, String errorMessageTemplate, int p1) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -569,7 +571,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(boolean b, @Nullable String errorMessageTemplate, long p1) {
+  public static void checkState(boolean b, String errorMessageTemplate, long p1) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -583,8 +585,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1) {
+  public static void checkState(boolean b, String errorMessageTemplate, @CheckForNull Object p1) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -598,8 +599,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, char p1, char p2) {
+  public static void checkState(boolean b, String errorMessageTemplate, char p1, char p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -613,7 +613,21 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(boolean b, @Nullable String errorMessageTemplate, char p1, int p2) {
+  public static void checkState(boolean b, String errorMessageTemplate, char p1, int p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, char p1, long p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -628,7 +642,49 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, char p1, long p2) {
+      boolean b, String errorMessageTemplate, char p1, @CheckForNull Object p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, int p1, char p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, int p1, int p2) {
+    if (!b) {
+      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures the truth of an expression involving the state of the calling instance, but not
+   * involving any parameters to the calling method.
+   *
+   * <p>See {@link #checkState(boolean, String, Object...)} for details.
+   *
+   * @since 20.0 (varargs overload since 2.0)
+   */
+  public static void checkState(boolean b, String errorMessageTemplate, int p1, long p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -643,7 +699,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, char p1, @Nullable Object p2) {
+      boolean b, String errorMessageTemplate, int p1, @CheckForNull Object p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -657,7 +713,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(boolean b, @Nullable String errorMessageTemplate, int p1, char p2) {
+  public static void checkState(boolean b, String errorMessageTemplate, long p1, char p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -671,7 +727,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(boolean b, @Nullable String errorMessageTemplate, int p1, int p2) {
+  public static void checkState(boolean b, String errorMessageTemplate, long p1, int p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -685,7 +741,7 @@
    *
    * @since 20.0 (varargs overload since 2.0)
    */
-  public static void checkState(boolean b, @Nullable String errorMessageTemplate, int p1, long p2) {
+  public static void checkState(boolean b, String errorMessageTemplate, long p1, long p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -700,7 +756,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, int p1, @Nullable Object p2) {
+      boolean b, String errorMessageTemplate, long p1, @CheckForNull Object p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -715,21 +771,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, long p1, char p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(boolean b, @Nullable String errorMessageTemplate, long p1, int p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, char p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -744,7 +786,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, long p1, long p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, int p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -759,7 +801,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, long p1, @Nullable Object p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, long p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -774,52 +816,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, char p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, int p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, long p2) {
-    if (!b) {
-      throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures the truth of an expression involving the state of the calling instance, but not
-   * involving any parameters to the calling method.
-   *
-   * <p>See {@link #checkState(boolean, String, Object...)} for details.
-   *
-   * @since 20.0 (varargs overload since 2.0)
-   */
-  public static void checkState(
-      boolean b, @Nullable String errorMessageTemplate, @Nullable Object p1, @Nullable Object p2) {
+      boolean b, String errorMessageTemplate, @CheckForNull Object p1, @CheckForNull Object p2) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -835,10 +832,10 @@
    */
   public static void checkState(
       boolean b,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object p1,
-      @Nullable Object p2,
-      @Nullable Object p3) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2, p3));
     }
@@ -854,16 +851,30 @@
    */
   public static void checkState(
       boolean b,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object p1,
-      @Nullable Object p2,
-      @Nullable Object p3,
-      @Nullable Object p4) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3,
+      @CheckForNull Object p4) {
     if (!b) {
       throw new IllegalStateException(lenientFormat(errorMessageTemplate, p1, p2, p3, p4));
     }
   }
 
+  /*
+   * Preconditions.checkNotNull is *intended* for performing eager null checks on parameters that a
+   * nullness checker can already "prove" are non-null. That means that the first parameter to
+   * checkNotNull *should* be annotated to require it to be non-null.
+   *
+   * However, for a variety of reasons, Google developers have written a ton of code over the past
+   * decade that assumes that they can use checkNotNull for non-precondition checks. I had hoped to
+   * take a principled stand on this, but the amount of such code is simply overwhelming. To avoid
+   * creating a lot of compile errors that users would not find to be informative, we're giving in
+   * and allowing callers to pass arguments that a nullness checker believes could be null.
+   *
+   * We still encourage people to use requireNonNull over checkNotNull for non-precondition checks.
+   */
+
   /**
    * Ensures that an object reference passed as a parameter to the calling method is not null.
    *
@@ -873,7 +884,7 @@
    * @see Verify#verifyNotNull Verify.verifyNotNull()
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(T reference) {
+  public static <T> T checkNotNull(@CheckForNull T reference) {
     if (reference == null) {
       throw new NullPointerException();
     }
@@ -891,8 +902,7 @@
    * @see Verify#verifyNotNull Verify.verifyNotNull()
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T reference, @Nullable Object errorMessage) {
+  public static <T> T checkNotNull(@CheckForNull T reference, @CheckForNull Object errorMessage) {
     if (reference == null) {
       throw new NullPointerException(String.valueOf(errorMessage));
     }
@@ -915,10 +925,10 @@
    * @see Verify#verifyNotNull Verify.verifyNotNull()
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T reference,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object @Nullable ... errorMessageArgs) {
+  public static <T> T checkNotNull(
+      @CheckForNull T reference,
+      String errorMessageTemplate,
+      @CheckForNull @Nullable Object... errorMessageArgs) {
     if (reference == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, errorMessageArgs));
     }
@@ -933,8 +943,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, char p1) {
+  public static <T> T checkNotNull(@CheckForNull T obj, String errorMessageTemplate, char p1) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -949,8 +958,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, int p1) {
+  public static <T> T checkNotNull(@CheckForNull T obj, String errorMessageTemplate, int p1) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -965,8 +973,7 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, long p1) {
+  public static <T> T checkNotNull(@CheckForNull T obj, String errorMessageTemplate, long p1) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -981,8 +988,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, @Nullable Object p1) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -997,8 +1004,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, char p1, char p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, char p1, char p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1013,8 +1020,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, char p1, int p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, char p1, int p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1029,8 +1036,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, char p1, long p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, char p1, long p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1045,8 +1052,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, char p1, @Nullable Object p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, char p1, @CheckForNull Object p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1061,8 +1068,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, int p1, char p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, int p1, char p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1077,8 +1084,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, int p1, int p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, int p1, int p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1093,8 +1100,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, int p1, long p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, int p1, long p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1109,8 +1116,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, int p1, @Nullable Object p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, int p1, @CheckForNull Object p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1125,8 +1132,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, long p1, char p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, long p1, char p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1141,8 +1148,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, long p1, int p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, long p1, int p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1157,8 +1164,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, long p1, long p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, long p1, long p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1173,8 +1180,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, long p1, @Nullable Object p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, long p1, @CheckForNull Object p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1189,8 +1196,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, @Nullable Object p1, char p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1, char p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1205,8 +1212,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, @Nullable Object p1, int p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1, int p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1221,8 +1228,8 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, @Nullable Object p1, long p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj, String errorMessageTemplate, @CheckForNull Object p1, long p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1237,8 +1244,11 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj, @Nullable String errorMessageTemplate, @Nullable Object p1, @Nullable Object p2) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj,
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -1253,12 +1263,12 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object p1,
-      @Nullable Object p2,
-      @Nullable Object p3) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj,
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2, p3));
     }
@@ -1273,13 +1283,13 @@
    * @since 20.0 (varargs overload since 2.0)
    */
   @CanIgnoreReturnValue
-  public static <T extends @NonNull Object> T checkNotNull(
-      T obj,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object p1,
-      @Nullable Object p2,
-      @Nullable Object p3,
-      @Nullable Object p4) {
+  public static <T> T checkNotNull(
+      @CheckForNull T obj,
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3,
+      @CheckForNull Object p4) {
     if (obj == null) {
       throw new NullPointerException(lenientFormat(errorMessageTemplate, p1, p2, p3, p4));
     }
@@ -1339,7 +1349,7 @@
    * @throws IllegalArgumentException if {@code size} is negative
    */
   @CanIgnoreReturnValue
-  public static int checkElementIndex(int index, int size, @Nullable String desc) {
+  public static int checkElementIndex(int index, int size, String desc) {
     // Carefully optimized for execution by hotspot (explanatory comment above)
     if (index < 0 || index >= size) {
       throw new IndexOutOfBoundsException(badElementIndex(index, size, desc));
@@ -1347,7 +1357,7 @@
     return index;
   }
 
-  private static String badElementIndex(int index, int size, @Nullable String desc) {
+  private static String badElementIndex(int index, int size, String desc) {
     if (index < 0) {
       return lenientFormat("%s (%s) must not be negative", desc, index);
     } else if (size < 0) {
@@ -1384,7 +1394,7 @@
    * @throws IllegalArgumentException if {@code size} is negative
    */
   @CanIgnoreReturnValue
-  public static int checkPositionIndex(int index, int size, @Nullable String desc) {
+  public static int checkPositionIndex(int index, int size, String desc) {
     // Carefully optimized for execution by hotspot (explanatory comment above)
     if (index < 0 || index > size) {
       throw new IndexOutOfBoundsException(badPositionIndex(index, size, desc));
@@ -1392,7 +1402,7 @@
     return index;
   }
 
-  private static String badPositionIndex(int index, int size, @Nullable String desc) {
+  private static String badPositionIndex(int index, int size, String desc) {
     if (index < 0) {
       return lenientFormat("%s (%s) must not be negative", desc, index);
     } else if (size < 0) {
diff --git a/guava/src/com/google/common/base/Predicate.java b/guava/src/com/google/common/base/Predicate.java
index a116cec..4384ed0 100644
--- a/guava/src/com/google/common/base/Predicate.java
+++ b/guava/src/com/google/common/base/Predicate.java
@@ -16,6 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -42,7 +43,8 @@
  */
 @FunctionalInterface
 @GwtCompatible
-public interface Predicate<T> extends java.util.function.Predicate<T> {
+@ElementTypesAreNonnullByDefault
+public interface Predicate<T extends @Nullable Object> extends java.util.function.Predicate<T> {
   /**
    * Returns the result of applying this predicate to {@code input} (Java 8 users, see notes in the
    * class documentation above). This method is <i>generally expected</i>, but not absolutely
@@ -59,7 +61,7 @@
    *     arguments
    */
   @CanIgnoreReturnValue
-  boolean apply(@Nullable T input);
+  boolean apply(@ParametricNullness T input);
 
   /**
    * Indicates whether another object is equal to this predicate.
@@ -72,10 +74,10 @@
    * predicates are known <i>not</i> to be interchangeable.
    */
   @Override
-  boolean equals(@Nullable Object object);
+  boolean equals(@CheckForNull Object object);
 
   @Override
-  default boolean test(@Nullable T input) {
+  default boolean test(@ParametricNullness T input) {
     return apply(input);
   }
 }
diff --git a/guava/src/com/google/common/base/Predicates.java b/guava/src/com/google/common/base/Predicates.java
index 033ab6c..c3b5562 100644
--- a/guava/src/com/google/common/base/Predicates.java
+++ b/guava/src/com/google/common/base/Predicates.java
@@ -25,6 +25,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.regex.Pattern;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -39,6 +40,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Predicates {
   private Predicates() {}
 
@@ -47,13 +49,13 @@
 
   /** Returns a predicate that always evaluates to {@code true}. */
   @GwtCompatible(serializable = true)
-  public static <T> Predicate<T> alwaysTrue() {
+  public static <T extends @Nullable Object> Predicate<T> alwaysTrue() {
     return ObjectPredicate.ALWAYS_TRUE.withNarrowedType();
   }
 
   /** Returns a predicate that always evaluates to {@code false}. */
   @GwtCompatible(serializable = true)
-  public static <T> Predicate<T> alwaysFalse() {
+  public static <T extends @Nullable Object> Predicate<T> alwaysFalse() {
     return ObjectPredicate.ALWAYS_FALSE.withNarrowedType();
   }
 
@@ -62,7 +64,7 @@
    * null.
    */
   @GwtCompatible(serializable = true)
-  public static <T> Predicate<T> isNull() {
+  public static <T extends @Nullable Object> Predicate<T> isNull() {
     return ObjectPredicate.IS_NULL.withNarrowedType();
   }
 
@@ -71,7 +73,7 @@
    * null.
    */
   @GwtCompatible(serializable = true)
-  public static <T> Predicate<T> notNull() {
+  public static <T extends @Nullable Object> Predicate<T> notNull() {
     return ObjectPredicate.NOT_NULL.withNarrowedType();
   }
 
@@ -79,7 +81,7 @@
    * Returns a predicate that evaluates to {@code true} if the given predicate evaluates to {@code
    * false}.
    */
-  public static <T> Predicate<T> not(Predicate<T> predicate) {
+  public static <T extends @Nullable Object> Predicate<T> not(Predicate<T> predicate) {
     return new NotPredicate<T>(predicate);
   }
 
@@ -90,7 +92,8 @@
    * changes to it won't alter the behavior of this predicate. If {@code components} is empty, the
    * returned predicate will always evaluate to {@code true}.
    */
-  public static <T> Predicate<T> and(Iterable<? extends Predicate<? super T>> components) {
+  public static <T extends @Nullable Object> Predicate<T> and(
+      Iterable<? extends Predicate<? super T>> components) {
     return new AndPredicate<T>(defensiveCopy(components));
   }
 
@@ -102,7 +105,7 @@
    * returned predicate will always evaluate to {@code true}.
    */
   @SafeVarargs
-  public static <T> Predicate<T> and(Predicate<? super T>... components) {
+  public static <T extends @Nullable Object> Predicate<T> and(Predicate<? super T>... components) {
     return new AndPredicate<T>(defensiveCopy(components));
   }
 
@@ -111,7 +114,8 @@
    * true}. The components are evaluated in order, and evaluation will be "short-circuited" as soon
    * as a false predicate is found.
    */
-  public static <T> Predicate<T> and(Predicate<? super T> first, Predicate<? super T> second) {
+  public static <T extends @Nullable Object> Predicate<T> and(
+      Predicate<? super T> first, Predicate<? super T> second) {
     return new AndPredicate<T>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
   }
 
@@ -122,7 +126,8 @@
    * changes to it won't alter the behavior of this predicate. If {@code components} is empty, the
    * returned predicate will always evaluate to {@code false}.
    */
-  public static <T> Predicate<T> or(Iterable<? extends Predicate<? super T>> components) {
+  public static <T extends @Nullable Object> Predicate<T> or(
+      Iterable<? extends Predicate<? super T>> components) {
     return new OrPredicate<T>(defensiveCopy(components));
   }
 
@@ -134,7 +139,7 @@
    * returned predicate will always evaluate to {@code false}.
    */
   @SafeVarargs
-  public static <T> Predicate<T> or(Predicate<? super T>... components) {
+  public static <T extends @Nullable Object> Predicate<T> or(Predicate<? super T>... components) {
     return new OrPredicate<T>(defensiveCopy(components));
   }
 
@@ -143,7 +148,8 @@
    * {@code true}. The components are evaluated in order, and evaluation will be "short-circuited"
    * as soon as a true predicate is found.
    */
-  public static <T> Predicate<T> or(Predicate<? super T> first, Predicate<? super T> second) {
+  public static <T extends @Nullable Object> Predicate<T> or(
+      Predicate<? super T> first, Predicate<? super T> second) {
     return new OrPredicate<T>(Predicates.<T>asList(checkNotNull(first), checkNotNull(second)));
   }
 
@@ -151,8 +157,10 @@
    * Returns a predicate that evaluates to {@code true} if the object being tested {@code equals()}
    * the given target or both are null.
    */
-  public static <T> Predicate<T> equalTo(@Nullable T target) {
-    return (target == null) ? Predicates.<T>isNull() : new IsEqualToPredicate<T>(target);
+  public static <T extends @Nullable Object> Predicate<T> equalTo(@ParametricNullness T target) {
+    return (target == null)
+        ? Predicates.<T>isNull()
+        : new IsEqualToPredicate(target).withNarrowedType();
   }
 
   /**
@@ -169,8 +177,8 @@
    * instances {@code Lists.newArrayList(1)} and {@code Arrays.asList(1)}.
    */
   @GwtIncompatible // Class.isInstance
-  public static Predicate<Object> instanceOf(Class<?> clazz) {
-    return new InstanceOfPredicate(clazz);
+  public static <T extends @Nullable Object> Predicate<T> instanceOf(Class<?> clazz) {
+    return new InstanceOfPredicate<>(clazz);
   }
 
   /**
@@ -204,7 +212,7 @@
    *
    * @param target the collection that may contain the function input
    */
-  public static <T> Predicate<T> in(Collection<? extends T> target) {
+  public static <T extends @Nullable Object> Predicate<T> in(Collection<? extends T> target) {
     return new InPredicate<T>(target);
   }
 
@@ -214,7 +222,7 @@
    *
    * @return the composition of the provided function and predicate
    */
-  public static <A, B> Predicate<A> compose(
+  public static <A extends @Nullable Object, B extends @Nullable Object> Predicate<A> compose(
       Predicate<B> predicate, Function<A, ? extends B> function) {
     return new CompositionPredicate<>(predicate, function);
   }
@@ -247,11 +255,11 @@
   // End public API, begin private implementation classes.
 
   // Package private for GWT serialization.
-  enum ObjectPredicate implements Predicate<Object> {
+  enum ObjectPredicate implements Predicate<@Nullable Object> {
     /** @see Predicates#alwaysTrue() */
     ALWAYS_TRUE {
       @Override
-      public boolean apply(@Nullable Object o) {
+      public boolean apply(@CheckForNull Object o) {
         return true;
       }
 
@@ -263,7 +271,7 @@
     /** @see Predicates#alwaysFalse() */
     ALWAYS_FALSE {
       @Override
-      public boolean apply(@Nullable Object o) {
+      public boolean apply(@CheckForNull Object o) {
         return false;
       }
 
@@ -275,7 +283,7 @@
     /** @see Predicates#isNull() */
     IS_NULL {
       @Override
-      public boolean apply(@Nullable Object o) {
+      public boolean apply(@CheckForNull Object o) {
         return o == null;
       }
 
@@ -287,7 +295,7 @@
     /** @see Predicates#notNull() */
     NOT_NULL {
       @Override
-      public boolean apply(@Nullable Object o) {
+      public boolean apply(@CheckForNull Object o) {
         return o != null;
       }
 
@@ -298,13 +306,14 @@
     };
 
     @SuppressWarnings("unchecked") // safe contravariant cast
-    <T> Predicate<T> withNarrowedType() {
+    <T extends @Nullable Object> Predicate<T> withNarrowedType() {
       return (Predicate<T>) this;
     }
   }
 
   /** @see Predicates#not(Predicate) */
-  private static class NotPredicate<T> implements Predicate<T>, Serializable {
+  private static class NotPredicate<T extends @Nullable Object>
+      implements Predicate<T>, Serializable {
     final Predicate<T> predicate;
 
     NotPredicate(Predicate<T> predicate) {
@@ -312,7 +321,7 @@
     }
 
     @Override
-    public boolean apply(@Nullable T t) {
+    public boolean apply(@ParametricNullness T t) {
       return !predicate.apply(t);
     }
 
@@ -322,7 +331,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof NotPredicate) {
         NotPredicate<?> that = (NotPredicate<?>) obj;
         return predicate.equals(that.predicate);
@@ -339,7 +348,8 @@
   }
 
   /** @see Predicates#and(Iterable) */
-  private static class AndPredicate<T> implements Predicate<T>, Serializable {
+  private static class AndPredicate<T extends @Nullable Object>
+      implements Predicate<T>, Serializable {
     private final List<? extends Predicate<? super T>> components;
 
     private AndPredicate(List<? extends Predicate<? super T>> components) {
@@ -347,7 +357,7 @@
     }
 
     @Override
-    public boolean apply(@Nullable T t) {
+    public boolean apply(@ParametricNullness T t) {
       // Avoid using the Iterator to avoid generating garbage (issue 820).
       for (int i = 0; i < components.size(); i++) {
         if (!components.get(i).apply(t)) {
@@ -364,7 +374,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof AndPredicate) {
         AndPredicate<?> that = (AndPredicate<?>) obj;
         return components.equals(that.components);
@@ -381,7 +391,8 @@
   }
 
   /** @see Predicates#or(Iterable) */
-  private static class OrPredicate<T> implements Predicate<T>, Serializable {
+  private static class OrPredicate<T extends @Nullable Object>
+      implements Predicate<T>, Serializable {
     private final List<? extends Predicate<? super T>> components;
 
     private OrPredicate(List<? extends Predicate<? super T>> components) {
@@ -389,7 +400,7 @@
     }
 
     @Override
-    public boolean apply(@Nullable T t) {
+    public boolean apply(@ParametricNullness T t) {
       // Avoid using the Iterator to avoid generating garbage (issue 820).
       for (int i = 0; i < components.size(); i++) {
         if (components.get(i).apply(t)) {
@@ -406,7 +417,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof OrPredicate) {
         OrPredicate<?> that = (OrPredicate<?>) obj;
         return components.equals(that.components);
@@ -436,16 +447,16 @@
   }
 
   /** @see Predicates#equalTo(Object) */
-  private static class IsEqualToPredicate<T> implements Predicate<T>, Serializable {
-    private final T target;
+  private static class IsEqualToPredicate implements Predicate<@Nullable Object>, Serializable {
+    private final Object target;
 
-    private IsEqualToPredicate(T target) {
+    private IsEqualToPredicate(Object target) {
       this.target = target;
     }
 
     @Override
-    public boolean apply(T t) {
-      return target.equals(t);
+    public boolean apply(@CheckForNull Object o) {
+      return target.equals(o);
     }
 
     @Override
@@ -454,9 +465,9 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof IsEqualToPredicate) {
-        IsEqualToPredicate<?> that = (IsEqualToPredicate<?>) obj;
+        IsEqualToPredicate that = (IsEqualToPredicate) obj;
         return target.equals(that.target);
       }
       return false;
@@ -468,11 +479,17 @@
     }
 
     private static final long serialVersionUID = 0;
+
+    @SuppressWarnings("unchecked") // safe contravariant cast
+    <T extends @Nullable Object> Predicate<T> withNarrowedType() {
+      return (Predicate<T>) this;
+    }
   }
 
   /** @see Predicates#instanceOf(Class) */
   @GwtIncompatible // Class.isInstance
-  private static class InstanceOfPredicate implements Predicate<Object>, Serializable {
+  private static class InstanceOfPredicate<T extends @Nullable Object>
+      implements Predicate<T>, Serializable {
     private final Class<?> clazz;
 
     private InstanceOfPredicate(Class<?> clazz) {
@@ -480,7 +497,7 @@
     }
 
     @Override
-    public boolean apply(@Nullable Object o) {
+    public boolean apply(@ParametricNullness T o) {
       return clazz.isInstance(o);
     }
 
@@ -490,9 +507,9 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof InstanceOfPredicate) {
-        InstanceOfPredicate that = (InstanceOfPredicate) obj;
+        InstanceOfPredicate<?> that = (InstanceOfPredicate<?>) obj;
         return clazz == that.clazz;
       }
       return false;
@@ -526,7 +543,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof SubtypeOfPredicate) {
         SubtypeOfPredicate that = (SubtypeOfPredicate) obj;
         return clazz == that.clazz;
@@ -543,7 +560,8 @@
   }
 
   /** @see Predicates#in(Collection) */
-  private static class InPredicate<T> implements Predicate<T>, Serializable {
+  private static class InPredicate<T extends @Nullable Object>
+      implements Predicate<T>, Serializable {
     private final Collection<?> target;
 
     private InPredicate(Collection<?> target) {
@@ -551,7 +569,7 @@
     }
 
     @Override
-    public boolean apply(@Nullable T t) {
+    public boolean apply(@ParametricNullness T t) {
       try {
         return target.contains(t);
       } catch (NullPointerException | ClassCastException e) {
@@ -560,7 +578,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof InPredicate) {
         InPredicate<?> that = (InPredicate<?>) obj;
         return target.equals(that.target);
@@ -582,7 +600,8 @@
   }
 
   /** @see Predicates#compose(Predicate, Function) */
-  private static class CompositionPredicate<A, B> implements Predicate<A>, Serializable {
+  private static class CompositionPredicate<A extends @Nullable Object, B extends @Nullable Object>
+      implements Predicate<A>, Serializable {
     final Predicate<B> p;
     final Function<A, ? extends B> f;
 
@@ -592,12 +611,12 @@
     }
 
     @Override
-    public boolean apply(@Nullable A a) {
+    public boolean apply(@ParametricNullness A a) {
       return p.apply(f.apply(a));
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof CompositionPredicate) {
         CompositionPredicate<?, ?> that = (CompositionPredicate<?, ?>) obj;
         return f.equals(that.f) && p.equals(that.p);
@@ -642,7 +661,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof ContainsPatternPredicate) {
         ContainsPatternPredicate that = (ContainsPatternPredicate) obj;
 
@@ -683,7 +702,7 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static <T> List<Predicate<? super T>> asList(
+  private static <T extends @Nullable Object> List<Predicate<? super T>> asList(
       Predicate<? super T> first, Predicate<? super T> second) {
     // TODO(kevinb): understand why we still get a warning despite @SafeVarargs!
     return Arrays.<Predicate<? super T>>asList(first, second);
diff --git a/guava/src/com/google/common/base/Present.java b/guava/src/com/google/common/base/Present.java
index a25de82..59efebc 100644
--- a/guava/src/com/google/common/base/Present.java
+++ b/guava/src/com/google/common/base/Present.java
@@ -19,10 +19,11 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Collections;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /** Implementation of an {@link Optional} containing a reference. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class Present<T> extends Optional<T> {
   private final T reference;
 
@@ -77,7 +78,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Present) {
       Present<?> other = (Present<?>) object;
       return reference.equals(other.reference);
diff --git a/guava/src/com/google/common/base/SmallCharMatcher.java b/guava/src/com/google/common/base/SmallCharMatcher.java
index 1e565c8..f0e801b 100644
--- a/guava/src/com/google/common/base/SmallCharMatcher.java
+++ b/guava/src/com/google/common/base/SmallCharMatcher.java
@@ -26,6 +26,7 @@
  * @author Christopher Swenson
  */
 @GwtIncompatible // no precomputation is done in GWT
+@ElementTypesAreNonnullByDefault
 final class SmallCharMatcher extends NamedFastMatcher {
   static final int MAX_SIZE = 1023;
   private final char[] table;
diff --git a/guava/src/com/google/common/base/Splitter.java b/guava/src/com/google/common/base/Splitter.java
index e0b498e..e60e988 100644
--- a/guava/src/com/google/common/base/Splitter.java
+++ b/guava/src/com/google/common/base/Splitter.java
@@ -29,6 +29,7 @@
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
+import javax.annotation.CheckForNull;
 
 /**
  * Extracts non-overlapping substrings from an input string, typically by recognizing appearances of
@@ -99,6 +100,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Splitter {
   private final CharMatcher trimmer;
   private final boolean omitEmptyStrings;
@@ -564,6 +566,7 @@
       this.toSplit = toSplit;
     }
 
+    @CheckForNull
     @Override
     protected String computeNext() {
       /*
diff --git a/guava/src/com/google/common/base/StandardSystemProperty.java b/guava/src/com/google/common/base/StandardSystemProperty.java
index 7a7b115..dc29792 100644
--- a/guava/src/com/google/common/base/StandardSystemProperty.java
+++ b/guava/src/com/google/common/base/StandardSystemProperty.java
@@ -15,7 +15,7 @@
 package com.google.common.base;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Represents a {@linkplain System#getProperties() standard system property}.
@@ -24,6 +24,7 @@
  * @since 15.0
  */
 @GwtIncompatible // java.lang.System#getProperty
+@ElementTypesAreNonnullByDefault
 public enum StandardSystemProperty {
 
   /** Java Runtime Environment version. */
@@ -80,7 +81,15 @@
   /** Name of JIT compiler to use. */
   JAVA_COMPILER("java.compiler"),
 
-  /** Path of extension directory or directories. */
+  /**
+   * Path of extension directory or directories.
+   *
+   * @deprecated This property was <a
+   *     href="https://openjdk.java.net/jeps/220#Removed:-The-extension-mechanism">deprecated</a> in
+   *     Java 8 and removed in Java 9. We do not plan to remove this API from Guava, but if you are
+   *     using it, it is probably not doing what you want.
+   */
+  @Deprecated
   JAVA_EXT_DIRS("java.ext.dirs"),
 
   /** Operating system name. */
@@ -124,8 +133,28 @@
   /**
    * Returns the current value for this system property by delegating to {@link
    * System#getProperty(String)}.
+   *
+   * <p>The value returned by this method is non-null except in rare circumstances:
+   *
+   * <ul>
+   *   <li>{@link #JAVA_EXT_DIRS} was deprecated in Java 8 and removed in Java 9. We have not
+   *       confirmed whether it is available under older versions.
+   *   <li>{@link #JAVA_COMPILER}, while still listed as required as of Java 15, is typically not
+   *       available even under older version.
+   *   <li>Any property may be cleared through APIs like {@link System#clearProperty}.
+   *   <li>Unusual environments like GWT may have their own special handling of system properties.
+   * </ul>
+   *
+   * <p>Note that {@code StandardSystemProperty} does not provide constants for more recently added
+   * properties, including:
+   *
+   * <ul>
+   *   <li>{@code java.vendor.version} (added in Java 11, listed as optional as of Java 13)
+   *   <li>{@code jdk.module.*} (added in Java 9, optional)
+   * </ul>
    */
-  public @Nullable String value() {
+  @CheckForNull
+  public String value() {
     return System.getProperty(key);
   }
 
diff --git a/guava/src/com/google/common/base/Stopwatch.java b/guava/src/com/google/common/base/Stopwatch.java
index e4cca1f..9d5282d 100644
--- a/guava/src/com/google/common/base/Stopwatch.java
+++ b/guava/src/com/google/common/base/Stopwatch.java
@@ -79,7 +79,7 @@
  * Stopwatch.createStarted(
  *      new Ticker() {
  *        public long read() {
- *          return android.os.SystemClock.elapsedRealtimeNanos();
+ *          return android.os.SystemClock.elapsedRealtimeNanos(); // requires API Level 17
  *        }
  *      });
  * }</pre>
@@ -89,6 +89,7 @@
  */
 @GwtCompatible(emulated = true)
 @SuppressWarnings("GoodTime") // lots of violations
+@ElementTypesAreNonnullByDefault
 public final class Stopwatch {
   private final Ticker ticker;
   private boolean isRunning;
diff --git a/guava/src/com/google/common/base/Strings.java b/guava/src/com/google/common/base/Strings.java
index f02b64e..e56bf1c 100644
--- a/guava/src/com/google/common/base/Strings.java
+++ b/guava/src/com/google/common/base/Strings.java
@@ -20,7 +20,10 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.errorprone.annotations.InlineMe;
+import com.google.errorprone.annotations.InlineMeValidationDisabled;
 import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -30,6 +33,7 @@
  * @since 3.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Strings {
   private Strings() {}
 
@@ -39,7 +43,7 @@
    * @param string the string to test and possibly return
    * @return {@code string} itself if it is non-null; {@code ""} if it is null
    */
-  public static String nullToEmpty(@Nullable String string) {
+  public static String nullToEmpty(@CheckForNull String string) {
     return Platform.nullToEmpty(string);
   }
 
@@ -49,7 +53,8 @@
    * @param string the string to test and possibly return
    * @return {@code string} itself if it is nonempty; {@code null} if it is empty or null
    */
-  public static @Nullable String emptyToNull(@Nullable String string) {
+  @CheckForNull
+  public static String emptyToNull(@CheckForNull String string) {
     return Platform.emptyToNull(string);
   }
 
@@ -64,7 +69,7 @@
    * @param string a string reference to check
    * @return {@code true} if the string is null or is the empty string
    */
-  public static boolean isNullOrEmpty(@Nullable String string) {
+  public static boolean isNullOrEmpty(@CheckForNull String string) {
     return Platform.stringIsNullOrEmpty(string);
   }
 
@@ -134,12 +139,16 @@
    * Returns a string consisting of a specific number of concatenated copies of an input string. For
    * example, {@code repeat("hey", 3)} returns the string {@code "heyheyhey"}.
    *
+   * <p><b>Java 11+ users:</b> use {@code string.repeat(count)} instead.
+   *
    * @param string any non-null string
    * @param count the number of times to repeat it; a nonnegative integer
    * @return a string containing {@code string} repeated {@code count} times (the empty string if
    *     {@code count} is zero)
    * @throws IllegalArgumentException if {@code count} is negative
    */
+  @InlineMe(replacement = "string.repeat(count)")
+  @InlineMeValidationDisabled("Java 11+ API only")
   public static String repeat(String string, int count) {
     checkNotNull(string); // eager for GWT.
 
@@ -257,7 +266,7 @@
    */
   // TODO(diamondm) consider using Arrays.toString() for array parameters
   public static String lenientFormat(
-      @Nullable String template, @Nullable Object @Nullable ... args) {
+      @CheckForNull String template, @CheckForNull @Nullable Object... args) {
     template = String.valueOf(template); // null -> "null"
 
     if (args == null) {
@@ -297,7 +306,7 @@
     return builder.toString();
   }
 
-  private static String lenientToString(@Nullable Object o) {
+  private static String lenientToString(@CheckForNull Object o) {
     if (o == null) {
       return "null";
     }
diff --git a/guava/src/com/google/common/base/Supplier.java b/guava/src/com/google/common/base/Supplier.java
index 0226d1d..08f96be 100644
--- a/guava/src/com/google/common/base/Supplier.java
+++ b/guava/src/com/google/common/base/Supplier.java
@@ -16,6 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Legacy version of {@link java.util.function.Supplier java.util.function.Supplier}. Semantically,
@@ -37,7 +38,8 @@
  */
 @GwtCompatible
 @FunctionalInterface
-public interface Supplier<T> extends java.util.function.Supplier<T> {
+@ElementTypesAreNonnullByDefault
+public interface Supplier<T extends @Nullable Object> extends java.util.function.Supplier<T> {
   /**
    * Retrieves an instance of the appropriate type. The returned object may or may not be a new
    * instance, depending on the implementation.
@@ -46,5 +48,6 @@
    */
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   T get();
 }
diff --git a/guava/src/com/google/common/base/Suppliers.java b/guava/src/com/google/common/base/Suppliers.java
index b02b32e..57d3486 100644
--- a/guava/src/com/google/common/base/Suppliers.java
+++ b/guava/src/com/google/common/base/Suppliers.java
@@ -14,13 +14,16 @@
 
 package com.google.common.base;
 
+import static com.google.common.base.NullnessCasts.uncheckedCastNullableTToT;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import java.io.Serializable;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -33,6 +36,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Suppliers {
   private Suppliers() {}
 
@@ -42,11 +46,13 @@
    * and then applying {@code function} to that value. Note that the resulting supplier will not
    * call {@code supplier} or invoke {@code function} until it is called.
    */
-  public static <F, T> Supplier<T> compose(Function<? super F, T> function, Supplier<F> supplier) {
+  public static <F extends @Nullable Object, T extends @Nullable Object> Supplier<T> compose(
+      Function<? super F, T> function, Supplier<F> supplier) {
     return new SupplierComposition<>(function, supplier);
   }
 
-  private static class SupplierComposition<F, T> implements Supplier<T>, Serializable {
+  private static class SupplierComposition<F extends @Nullable Object, T extends @Nullable Object>
+      implements Supplier<T>, Serializable {
     final Function<? super F, T> function;
     final Supplier<F> supplier;
 
@@ -56,12 +62,13 @@
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       return function.apply(supplier.get());
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof SupplierComposition) {
         SupplierComposition<?, ?> that = (SupplierComposition<?, ?>) obj;
         return function.equals(that.function) && supplier.equals(that.supplier);
@@ -98,7 +105,7 @@
    * <p>If {@code delegate} is an instance created by an earlier call to {@code memoize}, it is
    * returned directly.
    */
-  public static <T> Supplier<T> memoize(Supplier<T> delegate) {
+  public static <T extends @Nullable Object> Supplier<T> memoize(Supplier<T> delegate) {
     if (delegate instanceof NonSerializableMemoizingSupplier
         || delegate instanceof MemoizingSupplier) {
       return delegate;
@@ -109,18 +116,19 @@
   }
 
   @VisibleForTesting
-  static class MemoizingSupplier<T> implements Supplier<T>, Serializable {
+  static class MemoizingSupplier<T extends @Nullable Object> implements Supplier<T>, Serializable {
     final Supplier<T> delegate;
     transient volatile boolean initialized;
     // "value" does not need to be volatile; visibility piggy-backs
     // on volatile read of "initialized".
-    transient @Nullable T value;
+    @CheckForNull transient T value;
 
     MemoizingSupplier(Supplier<T> delegate) {
       this.delegate = checkNotNull(delegate);
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       // A 2-field variant of Double Checked Locking.
       if (!initialized) {
@@ -133,7 +141,8 @@
           }
         }
       }
-      return value;
+      // This is safe because we checked `initialized.`
+      return uncheckedCastNullableTToT(value);
     }
 
     @Override
@@ -147,24 +156,31 @@
   }
 
   @VisibleForTesting
-  static class NonSerializableMemoizingSupplier<T> implements Supplier<T> {
-    volatile Supplier<T> delegate;
+  static class NonSerializableMemoizingSupplier<T extends @Nullable Object> implements Supplier<T> {
+    @CheckForNull volatile Supplier<T> delegate;
     volatile boolean initialized;
     // "value" does not need to be volatile; visibility piggy-backs
     // on volatile read of "initialized".
-    @Nullable T value;
+    @CheckForNull T value;
 
     NonSerializableMemoizingSupplier(Supplier<T> delegate) {
       this.delegate = checkNotNull(delegate);
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       // A 2-field variant of Double Checked Locking.
       if (!initialized) {
         synchronized (this) {
           if (!initialized) {
-            T t = delegate.get();
+            /*
+             * requireNonNull is safe because we read and write `delegate` under synchronization.
+             *
+             * TODO(cpovirk): To avoid having to check for null, replace `delegate` with a singleton
+             * `Supplier` that always throws an exception.
+             */
+            T t = requireNonNull(delegate).get();
             value = t;
             initialized = true;
             // Release the delegate to GC.
@@ -173,7 +189,8 @@
           }
         }
       }
-      return value;
+      // This is safe because we checked `initialized.`
+      return uncheckedCastNullableTToT(value);
     }
 
     @Override
@@ -207,17 +224,18 @@
    * @since 2.0
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  public static <T> Supplier<T> memoizeWithExpiration(
+  public static <T extends @Nullable Object> Supplier<T> memoizeWithExpiration(
       Supplier<T> delegate, long duration, TimeUnit unit) {
     return new ExpiringMemoizingSupplier<T>(delegate, duration, unit);
   }
 
   @VisibleForTesting
   @SuppressWarnings("GoodTime") // lots of violations
-  static class ExpiringMemoizingSupplier<T> implements Supplier<T>, Serializable {
+  static class ExpiringMemoizingSupplier<T extends @Nullable Object>
+      implements Supplier<T>, Serializable {
     final Supplier<T> delegate;
     final long durationNanos;
-    transient volatile @Nullable T value;
+    @CheckForNull transient volatile T value;
     // The special value 0 means "not yet initialized".
     transient volatile long expirationNanos;
 
@@ -228,6 +246,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       // Another variant of Double Checked Locking.
       //
@@ -250,7 +269,8 @@
           }
         }
       }
-      return value;
+      // This is safe because we checked `expirationNanos.`
+      return uncheckedCastNullableTToT(value);
     }
 
     @Override
@@ -264,24 +284,27 @@
   }
 
   /** Returns a supplier that always supplies {@code instance}. */
-  public static <T> Supplier<T> ofInstance(@Nullable T instance) {
+  public static <T extends @Nullable Object> Supplier<T> ofInstance(
+      @ParametricNullness T instance) {
     return new SupplierOfInstance<T>(instance);
   }
 
-  private static class SupplierOfInstance<T> implements Supplier<T>, Serializable {
-    final @Nullable T instance;
+  private static class SupplierOfInstance<T extends @Nullable Object>
+      implements Supplier<T>, Serializable {
+    @ParametricNullness final T instance;
 
-    SupplierOfInstance(@Nullable T instance) {
+    SupplierOfInstance(@ParametricNullness T instance) {
       this.instance = instance;
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       return instance;
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof SupplierOfInstance) {
         SupplierOfInstance<?> that = (SupplierOfInstance<?>) obj;
         return Objects.equal(instance, that.instance);
@@ -306,11 +329,13 @@
    * Returns a supplier whose {@code get()} method synchronizes on {@code delegate} before calling
    * it, making it thread-safe.
    */
-  public static <T> Supplier<T> synchronizedSupplier(Supplier<T> delegate) {
+  public static <T extends @Nullable Object> Supplier<T> synchronizedSupplier(
+      Supplier<T> delegate) {
     return new ThreadSafeSupplier<T>(delegate);
   }
 
-  private static class ThreadSafeSupplier<T> implements Supplier<T>, Serializable {
+  private static class ThreadSafeSupplier<T extends @Nullable Object>
+      implements Supplier<T>, Serializable {
     final Supplier<T> delegate;
 
     ThreadSafeSupplier(Supplier<T> delegate) {
@@ -318,6 +343,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T get() {
       synchronized (delegate) {
         return delegate.get();
@@ -340,20 +366,21 @@
    *
    * @since 8.0
    */
-  public static <T> Function<Supplier<T>, T> supplierFunction() {
+  public static <T extends @Nullable Object> Function<Supplier<T>, T> supplierFunction() {
     @SuppressWarnings("unchecked") // implementation is "fully variant"
     SupplierFunction<T> sf = (SupplierFunction<T>) SupplierFunctionImpl.INSTANCE;
     return sf;
   }
 
-  private interface SupplierFunction<T> extends Function<Supplier<T>, T> {}
+  private interface SupplierFunction<T extends @Nullable Object> extends Function<Supplier<T>, T> {}
 
-  private enum SupplierFunctionImpl implements SupplierFunction<Object> {
+  private enum SupplierFunctionImpl implements SupplierFunction<@Nullable Object> {
     INSTANCE;
 
     // Note: This makes T a "pass-through type"
     @Override
-    public Object apply(Supplier<Object> input) {
+    @CheckForNull
+    public Object apply(Supplier<@Nullable Object> input) {
       return input.get();
     }
 
diff --git a/guava/src/com/google/common/base/Throwables.java b/guava/src/com/google/common/base/Throwables.java
index e50a416..7832d18 100644
--- a/guava/src/com/google/common/base/Throwables.java
+++ b/guava/src/com/google/common/base/Throwables.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static java.util.Arrays.asList;
 import static java.util.Collections.unmodifiableList;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -32,7 +33,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to instances of {@link Throwable}.
@@ -45,6 +46,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Throwables {
   private Throwables() {}
 
@@ -99,7 +101,7 @@
   @Deprecated
   @GwtIncompatible // throwIfInstanceOf
   public static <X extends Throwable> void propagateIfInstanceOf(
-      @Nullable Throwable throwable, Class<X> declaredType) throws X {
+      @CheckForNull Throwable throwable, Class<X> declaredType) throws X {
     if (throwable != null) {
       throwIfInstanceOf(throwable, declaredType);
     }
@@ -154,7 +156,7 @@
    */
   @Deprecated
   @GwtIncompatible
-  public static void propagateIfPossible(@Nullable Throwable throwable) {
+  public static void propagateIfPossible(@CheckForNull Throwable throwable) {
     if (throwable != null) {
       throwIfUnchecked(throwable);
     }
@@ -180,7 +182,7 @@
    */
   @GwtIncompatible // propagateIfInstanceOf
   public static <X extends Throwable> void propagateIfPossible(
-      @Nullable Throwable throwable, Class<X> declaredType) throws X {
+      @CheckForNull Throwable throwable, Class<X> declaredType) throws X {
     propagateIfInstanceOf(throwable, declaredType);
     propagateIfPossible(throwable);
   }
@@ -198,7 +200,7 @@
    */
   @GwtIncompatible // propagateIfInstanceOf
   public static <X1 extends Throwable, X2 extends Throwable> void propagateIfPossible(
-      @Nullable Throwable throwable, Class<X1> declaredType1, Class<X2> declaredType2)
+      @CheckForNull Throwable throwable, Class<X1> declaredType1, Class<X2> declaredType2)
       throws X1, X2 {
     checkNotNull(declaredType2);
     propagateIfInstanceOf(throwable, declaredType1);
@@ -330,6 +332,7 @@
    */
   @Beta
   @GwtIncompatible // Class.cast(Object)
+  @CheckForNull
   public static <X extends Throwable> X getCauseAs(
       Throwable throwable, Class<X> expectedCauseType) {
     try {
@@ -412,15 +415,22 @@
      * AOSP grief.
      */
     return new AbstractList<StackTraceElement>() {
+      /*
+       * The following requireNonNull calls are safe because we use jlaStackTrace() only if
+       * lazyStackTraceIsLazy() returns true.
+       */
       @Override
       public StackTraceElement get(int n) {
         return (StackTraceElement)
-            invokeAccessibleNonThrowingMethod(getStackTraceElementMethod, jla, t, n);
+            invokeAccessibleNonThrowingMethod(
+                requireNonNull(getStackTraceElementMethod), requireNonNull(jla), t, n);
       }
 
       @Override
       public int size() {
-        return (Integer) invokeAccessibleNonThrowingMethod(getStackTraceDepthMethod, jla, t);
+        return (Integer)
+            invokeAccessibleNonThrowingMethod(
+                requireNonNull(getStackTraceDepthMethod), requireNonNull(jla), t);
       }
     };
   }
@@ -448,30 +458,32 @@
 
   /** Access to some fancy internal JVM internals. */
   @GwtIncompatible // java.lang.reflect
-  private static final @Nullable Object jla = getJLA();
+  @CheckForNull
+  private static final Object jla = getJLA();
 
   /**
    * The "getStackTraceElementMethod" method, only available on some JDKs so we use reflection to
    * find it when available. When this is null, use the slow way.
    */
   @GwtIncompatible // java.lang.reflect
-  private static final @Nullable Method getStackTraceElementMethod =
-      (jla == null) ? null : getGetMethod();
+  @CheckForNull
+  private static final Method getStackTraceElementMethod = (jla == null) ? null : getGetMethod();
 
   /**
    * The "getStackTraceDepth" method, only available on some JDKs so we use reflection to find it
    * when available. When this is null, use the slow way.
    */
   @GwtIncompatible // java.lang.reflect
-  private static final @Nullable Method getStackTraceDepthMethod =
-      (jla == null) ? null : getSizeMethod();
+  @CheckForNull
+  private static final Method getStackTraceDepthMethod = (jla == null) ? null : getSizeMethod(jla);
 
   /**
    * Returns the JavaLangAccess class that is present in all Sun JDKs. It is not allowed in
    * AppEngine, and not present in non-Sun JDKs.
    */
   @GwtIncompatible // java.lang.reflect
-  private static @Nullable Object getJLA() {
+  @CheckForNull
+  private static Object getJLA() {
     try {
       /*
        * We load sun.misc.* classes using reflection since Android doesn't support these classes and
@@ -496,7 +508,8 @@
    * method cannot be found (it is only to be found in fairly recent JDKs).
    */
   @GwtIncompatible // java.lang.reflect
-  private static @Nullable Method getGetMethod() {
+  @CheckForNull
+  private static Method getGetMethod() {
     return getJlaMethod("getStackTraceElement", Throwable.class, int.class);
   }
 
@@ -510,13 +523,14 @@
    * UnsupportedOperationException</a>.
    */
   @GwtIncompatible // java.lang.reflect
-  private static @Nullable Method getSizeMethod() {
+  @CheckForNull
+  private static Method getSizeMethod(Object jla) {
     try {
       Method getStackTraceDepth = getJlaMethod("getStackTraceDepth", Throwable.class);
       if (getStackTraceDepth == null) {
         return null;
       }
-      getStackTraceDepth.invoke(getJLA(), new Throwable());
+      getStackTraceDepth.invoke(jla, new Throwable());
       return getStackTraceDepth;
     } catch (UnsupportedOperationException | IllegalAccessException | InvocationTargetException e) {
       return null;
@@ -524,8 +538,8 @@
   }
 
   @GwtIncompatible // java.lang.reflect
-  private static @Nullable Method getJlaMethod(String name, Class<?>... parameterTypes)
-      throws ThreadDeath {
+  @CheckForNull
+  private static Method getJlaMethod(String name, Class<?>... parameterTypes) throws ThreadDeath {
     try {
       return Class.forName(JAVA_LANG_ACCESS_CLASSNAME, false, null).getMethod(name, parameterTypes);
     } catch (ThreadDeath death) {
diff --git a/guava/src/com/google/common/base/Ticker.java b/guava/src/com/google/common/base/Ticker.java
index a53883b..d898735 100644
--- a/guava/src/com/google/common/base/Ticker.java
+++ b/guava/src/com/google/common/base/Ticker.java
@@ -28,6 +28,7 @@
  *     source-compatible</a> since 9.0)
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class Ticker {
   /** Constructor for use by subclasses. */
   protected Ticker() {}
diff --git a/guava/src/com/google/common/base/Utf8.java b/guava/src/com/google/common/base/Utf8.java
index 8a2fbb7..bb945a3 100644
--- a/guava/src/com/google/common/base/Utf8.java
+++ b/guava/src/com/google/common/base/Utf8.java
@@ -38,6 +38,7 @@
  */
 @Beta
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Utf8 {
   /**
    * Returns the number of bytes in the UTF-8-encoded form of {@code sequence}. For a string, this
diff --git a/guava/src/com/google/common/base/Verify.java b/guava/src/com/google/common/base/Verify.java
index c2846de..b2e9f5f 100644
--- a/guava/src/com/google/common/base/Verify.java
+++ b/guava/src/com/google/common/base/Verify.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -87,6 +88,7 @@
  * @since 17.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Verify {
   /**
    * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with no
@@ -118,8 +120,8 @@
    */
   public static void verify(
       boolean expression,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object @Nullable ... errorMessageArgs) {
+      String errorMessageTemplate,
+      @CheckForNull @Nullable Object... errorMessageArgs) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, errorMessageArgs));
     }
@@ -133,7 +135,7 @@
    *
    * @since 23.1 (varargs overload since 17.0)
    */
-  public static void verify(boolean expression, @Nullable String errorMessageTemplate, char p1) {
+  public static void verify(boolean expression, String errorMessageTemplate, char p1) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -147,7 +149,7 @@
    *
    * @since 23.1 (varargs overload since 17.0)
    */
-  public static void verify(boolean expression, @Nullable String errorMessageTemplate, int p1) {
+  public static void verify(boolean expression, String errorMessageTemplate, int p1) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -161,7 +163,7 @@
    *
    * @since 23.1 (varargs overload since 17.0)
    */
-  public static void verify(boolean expression, @Nullable String errorMessageTemplate, long p1) {
+  public static void verify(boolean expression, String errorMessageTemplate, long p1) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -176,7 +178,7 @@
    * @since 23.1 (varargs overload since 17.0)
    */
   public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, @Nullable Object p1) {
+      boolean expression, String errorMessageTemplate, @CheckForNull Object p1) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1));
     }
@@ -190,8 +192,35 @@
    *
    * @since 23.1 (varargs overload since 17.0)
    */
-  public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, char p1, char p2) {
+  public static void verify(boolean expression, String errorMessageTemplate, char p1, char p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, int p1, char p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, long p1, char p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -206,7 +235,49 @@
    * @since 23.1 (varargs overload since 17.0)
    */
   public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, int p1, char p2) {
+      boolean expression, String errorMessageTemplate, @CheckForNull Object p1, char p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, char p1, int p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, int p1, int p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, long p1, int p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -221,7 +292,49 @@
    * @since 23.1 (varargs overload since 17.0)
    */
   public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, long p1, char p2) {
+      boolean expression, String errorMessageTemplate, @CheckForNull Object p1, int p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, char p1, long p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, int p1, long p2) {
+    if (!expression) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
+    }
+  }
+
+  /**
+   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
+   * custom message otherwise.
+   *
+   * <p>See {@link #verify(boolean, String, Object...)} for details.
+   *
+   * @since 23.1 (varargs overload since 17.0)
+   */
+  public static void verify(boolean expression, String errorMessageTemplate, long p1, long p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -236,7 +349,7 @@
    * @since 23.1 (varargs overload since 17.0)
    */
   public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, @Nullable Object p1, char p2) {
+      boolean expression, String errorMessageTemplate, @CheckForNull Object p1, long p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -251,7 +364,7 @@
    * @since 23.1 (varargs overload since 17.0)
    */
   public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, char p1, int p2) {
+      boolean expression, String errorMessageTemplate, char p1, @CheckForNull Object p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -266,7 +379,7 @@
    * @since 23.1 (varargs overload since 17.0)
    */
   public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, int p1, int p2) {
+      boolean expression, String errorMessageTemplate, int p1, @CheckForNull Object p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -281,127 +394,7 @@
    * @since 23.1 (varargs overload since 17.0)
    */
   public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, long p1, int p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, @Nullable Object p1, int p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, char p1, long p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, int p1, long p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, long p1, long p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, @Nullable Object p1, long p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, char p1, @Nullable Object p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, int p1, @Nullable Object p2) {
-    if (!expression) {
-      throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
-    }
-  }
-
-  /**
-   * Ensures that {@code expression} is {@code true}, throwing a {@code VerifyException} with a
-   * custom message otherwise.
-   *
-   * <p>See {@link #verify(boolean, String, Object...)} for details.
-   *
-   * @since 23.1 (varargs overload since 17.0)
-   */
-  public static void verify(
-      boolean expression, @Nullable String errorMessageTemplate, long p1, @Nullable Object p2) {
+      boolean expression, String errorMessageTemplate, long p1, @CheckForNull Object p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -417,9 +410,9 @@
    */
   public static void verify(
       boolean expression,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object p1,
-      @Nullable Object p2) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2));
     }
@@ -435,10 +428,10 @@
    */
   public static void verify(
       boolean expression,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object p1,
-      @Nullable Object p2,
-      @Nullable Object p3) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2, p3));
     }
@@ -454,16 +447,25 @@
    */
   public static void verify(
       boolean expression,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object p1,
-      @Nullable Object p2,
-      @Nullable Object p3,
-      @Nullable Object p4) {
+      String errorMessageTemplate,
+      @CheckForNull Object p1,
+      @CheckForNull Object p2,
+      @CheckForNull Object p3,
+      @CheckForNull Object p4) {
     if (!expression) {
       throw new VerifyException(lenientFormat(errorMessageTemplate, p1, p2, p3, p4));
     }
   }
 
+  /*
+   * For a discussion of the signature of verifyNotNull, see the discussion above
+   * Preconditions.checkNotNull.
+   *
+   * (verifyNotNull has many fewer "problem" callers, so we could try to be stricter. On the other
+   * hand, verifyNotNull arguably has more reason to accept nullable arguments in the first
+   * place....)
+   */
+
   /**
    * Ensures that {@code reference} is non-null, throwing a {@code VerifyException} with a default
    * message otherwise.
@@ -473,7 +475,7 @@
    * @see Preconditions#checkNotNull Preconditions.checkNotNull()
    */
   @CanIgnoreReturnValue
-  public static <T> T verifyNotNull(@Nullable T reference) {
+  public static <T> T verifyNotNull(@CheckForNull T reference) {
     return verifyNotNull(reference, "expected a non-null reference");
   }
 
@@ -494,10 +496,12 @@
    */
   @CanIgnoreReturnValue
   public static <T> T verifyNotNull(
-      @Nullable T reference,
-      @Nullable String errorMessageTemplate,
-      @Nullable Object @Nullable ... errorMessageArgs) {
-    verify(reference != null, errorMessageTemplate, errorMessageArgs);
+      @CheckForNull T reference,
+      String errorMessageTemplate,
+      @CheckForNull @Nullable Object... errorMessageArgs) {
+    if (reference == null) {
+      throw new VerifyException(lenientFormat(errorMessageTemplate, errorMessageArgs));
+    }
     return reference;
   }
 
diff --git a/guava/src/com/google/common/base/VerifyException.java b/guava/src/com/google/common/base/VerifyException.java
index 1b6781b..10b99de 100644
--- a/guava/src/com/google/common/base/VerifyException.java
+++ b/guava/src/com/google/common/base/VerifyException.java
@@ -15,7 +15,7 @@
 package com.google.common.base;
 
 import com.google.common.annotations.GwtCompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Exception thrown upon the failure of a <a
@@ -25,12 +25,13 @@
  * @since 17.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class VerifyException extends RuntimeException {
   /** Constructs a {@code VerifyException} with no message. */
   public VerifyException() {}
 
   /** Constructs a {@code VerifyException} with the message {@code message}. */
-  public VerifyException(@Nullable String message) {
+  public VerifyException(@CheckForNull String message) {
     super(message);
   }
 
@@ -40,7 +41,7 @@
    *
    * @since 19.0
    */
-  public VerifyException(@Nullable Throwable cause) {
+  public VerifyException(@CheckForNull Throwable cause) {
     super(cause);
   }
 
@@ -50,7 +51,7 @@
    *
    * @since 19.0
    */
-  public VerifyException(@Nullable String message, @Nullable Throwable cause) {
+  public VerifyException(@CheckForNull String message, @CheckForNull Throwable cause) {
     super(message, cause);
   }
 }
diff --git a/guava/src/com/google/common/cache/AbstractCache.java b/guava/src/com/google/common/cache/AbstractCache.java
index d8ef032..eec5fdc 100644
--- a/guava/src/com/google/common/cache/AbstractCache.java
+++ b/guava/src/com/google/common/cache/AbstractCache.java
@@ -38,6 +38,7 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractCache<K, V> implements Cache<K, V> {
 
   /** Constructor for use by subclasses. */
@@ -58,8 +59,12 @@
    *
    * @since 11.0
    */
+  /*
+   * <? extends Object> is mostly the same as <?> to plain Java. But to nullness checkers, they
+   * differ: <? extends Object> means "non-null types," while <?> means "all types."
+   */
   @Override
-  public ImmutableMap<K, V> getAllPresent(Iterable<?> keys) {
+  public ImmutableMap<K, V> getAllPresent(Iterable<? extends Object> keys) {
     Map<K, V> result = Maps.newLinkedHashMap();
     for (Object key : keys) {
       if (!result.containsKey(key)) {
@@ -103,7 +108,8 @@
 
   /** @since 11.0 */
   @Override
-  public void invalidateAll(Iterable<?> keys) {
+  // For discussion of <? extends Object>, see getAllPresent.
+  public void invalidateAll(Iterable<? extends Object> keys) {
     for (Object key : keys) {
       invalidate(key);
     }
diff --git a/guava/src/com/google/common/cache/AbstractLoadingCache.java b/guava/src/com/google/common/cache/AbstractLoadingCache.java
index 38b9774..489597c 100644
--- a/guava/src/com/google/common/cache/AbstractLoadingCache.java
+++ b/guava/src/com/google/common/cache/AbstractLoadingCache.java
@@ -38,6 +38,7 @@
  * @since 11.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractLoadingCache<K, V> extends AbstractCache<K, V>
     implements LoadingCache<K, V> {
 
diff --git a/guava/src/com/google/common/cache/Cache.java b/guava/src/com/google/common/cache/Cache.java
index 4bcb308..8755595 100644
--- a/guava/src/com/google/common/cache/Cache.java
+++ b/guava/src/com/google/common/cache/Cache.java
@@ -18,13 +18,14 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.util.concurrent.ExecutionError;
 import com.google.common.util.concurrent.UncheckedExecutionException;
+import com.google.errorprone.annotations.CheckReturnValue;
 import com.google.errorprone.annotations.CompatibleWith;
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutionException;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A semi-persistent mapping from keys to values. Cache entries are manually added using {@link
@@ -34,11 +35,14 @@
  * <p>Implementations of this interface are expected to be thread-safe, and can be safely accessed
  * by multiple concurrent threads.
  *
+ * @param <K> the type of the cache's keys, which are not permitted to be null
+ * @param <V> the type of the cache's values, which are not permitted to be null
  * @author Charles Fry
  * @since 10.0
  */
 @DoNotMock("Use CacheBuilder.newBuilder().build()")
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public interface Cache<K, V> {
 
   /**
@@ -47,7 +51,7 @@
    *
    * @since 11.0
    */
-  @Nullable
+  @CheckForNull
   V getIfPresent(@CompatibleWith("K") Object key);
 
   /**
@@ -104,7 +108,11 @@
    *
    * @since 11.0
    */
-  ImmutableMap<K, V> getAllPresent(Iterable<?> keys);
+  /*
+   * <? extends Object> is mostly the same as <?> to plain Java. But to nullness checkers, they
+   * differ: <? extends Object> means "non-null types," while <?> means "all types."
+   */
+  ImmutableMap<K, V> getAllPresent(Iterable<? extends Object> keys);
 
   /**
    * Associates {@code value} with {@code key} in this cache. If the cache previously contained a
@@ -135,12 +143,14 @@
    *
    * @since 11.0
    */
-  void invalidateAll(Iterable<?> keys);
+  // For discussion of <? extends Object>, see getAllPresent.
+  void invalidateAll(Iterable<? extends Object> keys);
 
   /** Discards all entries in the cache. */
   void invalidateAll();
 
   /** Returns the approximate number of entries in this cache. */
+  @CheckReturnValue
   long size();
 
   /**
@@ -154,6 +164,7 @@
    * all values is returned.
    *
    */
+  @CheckReturnValue
   CacheStats stats();
 
   /**
@@ -164,6 +175,7 @@
    * concurrent use, but if the cache is modified (including by eviction) after the iterator is
    * created, it is undefined which of the changes (if any) will be reflected in that iterator.
    */
+  @CheckReturnValue
   ConcurrentMap<K, V> asMap();
 
   /**
diff --git a/guava/src/com/google/common/cache/CacheBuilder.java b/guava/src/com/google/common/cache/CacheBuilder.java
index 944e291..3537bab 100644
--- a/guava/src/com/google/common/cache/CacheBuilder.java
+++ b/guava/src/com/google/common/cache/CacheBuilder.java
@@ -41,12 +41,52 @@
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
- * A builder of {@link LoadingCache} and {@link Cache} instances having any combination of the
- * following features:
+ * A builder of {@link LoadingCache} and {@link Cache} instances.
+ *
+ * <h2>Prefer <a href="https://github.com/ben-manes/caffeine/wiki">Caffeine</a> over Guava's caching
+ * API</h2>
+ *
+ * <p>The successor to Guava's caching API is <a
+ * href="https://github.com/ben-manes/caffeine/wiki">Caffeine</a>. Its API is designed to make it a
+ * nearly drop-in replacement -- though it requires Java 8 APIs and is not available for Android or
+ * GWT/j2cl. Its equivalent to {@code CacheBuilder} is its <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/Caffeine.html">{@code
+ * Caffeine}</a> class. Caffeine offers better performance, more features (including asynchronous
+ * loading), and fewer <a
+ * href="https://github.com/google/guava/issues?q=is%3Aopen+is%3Aissue+label%3Apackage%3Dcache+label%3Atype%3Ddefect">bugs</a>.
+ *
+ * <p>Caffeine defines its own interfaces (<a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/Cache.html">{@code
+ * Cache}</a>, <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/LoadingCache.html">{@code
+ * LoadingCache}</a>, <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/CacheLoader.html">{@code
+ * CacheLoader}</a>, etc.), so you can use Caffeine without needing to use any Guava types.
+ * Caffeine's types are better than Guava's, especially for <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/AsyncLoadingCache.html">their
+ * deep support for asynchronous operations</a>. But if you want to migrate to Caffeine with minimal
+ * code changes, you can use <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/guava/latest/com.github.benmanes.caffeine.guava/com/github/benmanes/caffeine/guava/CaffeinatedGuava.html">its
+ * {@code CaffeinatedGuava} adapter class</a>, which lets you build a Guava {@code Cache} or a Guava
+ * {@code LoadingCache} backed by a Guava {@code CacheLoader}.
+ *
+ * <p>Caffeine's API for asynchronous operations uses {@code CompletableFuture}: <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/AsyncLoadingCache.html#get(K)">{@code
+ * AsyncLoadingCache.get}</a> returns a {@code CompletableFuture}, and implementations of <a
+ * href="https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/latest/com.github.benmanes.caffeine/com/github/benmanes/caffeine/cache/AsyncCacheLoader.html#asyncLoad(K,java.util.concurrent.Executor)">{@code
+ * AsyncCacheLoader.asyncLoad}</a> must return a {@code CompletableFuture}. Users of Guava's {@link
+ * com.google.common.util.concurrent.ListenableFuture} can adapt between the two {@code Future}
+ * types by using <a href="https://github.com/lukas-krecan/future-converter#java8-guava">{@code
+ * net.javacrumbs.futureconverter.java8guava.FutureConverter}</a>.
+ *
+ * <h2>More on {@code CacheBuilder}</h2>
+ *
+ * {@code CacheBuilder} builds caches with any combination of the following features:
  *
  * <ul>
  *   <li>automatic loading of entries into the cache
- *   <li>least-recently-used eviction when a maximum size is exceeded
+ *   <li>least-recently-used eviction when a maximum size is exceeded (note that the cache is
+ *       divided into segments, each of which does LRU internally)
  *   <li>time-based expiration of entries, measured since last access or last write
  *   <li>keys automatically wrapped in {@code WeakReference}
  *   <li>values automatically wrapped in {@code WeakReference} or {@code SoftReference}
@@ -54,7 +94,6 @@
  *   <li>accumulation of cache access statistics
  * </ul>
  *
- *
  * <p>These features are all optional; caches can be created using all or none of them. By default
  * cache instances created by {@code CacheBuilder} will not perform any type of eviction.
  *
@@ -142,15 +181,16 @@
  *
  * @param <K> the most general key type this builder will be able to create caches for. This is
  *     normally {@code Object} unless it is constrained by using a method like {@code
- *     #removalListener}
+ *     #removalListener}. Cache keys may not be null.
  * @param <V> the most general value type this builder will be able to create caches for. This is
  *     normally {@code Object} unless it is constrained by using a method like {@code
- *     #removalListener}
+ *     #removalListener}. Cache values may not be null.
  * @author Charles Fry
  * @author Kevin Bourrillion
  * @since 10.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class CacheBuilder<K, V> {
   private static final int DEFAULT_INITIAL_CAPACITY = 16;
   private static final int DEFAULT_CONCURRENCY_LEVEL = 4;
@@ -261,6 +301,7 @@
    * <p>Note that while this return type is {@code CacheBuilder<Object, Object>}, type parameters on
    * the {@link #build} methods allow you to create a cache of any key and value type desired.
    */
+  @CheckReturnValue
   public static CacheBuilder<Object, Object> newBuilder() {
     return new CacheBuilder<>();
   }
@@ -271,6 +312,7 @@
    * @since 12.0
    */
   @GwtIncompatible // To be supported
+  @CheckReturnValue
   public static CacheBuilder<Object, Object> from(CacheBuilderSpec spec) {
     return spec.toCacheBuilder().lenientParsing();
   }
@@ -283,6 +325,7 @@
    * @since 12.0
    */
   @GwtIncompatible // To be supported
+  @CheckReturnValue
   public static CacheBuilder<Object, Object> from(String spec) {
     return from(CacheBuilderSpec.parse(spec));
   }
@@ -477,8 +520,8 @@
         this.maximumWeight);
     checkState(
         this.maximumSize == UNSET_INT, "maximum size was already set to %s", this.maximumSize);
-    this.maximumWeight = maximumWeight;
     checkArgument(maximumWeight >= 0, "maximum weight must not be negative");
+    this.maximumWeight = maximumWeight;
     return this;
   }
 
@@ -646,7 +689,7 @@
    *     removed
    * @return this {@code CacheBuilder} instance (for chaining)
    * @throws IllegalArgumentException if {@code duration} is negative
-   * @throws IllegalStateException if the time to live or time to idle was already set
+   * @throws IllegalStateException if {@link #expireAfterWrite} was already set
    * @throws ArithmeticException for durations greater than +/- approximately 292 years
    * @since 25.0
    */
@@ -677,7 +720,7 @@
    * @param unit the unit that {@code duration} is expressed in
    * @return this {@code CacheBuilder} instance (for chaining)
    * @throws IllegalArgumentException if {@code duration} is negative
-   * @throws IllegalStateException if the time to live or time to idle was already set
+   * @throws IllegalStateException if {@link #expireAfterWrite} was already set
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public CacheBuilder<K, V> expireAfterWrite(long duration, TimeUnit unit) {
@@ -716,7 +759,7 @@
    *     automatically removed
    * @return this {@code CacheBuilder} instance (for chaining)
    * @throws IllegalArgumentException if {@code duration} is negative
-   * @throws IllegalStateException if the time to idle or time to live was already set
+   * @throws IllegalStateException if {@link #expireAfterAccess} was already set
    * @throws ArithmeticException for durations greater than +/- approximately 292 years
    * @since 25.0
    */
@@ -752,7 +795,7 @@
    * @param unit the unit that {@code duration} is expressed in
    * @return this {@code CacheBuilder} instance (for chaining)
    * @throws IllegalArgumentException if {@code duration} is negative
-   * @throws IllegalStateException if the time to idle or time to live was already set
+   * @throws IllegalStateException if {@link #expireAfterAccess} was already set
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   public CacheBuilder<K, V> expireAfterAccess(long duration, TimeUnit unit) {
@@ -784,9 +827,10 @@
    * operations.
    *
    * <p>Currently automatic refreshes are performed when the first stale request for an entry
-   * occurs. The request triggering refresh will make a blocking call to {@link CacheLoader#reload}
-   * and immediately return the new value if the returned future is complete, and the old value
-   * otherwise.
+   * occurs. The request triggering refresh will make a synchronous call to {@link
+   * CacheLoader#reload}
+   * to obtain a future of the new value. If the returned future is already complete, it is returned
+   * immediately. Otherwise, the old value is returned.
    *
    * <p><b>Note:</b> <i>all exceptions thrown during refresh will be logged and then swallowed</i>.
    *
@@ -794,7 +838,7 @@
    *     stale, and thus eligible for refresh
    * @return this {@code CacheBuilder} instance (for chaining)
    * @throws IllegalArgumentException if {@code duration} is negative
-   * @throws IllegalStateException if the refresh interval was already set
+   * @throws IllegalStateException if {@link #refreshAfterWrite} was already set
    * @throws ArithmeticException for durations greater than +/- approximately 292 years
    * @since 25.0
    */
@@ -817,7 +861,8 @@
    * operations.
    *
    * <p>Currently automatic refreshes are performed when the first stale request for an entry
-   * occurs. The request triggering refresh will make a blocking call to {@link CacheLoader#reload}
+   * occurs. The request triggering refresh will make a synchronous call to {@link
+   * CacheLoader#reload}
    * and immediately return the new value if the returned future is complete, and the old value
    * otherwise.
    *
@@ -831,7 +876,7 @@
    * @param unit the unit that {@code duration} is expressed in
    * @return this {@code CacheBuilder} instance (for chaining)
    * @throws IllegalArgumentException if {@code duration} is negative
-   * @throws IllegalStateException if the refresh interval was already set
+   * @throws IllegalStateException if {@link #refreshAfterWrite} was already set
    * @since 11.0
    */
   @GwtIncompatible // To be supported (synchronously).
@@ -946,6 +991,7 @@
    * @param loader the cache loader used to obtain new values
    * @return a cache having the requested features
    */
+  @CheckReturnValue
   public <K1 extends K, V1 extends V> LoadingCache<K1, V1> build(
       CacheLoader<? super K1, V1> loader) {
     checkWeightWithWeigher();
@@ -964,6 +1010,7 @@
    * @return a cache having the requested features
    * @since 11.0
    */
+  @CheckReturnValue
   public <K1 extends K, V1 extends V> Cache<K1, V1> build() {
     checkWeightWithWeigher();
     checkNonLoadingCache();
diff --git a/guava/src/com/google/common/cache/CacheBuilderSpec.java b/guava/src/com/google/common/cache/CacheBuilderSpec.java
index cba6721..64b5ad2 100644
--- a/guava/src/com/google/common/cache/CacheBuilderSpec.java
+++ b/guava/src/com/google/common/cache/CacheBuilderSpec.java
@@ -15,6 +15,7 @@
 package com.google.common.cache;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Strings.isNullOrEmpty;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -27,6 +28,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -78,10 +80,11 @@
  */
 @SuppressWarnings("GoodTime") // lots of violations (nanosecond math)
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class CacheBuilderSpec {
   /** Parses a single value. */
   private interface ValueParser {
-    void parse(CacheBuilderSpec spec, String key, @Nullable String value);
+    void parse(CacheBuilderSpec spec, String key, @CheckForNull String value);
   }
 
   /** Splits each key-value pair. */
@@ -107,19 +110,19 @@
           .put("refreshInterval", new RefreshDurationParser())
           .build();
 
-  @VisibleForTesting @Nullable Integer initialCapacity;
-  @VisibleForTesting @Nullable Long maximumSize;
-  @VisibleForTesting @Nullable Long maximumWeight;
-  @VisibleForTesting @Nullable Integer concurrencyLevel;
-  @VisibleForTesting @Nullable Strength keyStrength;
-  @VisibleForTesting @Nullable Strength valueStrength;
-  @VisibleForTesting @Nullable Boolean recordStats;
+  @VisibleForTesting @CheckForNull Integer initialCapacity;
+  @VisibleForTesting @CheckForNull Long maximumSize;
+  @VisibleForTesting @CheckForNull Long maximumWeight;
+  @VisibleForTesting @CheckForNull Integer concurrencyLevel;
+  @VisibleForTesting @CheckForNull Strength keyStrength;
+  @VisibleForTesting @CheckForNull Strength valueStrength;
+  @VisibleForTesting @CheckForNull Boolean recordStats;
   @VisibleForTesting long writeExpirationDuration;
-  @VisibleForTesting @Nullable TimeUnit writeExpirationTimeUnit;
+  @VisibleForTesting @CheckForNull TimeUnit writeExpirationTimeUnit;
   @VisibleForTesting long accessExpirationDuration;
-  @VisibleForTesting @Nullable TimeUnit accessExpirationTimeUnit;
+  @VisibleForTesting @CheckForNull TimeUnit accessExpirationTimeUnit;
   @VisibleForTesting long refreshDuration;
-  @VisibleForTesting @Nullable TimeUnit refreshTimeUnit;
+  @VisibleForTesting @CheckForNull TimeUnit refreshTimeUnit;
   /** Specification; used for toParseableString(). */
   private final String specification;
 
@@ -248,7 +251,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (this == obj) {
       return true;
     }
@@ -278,7 +281,8 @@
    * Converts an expiration duration/unit pair into a single Long for hashing and equality. Uses
    * nanos to match CacheBuilder implementation.
    */
-  private static @Nullable Long durationInNanos(long duration, @Nullable TimeUnit unit) {
+  @CheckForNull
+  private static Long durationInNanos(long duration, @CheckForNull TimeUnit unit) {
     return (unit == null) ? null : unit.toNanos(duration);
   }
 
@@ -287,8 +291,10 @@
     protected abstract void parseInteger(CacheBuilderSpec spec, int value);
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, String value) {
-      checkArgument(value != null && !value.isEmpty(), "value of key %s omitted", key);
+    public void parse(CacheBuilderSpec spec, String key, @Nullable String value) {
+      if (isNullOrEmpty(value)) {
+        throw new IllegalArgumentException("value of key " + key + " omitted");
+      }
       try {
         parseInteger(spec, Integer.parseInt(value));
       } catch (NumberFormatException e) {
@@ -303,8 +309,10 @@
     protected abstract void parseLong(CacheBuilderSpec spec, long value);
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, String value) {
-      checkArgument(value != null && !value.isEmpty(), "value of key %s omitted", key);
+    public void parse(CacheBuilderSpec spec, String key, @Nullable String value) {
+      if (isNullOrEmpty(value)) {
+        throw new IllegalArgumentException("value of key " + key + " omitted");
+      }
       try {
         parseLong(spec, Long.parseLong(value));
       } catch (NumberFormatException e) {
@@ -369,7 +377,7 @@
     }
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, @Nullable String value) {
+    public void parse(CacheBuilderSpec spec, String key, @CheckForNull String value) {
       checkArgument(value == null, "key %s does not take values", key);
       checkArgument(spec.keyStrength == null, "%s was already set to %s", key, spec.keyStrength);
       spec.keyStrength = strength;
@@ -385,7 +393,7 @@
     }
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, @Nullable String value) {
+    public void parse(CacheBuilderSpec spec, String key, @CheckForNull String value) {
       checkArgument(value == null, "key %s does not take values", key);
       checkArgument(
           spec.valueStrength == null, "%s was already set to %s", key, spec.valueStrength);
@@ -398,7 +406,7 @@
   static class RecordStatsParser implements ValueParser {
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, @Nullable String value) {
+    public void parse(CacheBuilderSpec spec, String key, @CheckForNull String value) {
       checkArgument(value == null, "recordStats does not take values");
       checkArgument(spec.recordStats == null, "recordStats already set");
       spec.recordStats = true;
@@ -410,8 +418,10 @@
     protected abstract void parseDuration(CacheBuilderSpec spec, long duration, TimeUnit unit);
 
     @Override
-    public void parse(CacheBuilderSpec spec, String key, String value) {
-      checkArgument(value != null && !value.isEmpty(), "value of key %s omitted", key);
+    public void parse(CacheBuilderSpec spec, String key, @CheckForNull String value) {
+      if (isNullOrEmpty(value)) {
+        throw new IllegalArgumentException("value of key " + key + " omitted");
+      }
       try {
         char lastChar = value.charAt(value.length() - 1);
         TimeUnit timeUnit;
@@ -430,8 +440,7 @@
             break;
           default:
             throw new IllegalArgumentException(
-                format(
-                    "key %s invalid format.  was %s, must end with one of [dDhHmMsS]", key, value));
+                format("key %s invalid unit: was %s, must end with one of [dhms]", key, value));
         }
 
         long duration = Long.parseLong(value.substring(0, value.length() - 1));
diff --git a/guava/src/com/google/common/cache/CacheLoader.java b/guava/src/com/google/common/cache/CacheLoader.java
index 36639fd..7a5e017 100644
--- a/guava/src/com/google/common/cache/CacheLoader.java
+++ b/guava/src/com/google/common/cache/CacheLoader.java
@@ -23,6 +23,7 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListenableFutureTask;
+import com.google.errorprone.annotations.CheckReturnValue;
 import java.io.Serializable;
 import java.util.Map;
 import java.util.concurrent.Callable;
@@ -56,6 +57,7 @@
  * @since 10.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public abstract class CacheLoader<K, V> {
   /** Constructor for use by subclasses. */
   protected CacheLoader() {}
@@ -135,6 +137,7 @@
    * @param function the function to be used for loading values; must never return {@code null}
    * @return a cache loader that loads values by passing each key to {@code function}
    */
+  @CheckReturnValue
   public static <K, V> CacheLoader<K, V> from(Function<K, V> function) {
     return new FunctionToCacheLoader<>(function);
   }
@@ -148,6 +151,7 @@
    * @return a cache loader that loads values by calling {@link Supplier#get}, irrespective of the
    *     key
    */
+  @CheckReturnValue
   public static <V> CacheLoader<Object, V> from(Supplier<V> supplier) {
     return new SupplierToCacheLoader<V>(supplier);
   }
@@ -177,6 +181,7 @@
    *
    * @since 17.0
    */
+  @CheckReturnValue
   @GwtIncompatible // Executor + Futures
   public static <K, V> CacheLoader<K, V> asyncReloading(
       final CacheLoader<K, V> loader, final Executor executor) {
diff --git a/guava/src/com/google/common/cache/CacheStats.java b/guava/src/com/google/common/cache/CacheStats.java
index 777d53f..8307e94 100644
--- a/guava/src/com/google/common/cache/CacheStats.java
+++ b/guava/src/com/google/common/cache/CacheStats.java
@@ -22,7 +22,7 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import java.util.concurrent.Callable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Statistics about the performance of a {@link Cache}. Instances of this class are immutable.
@@ -57,6 +57,7 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class CacheStats {
   private final long hitCount;
   private final long missCount;
@@ -276,7 +277,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof CacheStats) {
       CacheStats other = (CacheStats) object;
       return hitCount == other.hitCount
diff --git a/guava/src/com/google/common/cache/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/cache/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..bcf0fce
--- /dev/null
+++ b/guava/src/com/google/common/cache/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.cache;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/cache/ForwardingCache.java b/guava/src/com/google/common/cache/ForwardingCache.java
index 81dbf7a..f118977 100644
--- a/guava/src/com/google/common/cache/ForwardingCache.java
+++ b/guava/src/com/google/common/cache/ForwardingCache.java
@@ -22,7 +22,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutionException;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A cache which forwards all its method calls to another cache. Subclasses should override one or
@@ -33,6 +33,7 @@
  * @since 10.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingCache<K, V> extends ForwardingObject implements Cache<K, V> {
 
   /** Constructor for use by subclasses. */
@@ -43,7 +44,8 @@
 
   /** @since 11.0 */
   @Override
-  public @Nullable V getIfPresent(Object key) {
+  @CheckForNull
+  public V getIfPresent(Object key) {
     return delegate().getIfPresent(key);
   }
 
@@ -55,7 +57,11 @@
 
   /** @since 11.0 */
   @Override
-  public ImmutableMap<K, V> getAllPresent(Iterable<?> keys) {
+  /*
+   * <? extends Object> is mostly the same as <?> to plain Java. But to nullness checkers, they
+   * differ: <? extends Object> means "non-null types," while <?> means "all types."
+   */
+  public ImmutableMap<K, V> getAllPresent(Iterable<? extends Object> keys) {
     return delegate().getAllPresent(keys);
   }
 
@@ -78,7 +84,8 @@
 
   /** @since 11.0 */
   @Override
-  public void invalidateAll(Iterable<?> keys) {
+  // For discussion of <? extends Object>, see getAllPresent.
+  public void invalidateAll(Iterable<? extends Object> keys) {
     delegate().invalidateAll(keys);
   }
 
diff --git a/guava/src/com/google/common/cache/ForwardingLoadingCache.java b/guava/src/com/google/common/cache/ForwardingLoadingCache.java
index ba88ded..ecd44ca 100644
--- a/guava/src/com/google/common/cache/ForwardingLoadingCache.java
+++ b/guava/src/com/google/common/cache/ForwardingLoadingCache.java
@@ -31,6 +31,7 @@
  * @since 11.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingLoadingCache<K, V> extends ForwardingCache<K, V>
     implements LoadingCache<K, V> {
 
diff --git a/guava/src/com/google/common/cache/LoadingCache.java b/guava/src/com/google/common/cache/LoadingCache.java
index 6af1d3a..e338ac4 100644
--- a/guava/src/com/google/common/cache/LoadingCache.java
+++ b/guava/src/com/google/common/cache/LoadingCache.java
@@ -33,10 +33,13 @@
  * <p>When evaluated as a {@link Function}, a cache yields the same result as invoking {@link
  * #getUnchecked}.
  *
+ * @param <K> the type of the cache's keys, which are not permitted to be null
+ * @param <V> the type of the cache's values, which are not permitted to be null
  * @author Charles Fry
  * @since 11.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public interface LoadingCache<K, V> extends Cache<K, V>, Function<K, V> {
 
   /**
@@ -130,11 +133,11 @@
   V apply(K key);
 
   /**
-   * Loads a new value for key {@code key}, possibly asynchronously. While the new value is loading
-   * the previous value (if any) will continue to be returned by {@code get(key)} unless it is
-   * evicted. If the new value is loaded successfully it will replace the previous value in the
-   * cache; if an exception is thrown while refreshing the previous value will remain, <i>and the
-   * exception will be logged (using {@link java.util.logging.Logger}) and swallowed</i>.
+   * Loads a new value for {@code key}, possibly asynchronously. While the new value is loading the
+   * previous value (if any) will continue to be returned by {@code get(key)} unless it is evicted.
+   * If the new value is loaded successfully it will replace the previous value in the cache; if an
+   * exception is thrown while refreshing the previous value will remain, <i>and the exception will
+   * be logged (using {@link java.util.logging.Logger}) and swallowed</i>.
    *
    * <p>Caches loaded by a {@link CacheLoader} will call {@link CacheLoader#reload} if the cache
    * currently contains a value for {@code key}, and {@link CacheLoader#load} otherwise. Loading is
diff --git a/guava/src/com/google/common/cache/LocalCache.java b/guava/src/com/google/common/cache/LocalCache.java
index a485ad5..f421781 100644
--- a/guava/src/com/google/common/cache/LocalCache.java
+++ b/guava/src/com/google/common/cache/LocalCache.java
@@ -97,8 +97,12 @@
  * @author Bob Lee ({@code com.google.common.collect.MapMaker})
  * @author Doug Lea ({@code ConcurrentHashMap})
  */
-@SuppressWarnings("GoodTime") // lots of violations (nanosecond math)
+@SuppressWarnings({
+  "GoodTime", // lots of violations (nanosecond math)
+  "nullness", // too much trouble for the payoff
+})
 @GwtCompatible(emulated = true)
+// TODO(cpovirk): Annotate for nullness.
 class LocalCache<K, V> extends AbstractMap<K, V> implements ConcurrentMap<K, V> {
 
   /*
@@ -2188,7 +2192,7 @@
     V compute(K key, int hash, BiFunction<? super K, ? super V, ? extends V> function) {
       ReferenceEntry<K, V> e;
       ValueReference<K, V> valueReference = null;
-      LoadingValueReference<K, V> loadingValueReference = null;
+      ComputingValueReference<K, V> computingValueReference = null;
       boolean createNewEntry = true;
       V newValue;
 
@@ -2229,33 +2233,33 @@
 
         // note valueReference can be an existing value or even itself another loading value if
         // the value for the key is already being computed.
-        loadingValueReference = new LoadingValueReference<>(valueReference);
+        computingValueReference = new ComputingValueReference<>(valueReference);
 
         if (e == null) {
           createNewEntry = true;
           e = newEntry(key, hash, first);
-          e.setValueReference(loadingValueReference);
+          e.setValueReference(computingValueReference);
           table.set(index, e);
         } else {
-          e.setValueReference(loadingValueReference);
+          e.setValueReference(computingValueReference);
         }
 
-        newValue = loadingValueReference.compute(key, function);
+        newValue = computingValueReference.compute(key, function);
         if (newValue != null) {
           if (valueReference != null && newValue == valueReference.get()) {
-            loadingValueReference.set(newValue);
+            computingValueReference.set(newValue);
             e.setValueReference(valueReference);
             recordWrite(e, 0, now); // no change in weight
             return newValue;
           }
           try {
             return getAndRecordStats(
-                key, hash, loadingValueReference, Futures.immediateFuture(newValue));
+                key, hash, computingValueReference, Futures.immediateFuture(newValue));
           } catch (ExecutionException exception) {
             throw new AssertionError("impossible; Futures.immediateFuture can't throw");
           }
-        } else if (createNewEntry) {
-          removeLoadingValue(key, hash, loadingValueReference);
+        } else if (createNewEntry || valueReference.isLoading()) {
+          removeLoadingValue(key, hash, computingValueReference);
           return null;
         } else {
           removeEntry(e, hash, RemovalCause.EXPLICIT);
@@ -3603,6 +3607,17 @@
     }
   }
 
+  static class ComputingValueReference<K, V> extends LoadingValueReference<K, V> {
+    ComputingValueReference(ValueReference<K, V> oldValue) {
+      super(oldValue);
+    }
+
+    @Override
+    public boolean isLoading() {
+      return false;
+    }
+  }
+
   // Queues
 
   /**
@@ -3927,7 +3942,7 @@
     Segment<K, V>[] segments = this.segments;
     long sum = 0;
     for (int i = 0; i < segments.length; ++i) {
-      sum += Math.max(0, segments[i].count); // see https://github.com/google/guava/issues/2108
+      sum += segments[i].count;
     }
     return sum;
   }
diff --git a/guava/src/com/google/common/cache/LongAddable.java b/guava/src/com/google/common/cache/LongAddable.java
index eaa6414..9851052 100644
--- a/guava/src/com/google/common/cache/LongAddable.java
+++ b/guava/src/com/google/common/cache/LongAddable.java
@@ -22,6 +22,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 interface LongAddable {
   void increment();
 
diff --git a/guava/src/com/google/common/cache/LongAddables.java b/guava/src/com/google/common/cache/LongAddables.java
index 203d2ef..b0f9e2b 100644
--- a/guava/src/com/google/common/cache/LongAddables.java
+++ b/guava/src/com/google/common/cache/LongAddables.java
@@ -24,6 +24,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class LongAddables {
   private static final Supplier<LongAddable> SUPPLIER;
 
diff --git a/guava/src/com/google/common/cache/LongAdder.java b/guava/src/com/google/common/cache/LongAdder.java
index f0c44ff..7ead7e8 100644
--- a/guava/src/com/google/common/cache/LongAdder.java
+++ b/guava/src/com/google/common/cache/LongAdder.java
@@ -40,6 +40,7 @@
  * @author Doug Lea
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class LongAdder extends Striped64 implements Serializable, LongAddable {
   private static final long serialVersionUID = 7249069246863182397L;
 
diff --git a/guava/src/com/google/common/cache/ParametricNullness.java b/guava/src/com/google/common/cache/ParametricNullness.java
new file mode 100644
index 0000000..19305a6
--- /dev/null
+++ b/guava/src/com/google/common/cache/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.cache;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/cache/ReferenceEntry.java b/guava/src/com/google/common/cache/ReferenceEntry.java
index 63bf2fe..8ff2e6c 100644
--- a/guava/src/com/google/common/cache/ReferenceEntry.java
+++ b/guava/src/com/google/common/cache/ReferenceEntry.java
@@ -16,7 +16,7 @@
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.cache.LocalCache.ValueReference;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An entry in a reference map.
@@ -39,22 +39,24 @@
  * </ul>
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 interface ReferenceEntry<K, V> {
   /** Returns the value reference from this entry. */
+  @CheckForNull
   ValueReference<K, V> getValueReference();
 
   /** Sets the value reference for this entry. */
   void setValueReference(ValueReference<K, V> valueReference);
 
   /** Returns the next entry in the chain. */
-  @Nullable
+  @CheckForNull
   ReferenceEntry<K, V> getNext();
 
   /** Returns the entry's hash. */
   int getHash();
 
   /** Returns the key for this entry. */
-  @Nullable
+  @CheckForNull
   K getKey();
 
   /*
diff --git a/guava/src/com/google/common/cache/RemovalCause.java b/guava/src/com/google/common/cache/RemovalCause.java
index 8ecc1d6..2e68e68 100644
--- a/guava/src/com/google/common/cache/RemovalCause.java
+++ b/guava/src/com/google/common/cache/RemovalCause.java
@@ -26,6 +26,7 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public enum RemovalCause {
   /**
    * The entry was manually removed by the user. This can result from the user invoking {@link
diff --git a/guava/src/com/google/common/cache/RemovalListener.java b/guava/src/com/google/common/cache/RemovalListener.java
index c9a343c..4713be5 100644
--- a/guava/src/com/google/common/cache/RemovalListener.java
+++ b/guava/src/com/google/common/cache/RemovalListener.java
@@ -34,6 +34,7 @@
  */
 @GwtCompatible
 @FunctionalInterface
+@ElementTypesAreNonnullByDefault
 public interface RemovalListener<K, V> {
   /**
    * Notifies the listener that a removal occurred at some point in the past.
diff --git a/guava/src/com/google/common/cache/RemovalListeners.java b/guava/src/com/google/common/cache/RemovalListeners.java
index c82b094..d0623e7 100644
--- a/guava/src/com/google/common/cache/RemovalListeners.java
+++ b/guava/src/com/google/common/cache/RemovalListeners.java
@@ -26,6 +26,7 @@
  * @since 10.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class RemovalListeners {
 
   private RemovalListeners() {}
diff --git a/guava/src/com/google/common/cache/RemovalNotification.java b/guava/src/com/google/common/cache/RemovalNotification.java
index 641d18f..dab7fe5 100644
--- a/guava/src/com/google/common/cache/RemovalNotification.java
+++ b/guava/src/com/google/common/cache/RemovalNotification.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.AbstractMap.SimpleImmutableEntry;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -32,7 +33,9 @@
  * @since 10.0
  */
 @GwtCompatible
-public final class RemovalNotification<K, V> extends SimpleImmutableEntry<K, V> {
+@ElementTypesAreNonnullByDefault
+public final class RemovalNotification<K, V>
+    extends SimpleImmutableEntry<@Nullable K, @Nullable V> {
   private final RemovalCause cause;
 
   /**
@@ -43,11 +46,11 @@
    * @since 19.0
    */
   public static <K, V> RemovalNotification<K, V> create(
-      @Nullable K key, @Nullable V value, RemovalCause cause) {
+      @CheckForNull K key, @CheckForNull V value, RemovalCause cause) {
     return new RemovalNotification(key, value, cause);
   }
 
-  private RemovalNotification(@Nullable K key, @Nullable V value, RemovalCause cause) {
+  private RemovalNotification(@CheckForNull K key, @CheckForNull V value, RemovalCause cause) {
     super(key, value);
     this.cause = checkNotNull(cause);
   }
diff --git a/guava/src/com/google/common/cache/Striped64.java b/guava/src/com/google/common/cache/Striped64.java
index 8c53158..0d2d75b 100644
--- a/guava/src/com/google/common/cache/Striped64.java
+++ b/guava/src/com/google/common/cache/Striped64.java
@@ -13,6 +13,7 @@
 
 import com.google.common.annotations.GwtIncompatible;
 import java.util.Random;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -21,6 +22,7 @@
  * so.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class Striped64 extends Number {
   /*
    * This class maintains a lazily-initialized table of atomically
@@ -125,7 +127,7 @@
    * class, we use a suboptimal int[] representation to avoid introducing a new type that can impede
    * class-unloading when ThreadLocals are not removed.
    */
-  static final ThreadLocal<int[]> threadHashCode = new ThreadLocal<>();
+  static final ThreadLocal<int @Nullable []> threadHashCode = new ThreadLocal<>();
 
   /** Generator of new random hash codes */
   static final Random rng = new Random();
@@ -134,7 +136,7 @@
   static final int NCPU = Runtime.getRuntime().availableProcessors();
 
   /** Table of cells. When non-null, size is a power of 2. */
-  transient volatile Cell @Nullable [] cells;
+  @CheckForNull transient volatile Cell[] cells;
 
   /**
    * Base value, used mainly when there is no contention, but also as a fallback during table
@@ -177,7 +179,7 @@
    * @param hc the hash code holder
    * @param wasUncontended false if CAS failed before call
    */
-  final void retryUpdate(long x, int[] hc, boolean wasUncontended) {
+  final void retryUpdate(long x, @CheckForNull int[] hc, boolean wasUncontended) {
     int h;
     if (hc == null) {
       threadHashCode.set(hc = new int[1]); // Initialize randomly
diff --git a/guava/src/com/google/common/cache/Weigher.java b/guava/src/com/google/common/cache/Weigher.java
index 7372a46..bbee3f5 100644
--- a/guava/src/com/google/common/cache/Weigher.java
+++ b/guava/src/com/google/common/cache/Weigher.java
@@ -24,6 +24,7 @@
  */
 @GwtCompatible
 @FunctionalInterface
+@ElementTypesAreNonnullByDefault
 public interface Weigher<K, V> {
 
   /**
diff --git a/guava/src/com/google/common/collect/AbstractBiMap.java b/guava/src/com/google/common/collect/AbstractBiMap.java
index 68744c1..9b2ad2a 100644
--- a/guava/src/com/google/common/collect/AbstractBiMap.java
+++ b/guava/src/com/google/common/collect/AbstractBiMap.java
@@ -18,7 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -35,6 +35,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.function.BiFunction;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -47,11 +48,12 @@
  * @author Mike Bostock
  */
 @GwtCompatible(emulated = true)
-abstract class AbstractBiMap<K, V> extends ForwardingMap<K, V>
-    implements BiMap<K, V>, Serializable {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractBiMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingMap<K, V> implements BiMap<K, V>, Serializable {
 
-  private transient @Nullable Map<K, V> delegate;
-  @RetainedWith transient @Nullable AbstractBiMap<V, K> inverse;
+  private transient Map<K, V> delegate;
+  @RetainedWith transient AbstractBiMap<V, K> inverse;
 
   /** Package-private constructor for creating a map-backed bimap. */
   AbstractBiMap(Map<K, V> forward, Map<V, K> backward) {
@@ -71,13 +73,15 @@
 
   /** Returns its input, or throws an exception if this is not a valid key. */
   @CanIgnoreReturnValue
-  K checkKey(@Nullable K key) {
+  @ParametricNullness
+  K checkKey(@ParametricNullness K key) {
     return key;
   }
 
   /** Returns its input, or throws an exception if this is not a valid value. */
   @CanIgnoreReturnValue
-  V checkValue(@Nullable V value) {
+  @ParametricNullness
+  V checkValue(@ParametricNullness V value) {
     return value;
   }
 
@@ -106,7 +110,7 @@
   // Query Operations (optimizations)
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return inverse.containsKey(value);
   }
 
@@ -114,17 +118,20 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V put(@Nullable K key, @Nullable V value) {
+  @CheckForNull
+  public V put(@ParametricNullness K key, @ParametricNullness V value) {
     return putInBothMaps(key, value, false);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public V forcePut(@Nullable K key, @Nullable V value) {
+  @CheckForNull
+  public V forcePut(@ParametricNullness K key, @ParametricNullness V value) {
     return putInBothMaps(key, value, true);
   }
 
-  private V putInBothMaps(@Nullable K key, @Nullable V value, boolean force) {
+  @CheckForNull
+  private V putInBothMaps(@ParametricNullness K key, @ParametricNullness V value, boolean force) {
     checkKey(key);
     checkValue(value);
     boolean containedKey = containsKey(key);
@@ -141,27 +148,35 @@
     return oldValue;
   }
 
-  private void updateInverseMap(K key, boolean containedKey, V oldValue, V newValue) {
+  private void updateInverseMap(
+      @ParametricNullness K key,
+      boolean containedKey,
+      @CheckForNull V oldValue,
+      @ParametricNullness V newValue) {
     if (containedKey) {
-      removeFromInverseMap(oldValue);
+      // The cast is safe because of the containedKey check.
+      removeFromInverseMap(uncheckedCastNullableTToT(oldValue));
     }
     inverse.delegate.put(newValue, key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(@Nullable Object key) {
+  @CheckForNull
+  public V remove(@CheckForNull Object key) {
     return containsKey(key) ? removeFromBothMaps(key) : null;
   }
 
   @CanIgnoreReturnValue
-  private V removeFromBothMaps(Object key) {
-    V oldValue = delegate.remove(key);
+  @ParametricNullness
+  private V removeFromBothMaps(@CheckForNull Object key) {
+    // The cast is safe because the callers of this method first check that the key is present.
+    V oldValue = uncheckedCastNullableTToT(delegate.remove(key));
     removeFromInverseMap(oldValue);
     return oldValue;
   }
 
-  private void removeFromInverseMap(V oldValue) {
+  private void removeFromInverseMap(@ParametricNullness V oldValue) {
     inverse.delegate.remove(oldValue);
   }
 
@@ -210,7 +225,7 @@
     return inverse;
   }
 
-  private transient @Nullable Set<K> keySet;
+  @CheckForNull private transient Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -231,7 +246,7 @@
     }
 
     @Override
-    public boolean remove(Object key) {
+    public boolean remove(@CheckForNull Object key) {
       if (!contains(key)) {
         return false;
       }
@@ -255,7 +270,7 @@
     }
   }
 
-  private transient @Nullable Set<V> valueSet;
+  @CheckForNull private transient Set<V> valueSet;
 
   @Override
   public Set<V> values() {
@@ -282,12 +297,13 @@
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       return standardToArray();
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // bug in our checker's handling of toArray signatures
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return standardToArray(array);
     }
 
@@ -297,7 +313,7 @@
     }
   }
 
-  private transient @Nullable Set<Entry<K, V>> entrySet;
+  @CheckForNull private transient Set<Entry<K, V>> entrySet;
 
   @Override
   public Set<Entry<K, V>> entrySet() {
@@ -337,7 +353,7 @@
   Iterator<Entry<K, V>> entrySetIterator() {
     final Iterator<Entry<K, V>> iterator = delegate.entrySet().iterator();
     return new Iterator<Entry<K, V>>() {
-      @Nullable Entry<K, V> entry;
+      @CheckForNull Entry<K, V> entry;
 
       @Override
       public boolean hasNext() {
@@ -352,7 +368,9 @@
 
       @Override
       public void remove() {
-        checkRemove(entry != null);
+        if (entry == null) {
+          throw new IllegalStateException("no calls to next() since the last call to remove()");
+        }
         V value = entry.getValue();
         iterator.remove();
         removeFromInverseMap(value);
@@ -376,12 +394,15 @@
     }
 
     @Override
-    public boolean remove(Object object) {
-      if (!esDelegate.contains(object)) {
+    public boolean remove(@CheckForNull Object object) {
+      /*
+       * `o instanceof Entry` is guaranteed by `contains`, but we check it here to satisfy our
+       * nullness checker.
+       */
+      if (!esDelegate.contains(object) || !(object instanceof Entry)) {
         return false;
       }
 
-      // safe because esDelegate.contains(object).
       Entry<?, ?> entry = (Entry<?, ?>) object;
       inverse.delegate.remove(entry.getValue());
       /*
@@ -402,16 +423,24 @@
 
     @Override
     public Object[] toArray() {
-      return standardToArray();
+      /*
+       * standardToArray returns `@Nullable Object[]` rather than `Object[]` but only because it can
+       * be used with collections that may contain null. This collection never contains nulls, so we
+       * can treat it as a plain `Object[]`.
+       */
+      @SuppressWarnings("nullness")
+      Object[] result = standardToArray();
+      return result;
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // bug in our checker's handling of toArray signatures
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return standardToArray(array);
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return Maps.containsEntryImpl(delegate(), o);
     }
 
@@ -432,7 +461,8 @@
   }
 
   /** The inverse of any other {@code AbstractBiMap} subclass. */
-  static class Inverse<K, V> extends AbstractBiMap<K, V> {
+  static class Inverse<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractBiMap<K, V> {
     Inverse(Map<K, V> backward, AbstractBiMap<V, K> forward) {
       super(backward, forward);
     }
@@ -447,12 +477,14 @@
      */
 
     @Override
-    K checkKey(K key) {
+    @ParametricNullness
+    K checkKey(@ParametricNullness K key) {
       return inverse.checkValue(key);
     }
 
     @Override
-    V checkValue(V value) {
+    @ParametricNullness
+    V checkValue(@ParametricNullness V value) {
       return inverse.checkKey(value);
     }
 
diff --git a/guava/src/com/google/common/collect/AbstractIndexedListIterator.java b/guava/src/com/google/common/collect/AbstractIndexedListIterator.java
index 855fb1c..abb3960 100644
--- a/guava/src/com/google/common/collect/AbstractIndexedListIterator.java
+++ b/guava/src/com/google/common/collect/AbstractIndexedListIterator.java
@@ -21,6 +21,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.ListIterator;
 import java.util.NoSuchElementException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * This class provides a skeletal implementation of the {@link ListIterator} interface across a
@@ -30,11 +31,14 @@
  * @author Jared Levy
  */
 @GwtCompatible
-abstract class AbstractIndexedListIterator<E> extends UnmodifiableListIterator<E> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractIndexedListIterator<E extends @Nullable Object>
+    extends UnmodifiableListIterator<E> {
   private final int size;
   private int position;
 
   /** Returns the element with the specified index. This method is called by {@link #next()}. */
+  @ParametricNullness
   protected abstract E get(int index);
 
   /**
@@ -70,6 +74,7 @@
   }
 
   @Override
+  @ParametricNullness
   public final E next() {
     if (!hasNext()) {
       throw new NoSuchElementException();
@@ -88,6 +93,7 @@
   }
 
   @Override
+  @ParametricNullness
   public final E previous() {
     if (!hasPrevious()) {
       throw new NoSuchElementException();
diff --git a/guava/src/com/google/common/collect/AbstractIterator.java b/guava/src/com/google/common/collect/AbstractIterator.java
index ff009c5..66273f4 100644
--- a/guava/src/com/google/common/collect/AbstractIterator.java
+++ b/guava/src/com/google/common/collect/AbstractIterator.java
@@ -17,10 +17,12 @@
 package com.google.common.collect;
 
 import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.NoSuchElementException;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -61,7 +63,8 @@
 // When making changes to this class, please also update the copy at
 // com.google.common.base.AbstractIterator
 @GwtCompatible
-public abstract class AbstractIterator<T> extends UnmodifiableIterator<T> {
+@ElementTypesAreNonnullByDefault
+public abstract class AbstractIterator<T extends @Nullable Object> extends UnmodifiableIterator<T> {
   private State state = State.NOT_READY;
 
   /** Constructor for use by subclasses. */
@@ -81,7 +84,7 @@
     FAILED,
   }
 
-  private @Nullable T next;
+  @CheckForNull private T next;
 
   /**
    * Returns the next element. <b>Note:</b> the implementation must call {@link #endOfData()} when
@@ -107,6 +110,7 @@
    *     this method. Any further attempts to use the iterator will result in an {@link
    *     IllegalStateException}.
    */
+  @CheckForNull
   protected abstract T computeNext();
 
   /**
@@ -117,6 +121,7 @@
    *     simple statement {@code return endOfData();}
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   protected final T endOfData() {
     state = State.DONE;
     return null;
@@ -148,12 +153,14 @@
 
   @CanIgnoreReturnValue // TODO(kak): Should we remove this?
   @Override
+  @ParametricNullness
   public final T next() {
     if (!hasNext()) {
       throw new NoSuchElementException();
     }
     state = State.NOT_READY;
-    T result = next;
+    // Safe because hasNext() ensures that tryToComputeNext() has put a T into `next`.
+    T result = uncheckedCastNullableTToT(next);
     next = null;
     return result;
   }
@@ -165,10 +172,12 @@
    * <p>Implementations of {@code AbstractIterator} that wish to expose this functionality should
    * implement {@code PeekingIterator}.
    */
+  @ParametricNullness
   public final T peek() {
     if (!hasNext()) {
       throw new NoSuchElementException();
     }
-    return next;
+    // Safe because hasNext() ensures that tryToComputeNext() has put a T into `next`.
+    return uncheckedCastNullableTToT(next);
   }
 }
diff --git a/guava/src/com/google/common/collect/AbstractListMultimap.java b/guava/src/com/google/common/collect/AbstractListMultimap.java
index d1c87c9..46c4ee2 100644
--- a/guava/src/com/google/common/collect/AbstractListMultimap.java
+++ b/guava/src/com/google/common/collect/AbstractListMultimap.java
@@ -22,6 +22,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -33,8 +34,9 @@
  * @since 2.0
  */
 @GwtCompatible
-abstract class AbstractListMultimap<K, V> extends AbstractMapBasedMultimap<K, V>
-    implements ListMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMapBasedMultimap<K, V> implements ListMultimap<K, V> {
   /**
    * Creates a new multimap that uses the provided map.
    *
@@ -53,12 +55,13 @@
   }
 
   @Override
-  <E> Collection<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+  <E extends @Nullable Object> Collection<E> unmodifiableCollectionSubclass(
+      Collection<E> collection) {
     return Collections.unmodifiableList((List<E>) collection);
   }
 
   @Override
-  Collection<V> wrapCollection(K key, Collection<V> collection) {
+  Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
     return wrapList(key, (List<V>) collection, null);
   }
 
@@ -72,7 +75,7 @@
    * Multimap} interface.
    */
   @Override
-  public List<V> get(@Nullable K key) {
+  public List<V> get(@ParametricNullness K key) {
     return (List<V>) super.get(key);
   }
 
@@ -85,7 +88,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public List<V> removeAll(@Nullable Object key) {
+  public List<V> removeAll(@CheckForNull Object key) {
     return (List<V>) super.removeAll(key);
   }
 
@@ -98,7 +101,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public List<V> replaceValues(@Nullable K key, Iterable<? extends V> values) {
+  public List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (List<V>) super.replaceValues(key, values);
   }
 
@@ -111,7 +114,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public boolean put(@Nullable K key, @Nullable V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     return super.put(key, value);
   }
 
@@ -133,7 +136,7 @@
    * in the same order. If the value orderings disagree, the multimaps will not be considered equal.
    */
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return super.equals(object);
   }
 
diff --git a/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java b/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
index b9f46ed..4c5a0f0 100644
--- a/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
+++ b/guava/src/com/google/common/collect/AbstractMapBasedMultimap.java
@@ -18,7 +18,9 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.Maps.ViewCachingAbstractMap;
@@ -42,6 +44,7 @@
 import java.util.SortedSet;
 import java.util.Spliterator;
 import java.util.function.BiConsumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -83,8 +86,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class AbstractMapBasedMultimap<K, V> extends AbstractMultimap<K, V>
-    implements Serializable {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractMapBasedMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMultimap<K, V> implements Serializable {
   /*
    * Here's an outline of the overall design.
    *
@@ -157,7 +161,7 @@
    * @param key key to associate with values in the collection
    * @return an empty collection of values
    */
-  Collection<V> createCollection(@Nullable K key) {
+  Collection<V> createCollection(@ParametricNullness K key) {
     return createCollection();
   }
 
@@ -173,14 +177,14 @@
   }
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return map.containsKey(key);
   }
 
   // Modification Operations
 
   @Override
-  public boolean put(@Nullable K key, @Nullable V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     Collection<V> collection = map.get(key);
     if (collection == null) {
       collection = createCollection(key);
@@ -199,7 +203,7 @@
     }
   }
 
-  private Collection<V> getOrCreateCollection(@Nullable K key) {
+  private Collection<V> getOrCreateCollection(@ParametricNullness K key) {
     Collection<V> collection = map.get(key);
     if (collection == null) {
       collection = createCollection(key);
@@ -216,7 +220,7 @@
    * <p>The returned collection is immutable.
    */
   @Override
-  public Collection<V> replaceValues(@Nullable K key, Iterable<? extends V> values) {
+  public Collection<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     Iterator<? extends V> iterator = values.iterator();
     if (!iterator.hasNext()) {
       return removeAll(key);
@@ -245,7 +249,7 @@
    * <p>The returned collection is immutable.
    */
   @Override
-  public Collection<V> removeAll(@Nullable Object key) {
+  public Collection<V> removeAll(@CheckForNull Object key) {
     Collection<V> collection = map.remove(key);
 
     if (collection == null) {
@@ -260,7 +264,8 @@
     return unmodifiableCollectionSubclass(output);
   }
 
-  <E> Collection<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+  <E extends @Nullable Object> Collection<E> unmodifiableCollectionSubclass(
+      Collection<E> collection) {
     return Collections.unmodifiableCollection(collection);
   }
 
@@ -282,7 +287,7 @@
    * <p>The returned collection is not serializable.
    */
   @Override
-  public Collection<V> get(@Nullable K key) {
+  public Collection<V> get(@ParametricNullness K key) {
     Collection<V> collection = map.get(key);
     if (collection == null) {
       collection = createCollection(key);
@@ -294,11 +299,12 @@
    * Generates a decorated collection that remains consistent with the values in the multimap for
    * the provided key. Changes to the multimap may alter the returned collection, and vice versa.
    */
-  Collection<V> wrapCollection(@Nullable K key, Collection<V> collection) {
+  Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
     return new WrappedCollection(key, collection, null);
   }
 
-  final List<V> wrapList(@Nullable K key, List<V> list, @Nullable WrappedCollection ancestor) {
+  final List<V> wrapList(
+      @ParametricNullness K key, List<V> list, @CheckForNull WrappedCollection ancestor) {
     return (list instanceof RandomAccess)
         ? new RandomAccessWrappedList(key, list, ancestor)
         : new WrappedList(key, list, ancestor);
@@ -321,13 +327,15 @@
    */
   @WeakOuter
   class WrappedCollection extends AbstractCollection<V> {
-    final @Nullable K key;
+    @ParametricNullness final K key;
     Collection<V> delegate;
-    final @Nullable WrappedCollection ancestor;
-    final @Nullable Collection<V> ancestorDelegate;
+    @CheckForNull final WrappedCollection ancestor;
+    @CheckForNull final Collection<V> ancestorDelegate;
 
     WrappedCollection(
-        @Nullable K key, Collection<V> delegate, @Nullable WrappedCollection ancestor) {
+        @ParametricNullness K key,
+        Collection<V> delegate,
+        @CheckForNull WrappedCollection ancestor) {
       this.key = key;
       this.delegate = delegate;
       this.ancestor = ancestor;
@@ -367,6 +375,7 @@
       }
     }
 
+    @ParametricNullness
     K getKey() {
       return key;
     }
@@ -392,7 +401,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
@@ -458,6 +467,7 @@
       }
 
       @Override
+      @ParametricNullness
       public V next() {
         validateIterator();
         return delegateIterator.next();
@@ -477,7 +487,7 @@
     }
 
     @Override
-    public boolean add(V value) {
+    public boolean add(@ParametricNullness V value) {
       refreshIfEmpty();
       boolean wasEmpty = delegate.isEmpty();
       boolean changed = delegate.add(value);
@@ -490,6 +500,7 @@
       return changed;
     }
 
+    @CheckForNull
     WrappedCollection getAncestor() {
       return ancestor;
     }
@@ -514,7 +525,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       refreshIfEmpty();
       return delegate.contains(o);
     }
@@ -537,7 +548,7 @@
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       refreshIfEmpty();
       boolean changed = delegate.remove(o);
       if (changed) {
@@ -576,7 +587,8 @@
     }
   }
 
-  private static <E> Iterator<E> iteratorOrListIterator(Collection<E> collection) {
+  private static <E extends @Nullable Object> Iterator<E> iteratorOrListIterator(
+      Collection<E> collection) {
     return (collection instanceof List)
         ? ((List<E>) collection).listIterator()
         : collection.iterator();
@@ -585,7 +597,7 @@
   /** Set decorator that stays in sync with the multimap values for a key. */
   @WeakOuter
   class WrappedSet extends WrappedCollection implements Set<V> {
-    WrappedSet(@Nullable K key, Set<V> delegate) {
+    WrappedSet(@ParametricNullness K key, Set<V> delegate) {
       super(key, delegate, null);
     }
 
@@ -612,7 +624,10 @@
   /** SortedSet decorator that stays in sync with the multimap values for a key. */
   @WeakOuter
   class WrappedSortedSet extends WrappedCollection implements SortedSet<V> {
-    WrappedSortedSet(@Nullable K key, SortedSet<V> delegate, @Nullable WrappedCollection ancestor) {
+    WrappedSortedSet(
+        @ParametricNullness K key,
+        SortedSet<V> delegate,
+        @CheckForNull WrappedCollection ancestor) {
       super(key, delegate, ancestor);
     }
 
@@ -621,24 +636,27 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super V> comparator() {
       return getSortedSetDelegate().comparator();
     }
 
     @Override
+    @ParametricNullness
     public V first() {
       refreshIfEmpty();
       return getSortedSetDelegate().first();
     }
 
     @Override
+    @ParametricNullness
     public V last() {
       refreshIfEmpty();
       return getSortedSetDelegate().last();
     }
 
     @Override
-    public SortedSet<V> headSet(V toElement) {
+    public SortedSet<V> headSet(@ParametricNullness V toElement) {
       refreshIfEmpty();
       return new WrappedSortedSet(
           getKey(),
@@ -647,7 +665,7 @@
     }
 
     @Override
-    public SortedSet<V> subSet(V fromElement, V toElement) {
+    public SortedSet<V> subSet(@ParametricNullness V fromElement, @ParametricNullness V toElement) {
       refreshIfEmpty();
       return new WrappedSortedSet(
           getKey(),
@@ -656,7 +674,7 @@
     }
 
     @Override
-    public SortedSet<V> tailSet(V fromElement) {
+    public SortedSet<V> tailSet(@ParametricNullness V fromElement) {
       refreshIfEmpty();
       return new WrappedSortedSet(
           getKey(),
@@ -668,7 +686,9 @@
   @WeakOuter
   class WrappedNavigableSet extends WrappedSortedSet implements NavigableSet<V> {
     WrappedNavigableSet(
-        @Nullable K key, NavigableSet<V> delegate, @Nullable WrappedCollection ancestor) {
+        @ParametricNullness K key,
+        NavigableSet<V> delegate,
+        @CheckForNull WrappedCollection ancestor) {
       super(key, delegate, ancestor);
     }
 
@@ -678,31 +698,37 @@
     }
 
     @Override
-    public V lower(V v) {
+    @CheckForNull
+    public V lower(@ParametricNullness V v) {
       return getSortedSetDelegate().lower(v);
     }
 
     @Override
-    public V floor(V v) {
+    @CheckForNull
+    public V floor(@ParametricNullness V v) {
       return getSortedSetDelegate().floor(v);
     }
 
     @Override
-    public V ceiling(V v) {
+    @CheckForNull
+    public V ceiling(@ParametricNullness V v) {
       return getSortedSetDelegate().ceiling(v);
     }
 
     @Override
-    public V higher(V v) {
+    @CheckForNull
+    public V higher(@ParametricNullness V v) {
       return getSortedSetDelegate().higher(v);
     }
 
     @Override
+    @CheckForNull
     public V pollFirst() {
       return Iterators.pollNext(iterator());
     }
 
     @Override
+    @CheckForNull
     public V pollLast() {
       return Iterators.pollNext(descendingIterator());
     }
@@ -723,18 +749,21 @@
 
     @Override
     public NavigableSet<V> subSet(
-        V fromElement, boolean fromInclusive, V toElement, boolean toInclusive) {
+        @ParametricNullness V fromElement,
+        boolean fromInclusive,
+        @ParametricNullness V toElement,
+        boolean toInclusive) {
       return wrap(
           getSortedSetDelegate().subSet(fromElement, fromInclusive, toElement, toInclusive));
     }
 
     @Override
-    public NavigableSet<V> headSet(V toElement, boolean inclusive) {
+    public NavigableSet<V> headSet(@ParametricNullness V toElement, boolean inclusive) {
       return wrap(getSortedSetDelegate().headSet(toElement, inclusive));
     }
 
     @Override
-    public NavigableSet<V> tailSet(V fromElement, boolean inclusive) {
+    public NavigableSet<V> tailSet(@ParametricNullness V fromElement, boolean inclusive) {
       return wrap(getSortedSetDelegate().tailSet(fromElement, inclusive));
     }
   }
@@ -742,7 +771,8 @@
   /** List decorator that stays in sync with the multimap values for a key. */
   @WeakOuter
   class WrappedList extends WrappedCollection implements List<V> {
-    WrappedList(@Nullable K key, List<V> delegate, @Nullable WrappedCollection ancestor) {
+    WrappedList(
+        @ParametricNullness K key, List<V> delegate, @CheckForNull WrappedCollection ancestor) {
       super(key, delegate, ancestor);
     }
 
@@ -768,19 +798,21 @@
     }
 
     @Override
+    @ParametricNullness
     public V get(int index) {
       refreshIfEmpty();
       return getListDelegate().get(index);
     }
 
     @Override
-    public V set(int index, V element) {
+    @ParametricNullness
+    public V set(int index, @ParametricNullness V element) {
       refreshIfEmpty();
       return getListDelegate().set(index, element);
     }
 
     @Override
-    public void add(int index, V element) {
+    public void add(int index, @ParametricNullness V element) {
       refreshIfEmpty();
       boolean wasEmpty = getDelegate().isEmpty();
       getListDelegate().add(index, element);
@@ -791,6 +823,7 @@
     }
 
     @Override
+    @ParametricNullness
     public V remove(int index) {
       refreshIfEmpty();
       V value = getListDelegate().remove(index);
@@ -800,13 +833,13 @@
     }
 
     @Override
-    public int indexOf(Object o) {
+    public int indexOf(@CheckForNull Object o) {
       refreshIfEmpty();
       return getListDelegate().indexOf(o);
     }
 
     @Override
-    public int lastIndexOf(Object o) {
+    public int lastIndexOf(@CheckForNull Object o) {
       refreshIfEmpty();
       return getListDelegate().lastIndexOf(o);
     }
@@ -850,6 +883,7 @@
       }
 
       @Override
+      @ParametricNullness
       public V previous() {
         return getDelegateListIterator().previous();
       }
@@ -865,12 +899,12 @@
       }
 
       @Override
-      public void set(V value) {
+      public void set(@ParametricNullness V value) {
         getDelegateListIterator().set(value);
       }
 
       @Override
-      public void add(V value) {
+      public void add(@ParametricNullness V value) {
         boolean wasEmpty = isEmpty();
         getDelegateListIterator().add(value);
         totalSize++;
@@ -887,7 +921,7 @@
    */
   private class RandomAccessWrappedList extends WrappedList implements RandomAccess {
     RandomAccessWrappedList(
-        @Nullable K key, List<V> delegate, @Nullable WrappedCollection ancestor) {
+        @ParametricNullness K key, List<V> delegate, @CheckForNull WrappedCollection ancestor) {
       super(key, delegate, ancestor);
     }
   }
@@ -917,7 +951,7 @@
     public Iterator<K> iterator() {
       final Iterator<Entry<K, Collection<V>>> entryIterator = map().entrySet().iterator();
       return new Iterator<K>() {
-        @Nullable Entry<K, Collection<V>> entry;
+        @CheckForNull Entry<K, Collection<V>> entry;
 
         @Override
         public boolean hasNext() {
@@ -925,6 +959,7 @@
         }
 
         @Override
+        @ParametricNullness
         public K next() {
           entry = entryIterator.next();
           return entry.getKey();
@@ -932,7 +967,7 @@
 
         @Override
         public void remove() {
-          checkRemove(entry != null);
+          checkState(entry != null, "no calls to next() since the last call to remove()");
           Collection<V> collection = entry.getValue();
           entryIterator.remove();
           totalSize -= collection.size();
@@ -950,7 +985,7 @@
     }
 
     @Override
-    public boolean remove(Object key) {
+    public boolean remove(@CheckForNull Object key) {
       int count = 0;
       Collection<V> collection = map().remove(key);
       if (collection != null) {
@@ -972,7 +1007,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       return this == object || this.map().keySet().equals(object);
     }
 
@@ -994,32 +1029,35 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return sortedMap().comparator();
     }
 
     @Override
+    @ParametricNullness
     public K first() {
       return sortedMap().firstKey();
     }
 
     @Override
-    public SortedSet<K> headSet(K toElement) {
+    public SortedSet<K> headSet(@ParametricNullness K toElement) {
       return new SortedKeySet(sortedMap().headMap(toElement));
     }
 
     @Override
+    @ParametricNullness
     public K last() {
       return sortedMap().lastKey();
     }
 
     @Override
-    public SortedSet<K> subSet(K fromElement, K toElement) {
+    public SortedSet<K> subSet(@ParametricNullness K fromElement, @ParametricNullness K toElement) {
       return new SortedKeySet(sortedMap().subMap(fromElement, toElement));
     }
 
     @Override
-    public SortedSet<K> tailSet(K fromElement) {
+    public SortedSet<K> tailSet(@ParametricNullness K fromElement) {
       return new SortedKeySet(sortedMap().tailMap(fromElement));
     }
   }
@@ -1036,31 +1074,37 @@
     }
 
     @Override
-    public K lower(K k) {
+    @CheckForNull
+    public K lower(@ParametricNullness K k) {
       return sortedMap().lowerKey(k);
     }
 
     @Override
-    public K floor(K k) {
+    @CheckForNull
+    public K floor(@ParametricNullness K k) {
       return sortedMap().floorKey(k);
     }
 
     @Override
-    public K ceiling(K k) {
+    @CheckForNull
+    public K ceiling(@ParametricNullness K k) {
       return sortedMap().ceilingKey(k);
     }
 
     @Override
-    public K higher(K k) {
+    @CheckForNull
+    public K higher(@ParametricNullness K k) {
       return sortedMap().higherKey(k);
     }
 
     @Override
+    @CheckForNull
     public K pollFirst() {
       return Iterators.pollNext(iterator());
     }
 
     @Override
+    @CheckForNull
     public K pollLast() {
       return Iterators.pollNext(descendingIterator());
     }
@@ -1076,40 +1120,44 @@
     }
 
     @Override
-    public NavigableSet<K> headSet(K toElement) {
+    public NavigableSet<K> headSet(@ParametricNullness K toElement) {
       return headSet(toElement, false);
     }
 
     @Override
-    public NavigableSet<K> headSet(K toElement, boolean inclusive) {
+    public NavigableSet<K> headSet(@ParametricNullness K toElement, boolean inclusive) {
       return new NavigableKeySet(sortedMap().headMap(toElement, inclusive));
     }
 
     @Override
-    public NavigableSet<K> subSet(K fromElement, K toElement) {
+    public NavigableSet<K> subSet(
+        @ParametricNullness K fromElement, @ParametricNullness K toElement) {
       return subSet(fromElement, true, toElement, false);
     }
 
     @Override
     public NavigableSet<K> subSet(
-        K fromElement, boolean fromInclusive, K toElement, boolean toInclusive) {
+        @ParametricNullness K fromElement,
+        boolean fromInclusive,
+        @ParametricNullness K toElement,
+        boolean toInclusive) {
       return new NavigableKeySet(
           sortedMap().subMap(fromElement, fromInclusive, toElement, toInclusive));
     }
 
     @Override
-    public NavigableSet<K> tailSet(K fromElement) {
+    public NavigableSet<K> tailSet(@ParametricNullness K fromElement) {
       return tailSet(fromElement, true);
     }
 
     @Override
-    public NavigableSet<K> tailSet(K fromElement, boolean inclusive) {
+    public NavigableSet<K> tailSet(@ParametricNullness K fromElement, boolean inclusive) {
       return new NavigableKeySet(sortedMap().tailMap(fromElement, inclusive));
     }
   }
 
   /** Removes all values for the provided key. */
-  private void removeValuesForKey(Object key) {
+  private void removeValuesForKey(@CheckForNull Object key) {
     Collection<V> collection = Maps.safeRemove(map, key);
 
     if (collection != null) {
@@ -1119,10 +1167,10 @@
     }
   }
 
-  private abstract class Itr<T> implements Iterator<T> {
+  private abstract class Itr<T extends @Nullable Object> implements Iterator<T> {
     final Iterator<Entry<K, Collection<V>>> keyIterator;
-    @Nullable K key;
-    @Nullable Collection<V> collection;
+    @CheckForNull K key;
+    @CheckForNull Collection<V> collection;
     Iterator<V> valueIterator;
 
     Itr() {
@@ -1132,7 +1180,7 @@
       valueIterator = Iterators.emptyModifiableIterator();
     }
 
-    abstract T output(K key, V value);
+    abstract T output(@ParametricNullness K key, @ParametricNullness V value);
 
     @Override
     public boolean hasNext() {
@@ -1147,13 +1195,21 @@
         collection = mapEntry.getValue();
         valueIterator = collection.iterator();
       }
-      return output(key, valueIterator.next());
+      /*
+       * uncheckedCastNullableTToT is safe: The first call to this method always enters the !hasNext() case and
+       * populates key, after which it's never cleared.
+       */
+      return output(uncheckedCastNullableTToT(key), valueIterator.next());
     }
 
     @Override
     public void remove() {
       valueIterator.remove();
-      if (collection.isEmpty()) {
+      /*
+       * requireNonNull is safe because we've already initialized `collection`. If we hadn't, then
+       * valueIterator.remove() would have failed.
+       */
+      if (requireNonNull(collection).isEmpty()) {
         keyIterator.remove();
       }
       totalSize--;
@@ -1180,7 +1236,8 @@
   Iterator<V> valueIterator() {
     return new Itr<V>() {
       @Override
-      V output(K key, V value) {
+      @ParametricNullness
+      V output(@ParametricNullness K key, @ParametricNullness V value) {
         return value;
       }
     };
@@ -1238,7 +1295,7 @@
   Iterator<Entry<K, V>> entryIterator() {
     return new Itr<Entry<K, V>>() {
       @Override
-      Entry<K, V> output(K key, V value) {
+      Entry<K, V> output(@ParametricNullness K key, @ParametricNullness V value) {
         return Maps.immutableEntry(key, value);
       }
     };
@@ -1300,12 +1357,13 @@
     // The following methods are included for performance.
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return Maps.safeContainsKey(submap, key);
     }
 
     @Override
-    public Collection<V> get(Object key) {
+    @CheckForNull
+    public Collection<V> get(@CheckForNull Object key) {
       Collection<V> collection = Maps.safeGet(submap, key);
       if (collection == null) {
         return null;
@@ -1326,7 +1384,8 @@
     }
 
     @Override
-    public Collection<V> remove(Object key) {
+    @CheckForNull
+    public Collection<V> remove(@CheckForNull Object key) {
       Collection<V> collection = submap.remove(key);
       if (collection == null) {
         return null;
@@ -1340,7 +1399,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       return this == object || submap.equals(object);
     }
 
@@ -1388,16 +1447,17 @@
       // The following methods are included for performance.
 
       @Override
-      public boolean contains(Object o) {
+      public boolean contains(@CheckForNull Object o) {
         return Collections2.safeContains(submap.entrySet(), o);
       }
 
       @Override
-      public boolean remove(Object o) {
+      public boolean remove(@CheckForNull Object o) {
         if (!contains(o)) {
           return false;
         }
-        Entry<?, ?> entry = (Entry<?, ?>) o;
+        // requireNonNull is safe because of the contains check.
+        Entry<?, ?> entry = requireNonNull((Entry<?, ?>) o);
         removeValuesForKey(entry.getKey());
         return true;
       }
@@ -1406,7 +1466,7 @@
     /** Iterator across all keys and value collections. */
     class AsMapIterator implements Iterator<Entry<K, Collection<V>>> {
       final Iterator<Entry<K, Collection<V>>> delegateIterator = submap.entrySet().iterator();
-      @Nullable Collection<V> collection;
+      @CheckForNull Collection<V> collection;
 
       @Override
       public boolean hasNext() {
@@ -1422,7 +1482,7 @@
 
       @Override
       public void remove() {
-        checkRemove(collection != null);
+        checkState(collection != null, "no calls to next() since the last call to remove()");
         delegateIterator.remove();
         totalSize -= collection.size();
         collection.clear();
@@ -1442,36 +1502,40 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return sortedMap().comparator();
     }
 
     @Override
+    @ParametricNullness
     public K firstKey() {
       return sortedMap().firstKey();
     }
 
     @Override
+    @ParametricNullness
     public K lastKey() {
       return sortedMap().lastKey();
     }
 
     @Override
-    public SortedMap<K, Collection<V>> headMap(K toKey) {
+    public SortedMap<K, Collection<V>> headMap(@ParametricNullness K toKey) {
       return new SortedAsMap(sortedMap().headMap(toKey));
     }
 
     @Override
-    public SortedMap<K, Collection<V>> subMap(K fromKey, K toKey) {
+    public SortedMap<K, Collection<V>> subMap(
+        @ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return new SortedAsMap(sortedMap().subMap(fromKey, toKey));
     }
 
     @Override
-    public SortedMap<K, Collection<V>> tailMap(K fromKey) {
+    public SortedMap<K, Collection<V>> tailMap(@ParametricNullness K fromKey) {
       return new SortedAsMap(sortedMap().tailMap(fromKey));
     }
 
-    @Nullable SortedSet<K> sortedKeySet;
+    @CheckForNull SortedSet<K> sortedKeySet;
 
     // returns a SortedSet, even though returning a Set would be sufficient to
     // satisfy the SortedMap.keySet() interface
@@ -1499,71 +1563,84 @@
     }
 
     @Override
-    public Entry<K, Collection<V>> lowerEntry(K key) {
+    @CheckForNull
+    public Entry<K, Collection<V>> lowerEntry(@ParametricNullness K key) {
       Entry<K, Collection<V>> entry = sortedMap().lowerEntry(key);
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
-    public K lowerKey(K key) {
+    @CheckForNull
+    public K lowerKey(@ParametricNullness K key) {
       return sortedMap().lowerKey(key);
     }
 
     @Override
-    public Entry<K, Collection<V>> floorEntry(K key) {
+    @CheckForNull
+    public Entry<K, Collection<V>> floorEntry(@ParametricNullness K key) {
       Entry<K, Collection<V>> entry = sortedMap().floorEntry(key);
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
-    public K floorKey(K key) {
+    @CheckForNull
+    public K floorKey(@ParametricNullness K key) {
       return sortedMap().floorKey(key);
     }
 
     @Override
-    public Entry<K, Collection<V>> ceilingEntry(K key) {
+    @CheckForNull
+    public Entry<K, Collection<V>> ceilingEntry(@ParametricNullness K key) {
       Entry<K, Collection<V>> entry = sortedMap().ceilingEntry(key);
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
-    public K ceilingKey(K key) {
+    @CheckForNull
+    public K ceilingKey(@ParametricNullness K key) {
       return sortedMap().ceilingKey(key);
     }
 
     @Override
-    public Entry<K, Collection<V>> higherEntry(K key) {
+    @CheckForNull
+    public Entry<K, Collection<V>> higherEntry(@ParametricNullness K key) {
       Entry<K, Collection<V>> entry = sortedMap().higherEntry(key);
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
-    public K higherKey(K key) {
+    @CheckForNull
+    public K higherKey(@ParametricNullness K key) {
       return sortedMap().higherKey(key);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, Collection<V>> firstEntry() {
       Entry<K, Collection<V>> entry = sortedMap().firstEntry();
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, Collection<V>> lastEntry() {
       Entry<K, Collection<V>> entry = sortedMap().lastEntry();
       return (entry == null) ? null : wrapEntry(entry);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, Collection<V>> pollFirstEntry() {
       return pollAsMapEntry(entrySet().iterator());
     }
 
     @Override
+    @CheckForNull
     public Entry<K, Collection<V>> pollLastEntry() {
       return pollAsMapEntry(descendingMap().entrySet().iterator());
     }
 
+    @CheckForNull
     Entry<K, Collection<V>> pollAsMapEntry(Iterator<Entry<K, Collection<V>>> entryIterator) {
       if (!entryIterator.hasNext()) {
         return null;
@@ -1601,33 +1678,38 @@
     }
 
     @Override
-    public NavigableMap<K, Collection<V>> subMap(K fromKey, K toKey) {
+    public NavigableMap<K, Collection<V>> subMap(
+        @ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return subMap(fromKey, true, toKey, false);
     }
 
     @Override
     public NavigableMap<K, Collection<V>> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return new NavigableAsMap(sortedMap().subMap(fromKey, fromInclusive, toKey, toInclusive));
     }
 
     @Override
-    public NavigableMap<K, Collection<V>> headMap(K toKey) {
+    public NavigableMap<K, Collection<V>> headMap(@ParametricNullness K toKey) {
       return headMap(toKey, false);
     }
 
     @Override
-    public NavigableMap<K, Collection<V>> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, Collection<V>> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return new NavigableAsMap(sortedMap().headMap(toKey, inclusive));
     }
 
     @Override
-    public NavigableMap<K, Collection<V>> tailMap(K fromKey) {
+    public NavigableMap<K, Collection<V>> tailMap(@ParametricNullness K fromKey) {
       return tailMap(fromKey, true);
     }
 
     @Override
-    public NavigableMap<K, Collection<V>> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, Collection<V>> tailMap(
+        @ParametricNullness K fromKey, boolean inclusive) {
       return new NavigableAsMap(sortedMap().tailMap(fromKey, inclusive));
     }
   }
diff --git a/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java b/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java
index 2d28c1d..b37214e 100644
--- a/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java
+++ b/guava/src/com/google/common/collect/AbstractMapBasedMultiset.java
@@ -18,8 +18,10 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
 import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -33,6 +35,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.function.ObjIntConsumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -44,7 +47,9 @@
  * @author Kevin Bourrillion
  */
 @GwtCompatible(emulated = true)
-abstract class AbstractMapBasedMultiset<E> extends AbstractMultiset<E> implements Serializable {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractMapBasedMultiset<E extends @Nullable Object> extends AbstractMultiset<E>
+    implements Serializable {
   // TODO(lowasser): consider overhauling this back to Map<E, Integer>
   private transient Map<E, Count> backingMap;
 
@@ -84,7 +89,7 @@
   Iterator<E> elementIterator() {
     final Iterator<Map.Entry<E, Count>> backingEntries = backingMap.entrySet().iterator();
     return new Iterator<E>() {
-      Map.@Nullable Entry<E, Count> toRemove;
+      @CheckForNull Map.Entry<E, Count> toRemove;
 
       @Override
       public boolean hasNext() {
@@ -92,6 +97,7 @@
       }
 
       @Override
+      @ParametricNullness
       public E next() {
         final Map.Entry<E, Count> mapEntry = backingEntries.next();
         toRemove = mapEntry;
@@ -100,7 +106,7 @@
 
       @Override
       public void remove() {
-        checkRemove(toRemove != null);
+        checkState(toRemove != null, "no calls to next() since the last call to remove()");
         size -= toRemove.getValue().getAndSet(0);
         backingEntries.remove();
         toRemove = null;
@@ -112,7 +118,7 @@
   Iterator<Entry<E>> entryIterator() {
     final Iterator<Map.Entry<E, Count>> backingEntries = backingMap.entrySet().iterator();
     return new Iterator<Multiset.Entry<E>>() {
-      Map.@Nullable Entry<E, Count> toRemove;
+      @CheckForNull Map.Entry<E, Count> toRemove;
 
       @Override
       public boolean hasNext() {
@@ -125,6 +131,7 @@
         toRemove = mapEntry;
         return new Multisets.AbstractEntry<E>() {
           @Override
+          @ParametricNullness
           public E getElement() {
             return mapEntry.getKey();
           }
@@ -145,7 +152,7 @@
 
       @Override
       public void remove() {
-        checkRemove(toRemove != null);
+        checkState(toRemove != null, "no calls to next() since the last call to remove()");
         size -= toRemove.getValue().getAndSet(0);
         backingEntries.remove();
         toRemove = null;
@@ -192,7 +199,7 @@
    */
   private class MapBasedMultisetIterator implements Iterator<E> {
     final Iterator<Map.Entry<E, Count>> entryIterator;
-    Map.@Nullable Entry<E, Count> currentEntry;
+    @CheckForNull Map.Entry<E, Count> currentEntry;
     int occurrencesLeft;
     boolean canRemove;
 
@@ -206,6 +213,7 @@
     }
 
     @Override
+    @ParametricNullness
     public E next() {
       if (occurrencesLeft == 0) {
         currentEntry = entryIterator.next();
@@ -213,13 +221,21 @@
       }
       occurrencesLeft--;
       canRemove = true;
-      return currentEntry.getKey();
+      /*
+       * requireNonNull is safe because occurrencesLeft starts at 0, forcing us to initialize
+       * currentEntry above. After that, we never clear it.
+       */
+      return requireNonNull(currentEntry).getKey();
     }
 
     @Override
     public void remove() {
       checkRemove(canRemove);
-      int frequency = currentEntry.getValue().get();
+      /*
+       * requireNonNull is safe because canRemove is set to true only after we initialize
+       * currentEntry (which we never subsequently clear).
+       */
+      int frequency = requireNonNull(currentEntry).getValue().get();
       if (frequency <= 0) {
         throw new ConcurrentModificationException();
       }
@@ -232,7 +248,7 @@
   }
 
   @Override
-  public int count(@Nullable Object element) {
+  public int count(@CheckForNull Object element) {
     Count frequency = Maps.safeGet(backingMap, element);
     return (frequency == null) ? 0 : frequency.get();
   }
@@ -247,7 +263,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public int add(@Nullable E element, int occurrences) {
+  public int add(@ParametricNullness E element, int occurrences) {
     if (occurrences == 0) {
       return count(element);
     }
@@ -269,7 +285,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public int remove(@Nullable Object element, int occurrences) {
+  public int remove(@CheckForNull Object element, int occurrences) {
     if (occurrences == 0) {
       return count(element);
     }
@@ -297,7 +313,7 @@
   // Roughly a 33% performance improvement over AbstractMultiset.setCount().
   @CanIgnoreReturnValue
   @Override
-  public int setCount(@Nullable E element, int count) {
+  public int setCount(@ParametricNullness E element, int count) {
     checkNonnegative(count, "count");
 
     Count existingCounter;
@@ -318,7 +334,7 @@
     return oldCount;
   }
 
-  private static int getAndSet(@Nullable Count i, int count) {
+  private static int getAndSet(@CheckForNull Count i, int count) {
     if (i == null) {
       return 0;
     }
diff --git a/guava/src/com/google/common/collect/AbstractMapEntry.java b/guava/src/com/google/common/collect/AbstractMapEntry.java
index 267897d..e9accf0 100644
--- a/guava/src/com/google/common/collect/AbstractMapEntry.java
+++ b/guava/src/com/google/common/collect/AbstractMapEntry.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Objects;
 import java.util.Map.Entry;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -28,21 +29,26 @@
  * @author Jared Levy
  */
 @GwtCompatible
-abstract class AbstractMapEntry<K, V> implements Entry<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractMapEntry<K extends @Nullable Object, V extends @Nullable Object>
+    implements Entry<K, V> {
 
   @Override
+  @ParametricNullness
   public abstract K getKey();
 
   @Override
+  @ParametricNullness
   public abstract V getValue();
 
   @Override
-  public V setValue(V value) {
+  @ParametricNullness
+  public V setValue(@ParametricNullness V value) {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Entry) {
       Entry<?, ?> that = (Entry<?, ?>) object;
       return Objects.equal(this.getKey(), that.getKey())
diff --git a/guava/src/com/google/common/collect/AbstractMultimap.java b/guava/src/com/google/common/collect/AbstractMultimap.java
index fedafd2..299decb 100644
--- a/guava/src/com/google/common/collect/AbstractMultimap.java
+++ b/guava/src/com/google/common/collect/AbstractMultimap.java
@@ -20,6 +20,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.WeakOuter;
 import java.util.AbstractCollection;
 import java.util.Collection;
@@ -29,6 +30,7 @@
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.Spliterators;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -37,14 +39,16 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class AbstractMultimap<K, V> implements Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    implements Multimap<K, V> {
   @Override
   public boolean isEmpty() {
     return size() == 0;
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     for (Collection<V> collection : asMap().values()) {
       if (collection.contains(value)) {
         return true;
@@ -55,27 +59,27 @@
   }
 
   @Override
-  public boolean containsEntry(@Nullable Object key, @Nullable Object value) {
+  public boolean containsEntry(@CheckForNull Object key, @CheckForNull Object value) {
     Collection<V> collection = asMap().get(key);
     return collection != null && collection.contains(value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean remove(@Nullable Object key, @Nullable Object value) {
+  public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
     Collection<V> collection = asMap().get(key);
     return collection != null && collection.remove(value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean put(@Nullable K key, @Nullable V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     return get(key).add(value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean putAll(@Nullable K key, Iterable<? extends V> values) {
+  public boolean putAll(@ParametricNullness K key, Iterable<? extends V> values) {
     checkNotNull(values);
     // make sure we only call values.iterator() once
     // and we only call get(key) if values is nonempty
@@ -100,14 +104,14 @@
 
   @CanIgnoreReturnValue
   @Override
-  public Collection<V> replaceValues(@Nullable K key, Iterable<? extends V> values) {
+  public Collection<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     checkNotNull(values);
     Collection<V> result = removeAll(key);
     putAll(key, values);
     return result;
   }
 
-  private transient @Nullable Collection<Entry<K, V>> entries;
+  @LazyInit @CheckForNull private transient Collection<Entry<K, V>> entries;
 
   @Override
   public Collection<Entry<K, V>> entries() {
@@ -143,7 +147,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       return Sets.equalsImpl(this, obj);
     }
   }
@@ -155,7 +159,7 @@
         entryIterator(), size(), (this instanceof SetMultimap) ? Spliterator.DISTINCT : 0);
   }
 
-  private transient @Nullable Set<K> keySet;
+  @LazyInit @CheckForNull private transient Set<K> keySet;
 
   @Override
   public Set<K> keySet() {
@@ -165,7 +169,7 @@
 
   abstract Set<K> createKeySet();
 
-  private transient @Nullable Multiset<K> keys;
+  @LazyInit @CheckForNull private transient Multiset<K> keys;
 
   @Override
   public Multiset<K> keys() {
@@ -175,7 +179,7 @@
 
   abstract Multiset<K> createKeys();
 
-  private transient @Nullable Collection<V> values;
+  @LazyInit @CheckForNull private transient Collection<V> values;
 
   @Override
   public Collection<V> values() {
@@ -203,7 +207,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return AbstractMultimap.this.containsValue(o);
     }
 
@@ -221,7 +225,7 @@
     return Spliterators.spliterator(valueIterator(), size(), 0);
   }
 
-  private transient @Nullable Map<K, Collection<V>> asMap;
+  @LazyInit @CheckForNull private transient Map<K, Collection<V>> asMap;
 
   @Override
   public Map<K, Collection<V>> asMap() {
@@ -234,7 +238,7 @@
   // Comparison and hashing
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return Multimaps.equalsImpl(this, object);
   }
 
diff --git a/guava/src/com/google/common/collect/AbstractMultiset.java b/guava/src/com/google/common/collect/AbstractMultiset.java
index 1bf3721..8203e44 100644
--- a/guava/src/com/google/common/collect/AbstractMultiset.java
+++ b/guava/src/com/google/common/collect/AbstractMultiset.java
@@ -26,6 +26,7 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -42,7 +43,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class AbstractMultiset<E> extends AbstractCollection<E> implements Multiset<E> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractMultiset<E extends @Nullable Object> extends AbstractCollection<E>
+    implements Multiset<E> {
   // Query Operations
 
   @Override
@@ -51,45 +54,45 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object element) {
+  public boolean contains(@CheckForNull Object element) {
     return count(element) > 0;
   }
 
   // Modification Operations
   @CanIgnoreReturnValue
   @Override
-  public final boolean add(@Nullable E element) {
+  public final boolean add(@ParametricNullness E element) {
     add(element, 1);
     return true;
   }
 
   @CanIgnoreReturnValue
   @Override
-  public int add(@Nullable E element, int occurrences) {
+  public int add(@ParametricNullness E element, int occurrences) {
     throw new UnsupportedOperationException();
   }
 
   @CanIgnoreReturnValue
   @Override
-  public final boolean remove(@Nullable Object element) {
+  public final boolean remove(@CheckForNull Object element) {
     return remove(element, 1) > 0;
   }
 
   @CanIgnoreReturnValue
   @Override
-  public int remove(@Nullable Object element, int occurrences) {
+  public int remove(@CheckForNull Object element, int occurrences) {
     throw new UnsupportedOperationException();
   }
 
   @CanIgnoreReturnValue
   @Override
-  public int setCount(@Nullable E element, int count) {
+  public int setCount(@ParametricNullness E element, int count) {
     return setCountImpl(this, element, count);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean setCount(@Nullable E element, int oldCount, int newCount) {
+  public boolean setCount(@ParametricNullness E element, int oldCount, int newCount) {
     return setCountImpl(this, element, oldCount, newCount);
   }
 
@@ -124,7 +127,7 @@
 
   // Views
 
-  @LazyInit private transient @Nullable Set<E> elementSet;
+  @LazyInit @CheckForNull private transient Set<E> elementSet;
 
   @Override
   public Set<E> elementSet() {
@@ -158,7 +161,7 @@
 
   abstract Iterator<E> elementIterator();
 
-  @LazyInit private transient @Nullable Set<Entry<E>> entrySet;
+  @LazyInit @CheckForNull private transient Set<Entry<E>> entrySet;
 
   @Override
   public Set<Entry<E>> entrySet() {
@@ -204,7 +207,7 @@
    * and if, for each element, the two multisets have the same count.
    */
   @Override
-  public final boolean equals(@Nullable Object object) {
+  public final boolean equals(@CheckForNull Object object) {
     return Multisets.equalsImpl(this, object);
   }
 
diff --git a/guava/src/com/google/common/collect/AbstractNavigableMap.java b/guava/src/com/google/common/collect/AbstractNavigableMap.java
index b0200d7..47048d0 100644
--- a/guava/src/com/google/common/collect/AbstractNavigableMap.java
+++ b/guava/src/com/google/common/collect/AbstractNavigableMap.java
@@ -24,6 +24,7 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.SortedMap;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -32,33 +33,40 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
-abstract class AbstractNavigableMap<K, V> extends IteratorBasedAbstractMap<K, V>
-    implements NavigableMap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractNavigableMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends IteratorBasedAbstractMap<K, V> implements NavigableMap<K, V> {
 
   @Override
-  public abstract @Nullable V get(@Nullable Object key);
+  @CheckForNull
+  public abstract V get(@CheckForNull Object key);
 
   @Override
-  public @Nullable Entry<K, V> firstEntry() {
+  @CheckForNull
+  public Entry<K, V> firstEntry() {
     return Iterators.getNext(entryIterator(), null);
   }
 
   @Override
-  public @Nullable Entry<K, V> lastEntry() {
+  @CheckForNull
+  public Entry<K, V> lastEntry() {
     return Iterators.getNext(descendingEntryIterator(), null);
   }
 
   @Override
-  public @Nullable Entry<K, V> pollFirstEntry() {
+  @CheckForNull
+  public Entry<K, V> pollFirstEntry() {
     return Iterators.pollNext(entryIterator());
   }
 
   @Override
-  public @Nullable Entry<K, V> pollLastEntry() {
+  @CheckForNull
+  public Entry<K, V> pollLastEntry() {
     return Iterators.pollNext(descendingEntryIterator());
   }
 
   @Override
+  @ParametricNullness
   public K firstKey() {
     Entry<K, V> entry = firstEntry();
     if (entry == null) {
@@ -69,6 +77,7 @@
   }
 
   @Override
+  @ParametricNullness
   public K lastKey() {
     Entry<K, V> entry = lastEntry();
     if (entry == null) {
@@ -79,59 +88,67 @@
   }
 
   @Override
-  public @Nullable Entry<K, V> lowerEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> lowerEntry(@ParametricNullness K key) {
     return headMap(key, false).lastEntry();
   }
 
   @Override
-  public @Nullable Entry<K, V> floorEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> floorEntry(@ParametricNullness K key) {
     return headMap(key, true).lastEntry();
   }
 
   @Override
-  public @Nullable Entry<K, V> ceilingEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> ceilingEntry(@ParametricNullness K key) {
     return tailMap(key, true).firstEntry();
   }
 
   @Override
-  public @Nullable Entry<K, V> higherEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> higherEntry(@ParametricNullness K key) {
     return tailMap(key, false).firstEntry();
   }
 
   @Override
-  public K lowerKey(K key) {
+  @CheckForNull
+  public K lowerKey(@ParametricNullness K key) {
     return Maps.keyOrNull(lowerEntry(key));
   }
 
   @Override
-  public K floorKey(K key) {
+  @CheckForNull
+  public K floorKey(@ParametricNullness K key) {
     return Maps.keyOrNull(floorEntry(key));
   }
 
   @Override
-  public K ceilingKey(K key) {
+  @CheckForNull
+  public K ceilingKey(@ParametricNullness K key) {
     return Maps.keyOrNull(ceilingEntry(key));
   }
 
   @Override
-  public K higherKey(K key) {
+  @CheckForNull
+  public K higherKey(@ParametricNullness K key) {
     return Maps.keyOrNull(higherEntry(key));
   }
 
   abstract Iterator<Entry<K, V>> descendingEntryIterator();
 
   @Override
-  public SortedMap<K, V> subMap(K fromKey, K toKey) {
+  public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
     return subMap(fromKey, true, toKey, false);
   }
 
   @Override
-  public SortedMap<K, V> headMap(K toKey) {
+  public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
     return headMap(toKey, false);
   }
 
   @Override
-  public SortedMap<K, V> tailMap(K fromKey) {
+  public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
     return tailMap(fromKey, true);
   }
 
diff --git a/guava/src/com/google/common/collect/AbstractRangeSet.java b/guava/src/com/google/common/collect/AbstractRangeSet.java
index 1c454cd..d112a11 100644
--- a/guava/src/com/google/common/collect/AbstractRangeSet.java
+++ b/guava/src/com/google/common/collect/AbstractRangeSet.java
@@ -15,7 +15,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A skeletal implementation of {@code RangeSet}.
@@ -23,6 +23,7 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class AbstractRangeSet<C extends Comparable> implements RangeSet<C> {
   AbstractRangeSet() {}
 
@@ -32,6 +33,7 @@
   }
 
   @Override
+  @CheckForNull
   public abstract Range<C> rangeContaining(C value);
 
   @Override
@@ -78,7 +80,7 @@
   public abstract boolean encloses(Range<C> otherRange);
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     } else if (obj instanceof RangeSet) {
diff --git a/guava/src/com/google/common/collect/AbstractSequentialIterator.java b/guava/src/com/google/common/collect/AbstractSequentialIterator.java
index 37540c2..172fe35 100644
--- a/guava/src/com/google/common/collect/AbstractSequentialIterator.java
+++ b/guava/src/com/google/common/collect/AbstractSequentialIterator.java
@@ -18,7 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides a skeletal implementation of the {@code Iterator} interface for sequences
@@ -40,14 +40,15 @@
  * @since 12.0 (in Guava as {@code AbstractLinkedIterator} since 8.0)
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractSequentialIterator<T> extends UnmodifiableIterator<T> {
-  private @Nullable T nextOrNull;
+  @CheckForNull private T nextOrNull;
 
   /**
    * Creates a new iterator with the given first element, or, if {@code firstOrNull} is null,
    * creates a new empty iterator.
    */
-  protected AbstractSequentialIterator(@Nullable T firstOrNull) {
+  protected AbstractSequentialIterator(@CheckForNull T firstOrNull) {
     this.nextOrNull = firstOrNull;
   }
 
@@ -56,7 +57,8 @@
    * remain. This method is invoked during each call to {@link #next()} in order to compute the
    * result of a <i>future</i> call to {@code next()}.
    */
-  protected abstract @Nullable T computeNext(T previous);
+  @CheckForNull
+  protected abstract T computeNext(T previous);
 
   @Override
   public final boolean hasNext() {
@@ -65,13 +67,11 @@
 
   @Override
   public final T next() {
-    if (!hasNext()) {
+    if (nextOrNull == null) {
       throw new NoSuchElementException();
     }
-    try {
-      return nextOrNull;
-    } finally {
-      nextOrNull = computeNext(nextOrNull);
-    }
+    T oldNext = nextOrNull;
+    nextOrNull = computeNext(oldNext);
+    return oldNext;
   }
 }
diff --git a/guava/src/com/google/common/collect/AbstractSetMultimap.java b/guava/src/com/google/common/collect/AbstractSetMultimap.java
index 326f998..90aa9dc 100644
--- a/guava/src/com/google/common/collect/AbstractSetMultimap.java
+++ b/guava/src/com/google/common/collect/AbstractSetMultimap.java
@@ -23,6 +23,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -33,8 +34,9 @@
  * @author Jared Levy
  */
 @GwtCompatible
-abstract class AbstractSetMultimap<K, V> extends AbstractMapBasedMultimap<K, V>
-    implements SetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMapBasedMultimap<K, V> implements SetMultimap<K, V> {
   /**
    * Creates a new multimap that uses the provided map.
    *
@@ -53,12 +55,13 @@
   }
 
   @Override
-  <E> Collection<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+  <E extends @Nullable Object> Collection<E> unmodifiableCollectionSubclass(
+      Collection<E> collection) {
     return Collections.unmodifiableSet((Set<E>) collection);
   }
 
   @Override
-  Collection<V> wrapCollection(K key, Collection<V> collection) {
+  Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
     return new WrappedSet(key, (Set<V>) collection);
   }
 
@@ -71,7 +74,7 @@
    * {@link Set}, instead of the {@link Collection} specified in the {@link Multimap} interface.
    */
   @Override
-  public Set<V> get(@Nullable K key) {
+  public Set<V> get(@ParametricNullness K key) {
     return (Set<V>) super.get(key);
   }
 
@@ -94,7 +97,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public Set<V> removeAll(@Nullable Object key) {
+  public Set<V> removeAll(@CheckForNull Object key) {
     return (Set<V>) super.removeAll(key);
   }
 
@@ -108,7 +111,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public Set<V> replaceValues(@Nullable K key, Iterable<? extends V> values) {
+  public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (Set<V>) super.replaceValues(key, values);
   }
 
@@ -133,7 +136,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public boolean put(@Nullable K key, @Nullable V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     return super.put(key, value);
   }
 
@@ -144,7 +147,7 @@
    * Equality does not depend on the ordering of keys or values.
    */
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return super.equals(object);
   }
 
diff --git a/guava/src/com/google/common/collect/AbstractSortedKeySortedSetMultimap.java b/guava/src/com/google/common/collect/AbstractSortedKeySortedSetMultimap.java
index 0ee6edb..676936f 100644
--- a/guava/src/com/google/common/collect/AbstractSortedKeySortedSetMultimap.java
+++ b/guava/src/com/google/common/collect/AbstractSortedKeySortedSetMultimap.java
@@ -21,6 +21,7 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Basic implementation of a {@link SortedSetMultimap} with a sorted key set.
@@ -31,7 +32,10 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class AbstractSortedKeySortedSetMultimap<K, V> extends AbstractSortedSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractSortedKeySortedSetMultimap<
+        K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractSortedSetMultimap<K, V> {
 
   AbstractSortedKeySortedSetMultimap(SortedMap<K, Collection<V>> map) {
     super(map);
diff --git a/guava/src/com/google/common/collect/AbstractSortedMultiset.java b/guava/src/com/google/common/collect/AbstractSortedMultiset.java
index 67d629a..fd4fce2 100644
--- a/guava/src/com/google/common/collect/AbstractSortedMultiset.java
+++ b/guava/src/com/google/common/collect/AbstractSortedMultiset.java
@@ -21,6 +21,7 @@
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.NavigableSet;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -33,7 +34,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(emulated = true)
-abstract class AbstractSortedMultiset<E> extends AbstractMultiset<E> implements SortedMultiset<E> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractSortedMultiset<E extends @Nullable Object> extends AbstractMultiset<E>
+    implements SortedMultiset<E> {
   @GwtTransient final Comparator<? super E> comparator;
 
   // needed for serialization
@@ -62,18 +65,21 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     Iterator<Entry<E>> entryIterator = entryIterator();
     return entryIterator.hasNext() ? entryIterator.next() : null;
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     Iterator<Entry<E>> entryIterator = descendingEntryIterator();
     return entryIterator.hasNext() ? entryIterator.next() : null;
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollFirstEntry() {
     Iterator<Entry<E>> entryIterator = entryIterator();
     if (entryIterator.hasNext()) {
@@ -86,6 +92,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollLastEntry() {
     Iterator<Entry<E>> entryIterator = descendingEntryIterator();
     if (entryIterator.hasNext()) {
@@ -99,9 +106,9 @@
 
   @Override
   public SortedMultiset<E> subMultiset(
-      @Nullable E fromElement,
+      @ParametricNullness E fromElement,
       BoundType fromBoundType,
-      @Nullable E toElement,
+      @ParametricNullness E toElement,
       BoundType toBoundType) {
     // These are checked elsewhere, but NullPointerTester wants them checked eagerly.
     checkNotNull(fromBoundType);
@@ -115,7 +122,7 @@
     return Multisets.iteratorImpl(descendingMultiset());
   }
 
-  private transient @Nullable SortedMultiset<E> descendingMultiset;
+  @CheckForNull private transient SortedMultiset<E> descendingMultiset;
 
   @Override
   public SortedMultiset<E> descendingMultiset() {
diff --git a/guava/src/com/google/common/collect/AbstractSortedSetMultimap.java b/guava/src/com/google/common/collect/AbstractSortedSetMultimap.java
index 2e4de2e..3231613 100644
--- a/guava/src/com/google/common/collect/AbstractSortedSetMultimap.java
+++ b/guava/src/com/google/common/collect/AbstractSortedSetMultimap.java
@@ -23,6 +23,7 @@
 import java.util.Map;
 import java.util.NavigableSet;
 import java.util.SortedSet;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -33,8 +34,9 @@
  * @author Jared Levy
  */
 @GwtCompatible
-abstract class AbstractSortedSetMultimap<K, V> extends AbstractSetMultimap<K, V>
-    implements SortedSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractSortedSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractSetMultimap<K, V> implements SortedSetMultimap<K, V> {
   /**
    * Creates a new multimap that uses the provided map.
    *
@@ -53,7 +55,8 @@
   }
 
   @Override
-  <E> SortedSet<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+  <E extends @Nullable Object> SortedSet<E> unmodifiableCollectionSubclass(
+      Collection<E> collection) {
     if (collection instanceof NavigableSet) {
       return Sets.unmodifiableNavigableSet((NavigableSet<E>) collection);
     } else {
@@ -62,7 +65,7 @@
   }
 
   @Override
-  Collection<V> wrapCollection(K key, Collection<V> collection) {
+  Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
     if (collection instanceof NavigableSet) {
       return new WrappedNavigableSet(key, (NavigableSet<V>) collection, null);
     } else {
@@ -83,7 +86,7 @@
    * Multimap} interface.
    */
   @Override
-  public SortedSet<V> get(@Nullable K key) {
+  public SortedSet<V> get(@ParametricNullness K key) {
     return (SortedSet<V>) super.get(key);
   }
 
@@ -96,7 +99,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public SortedSet<V> removeAll(@Nullable Object key) {
+  public SortedSet<V> removeAll(@CheckForNull Object key) {
     return (SortedSet<V>) super.removeAll(key);
   }
 
@@ -112,7 +115,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public SortedSet<V> replaceValues(@Nullable K key, Iterable<? extends V> values) {
+  public SortedSet<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (SortedSet<V>) super.replaceValues(key, values);
   }
 
diff --git a/guava/src/com/google/common/collect/AbstractTable.java b/guava/src/com/google/common/collect/AbstractTable.java
index 823570d..99a1215 100644
--- a/guava/src/com/google/common/collect/AbstractTable.java
+++ b/guava/src/com/google/common/collect/AbstractTable.java
@@ -25,6 +25,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.Spliterator;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -33,15 +34,18 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class AbstractTable<R, C, V> implements Table<R, C, V> {
+@ElementTypesAreNonnullByDefault
+abstract class AbstractTable<
+        R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+    implements Table<R, C, V> {
 
   @Override
-  public boolean containsRow(@Nullable Object rowKey) {
+  public boolean containsRow(@CheckForNull Object rowKey) {
     return Maps.safeContainsKey(rowMap(), rowKey);
   }
 
   @Override
-  public boolean containsColumn(@Nullable Object columnKey) {
+  public boolean containsColumn(@CheckForNull Object columnKey) {
     return Maps.safeContainsKey(columnMap(), columnKey);
   }
 
@@ -56,7 +60,7 @@
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     for (Map<C, V> row : rowMap().values()) {
       if (row.containsValue(value)) {
         return true;
@@ -66,13 +70,14 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object rowKey, @Nullable Object columnKey) {
+  public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Map<C, V> row = Maps.safeGet(rowMap(), rowKey);
     return row != null && Maps.safeContainsKey(row, columnKey);
   }
 
   @Override
-  public V get(@Nullable Object rowKey, @Nullable Object columnKey) {
+  @CheckForNull
+  public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Map<C, V> row = Maps.safeGet(rowMap(), rowKey);
     return (row == null) ? null : Maps.safeGet(row, columnKey);
   }
@@ -89,14 +94,17 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(@Nullable Object rowKey, @Nullable Object columnKey) {
+  @CheckForNull
+  public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Map<C, V> row = Maps.safeGet(rowMap(), rowKey);
     return (row == null) ? null : Maps.safeRemove(row, columnKey);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public V put(R rowKey, C columnKey, V value) {
+  @CheckForNull
+  public V put(
+      @ParametricNullness R rowKey, @ParametricNullness C columnKey, @ParametricNullness V value) {
     return row(rowKey).put(columnKey, value);
   }
 
@@ -107,7 +115,7 @@
     }
   }
 
-  @LazyInit private transient @Nullable Set<Cell<R, C, V>> cellSet;
+  @LazyInit @CheckForNull private transient Set<Cell<R, C, V>> cellSet;
 
   @Override
   public Set<Cell<R, C, V>> cellSet() {
@@ -126,7 +134,7 @@
   @WeakOuter
   class CellSet extends AbstractSet<Cell<R, C, V>> {
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Cell) {
         Cell<?, ?, ?> cell = (Cell<?, ?, ?>) o;
         Map<C, V> row = Maps.safeGet(rowMap(), cell.getRowKey());
@@ -138,7 +146,7 @@
     }
 
     @Override
-    public boolean remove(@Nullable Object o) {
+    public boolean remove(@CheckForNull Object o) {
       if (o instanceof Cell) {
         Cell<?, ?, ?> cell = (Cell<?, ?, ?>) o;
         Map<C, V> row = Maps.safeGet(rowMap(), cell.getRowKey());
@@ -170,7 +178,7 @@
     }
   }
 
-  @LazyInit private transient @Nullable Collection<V> values;
+  @LazyInit @CheckForNull private transient Collection<V> values;
 
   @Override
   public Collection<V> values() {
@@ -185,6 +193,7 @@
   Iterator<V> valuesIterator() {
     return new TransformedIterator<Cell<R, C, V>, V>(cellSet().iterator()) {
       @Override
+      @ParametricNullness
       V transform(Cell<R, C, V> cell) {
         return cell.getValue();
       }
@@ -208,7 +217,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return containsValue(o);
     }
 
@@ -224,7 +233,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     return Tables.equalsImpl(this, obj);
   }
 
diff --git a/guava/src/com/google/common/collect/AllEqualOrdering.java b/guava/src/com/google/common/collect/AllEqualOrdering.java
index 357b1fc..f6ca6fa 100644
--- a/guava/src/com/google/common/collect/AllEqualOrdering.java
+++ b/guava/src/com/google/common/collect/AllEqualOrdering.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.List;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -27,27 +28,29 @@
  * @author Emily Soldal
  */
 @GwtCompatible(serializable = true)
-final class AllEqualOrdering extends Ordering<Object> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class AllEqualOrdering extends Ordering<@Nullable Object> implements Serializable {
   static final AllEqualOrdering INSTANCE = new AllEqualOrdering();
 
   @Override
-  public int compare(@Nullable Object left, @Nullable Object right) {
+  public int compare(@CheckForNull Object left, @CheckForNull Object right) {
     return 0;
   }
 
   @Override
-  public <E> List<E> sortedCopy(Iterable<E> iterable) {
+  public <E extends @Nullable Object> List<E> sortedCopy(Iterable<E> iterable) {
     return Lists.newArrayList(iterable);
   }
 
   @Override
-  public <E> ImmutableList<E> immutableSortedCopy(Iterable<E> iterable) {
+  @SuppressWarnings("nullness") // unsafe: see supertype
+  public <E extends @Nullable Object> ImmutableList<E> immutableSortedCopy(Iterable<E> iterable) {
     return ImmutableList.copyOf(iterable);
   }
 
   @SuppressWarnings("unchecked")
   @Override
-  public <S> Ordering<S> reverse() {
+  public <S extends @Nullable Object> Ordering<S> reverse() {
     return (Ordering<S>) this;
   }
 
diff --git a/guava/src/com/google/common/collect/ArrayListMultimap.java b/guava/src/com/google/common/collect/ArrayListMultimap.java
index bebdae6..c8f7106 100644
--- a/guava/src/com/google/common/collect/ArrayListMultimap.java
+++ b/guava/src/com/google/common/collect/ArrayListMultimap.java
@@ -29,6 +29,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@code Multimap} that uses an {@code ArrayList} to store the values for a given
@@ -59,7 +60,8 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public final class ArrayListMultimap<K, V>
+@ElementTypesAreNonnullByDefault
+public final class ArrayListMultimap<K extends @Nullable Object, V extends @Nullable Object>
     extends ArrayListMultimapGwtSerializationDependencies<K, V> {
   // Default from ArrayList
   private static final int DEFAULT_VALUES_PER_KEY = 3;
@@ -72,7 +74,8 @@
    * <p>This method will soon be deprecated in favor of {@code
    * MultimapBuilder.hashKeys().arrayListValues().build()}.
    */
-  public static <K, V> ArrayListMultimap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ArrayListMultimap<K, V> create() {
     return new ArrayListMultimap<>();
   }
 
@@ -88,7 +91,8 @@
    * @throws IllegalArgumentException if {@code expectedKeys} or {@code expectedValuesPerKey} is
    *     negative
    */
-  public static <K, V> ArrayListMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ArrayListMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
     return new ArrayListMultimap<>(expectedKeys, expectedValuesPerKey);
   }
 
@@ -100,7 +104,8 @@
    *
    * @param multimap the multimap whose contents are copied to this multimap
    */
-  public static <K, V> ArrayListMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ArrayListMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
     return new ArrayListMultimap<>(multimap);
   }
 
diff --git a/guava/src/com/google/common/collect/ArrayTable.java b/guava/src/com/google/common/collect/ArrayTable.java
index f500a89..01652c5 100644
--- a/guava/src/com/google/common/collect/ArrayTable.java
+++ b/guava/src/com/google/common/collect/ArrayTable.java
@@ -19,6 +19,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkElementIndex;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Collections.emptyMap;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -26,6 +27,7 @@
 import com.google.common.base.Objects;
 import com.google.common.collect.Maps.IteratorBasedAbstractMap;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.Serializable;
 import java.lang.reflect.Array;
@@ -35,11 +37,22 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.Spliterator;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Fixed-size {@link Table} implementation backed by a two-dimensional array.
  *
+ * <p><b>Warning:</b> {@code ArrayTable} is rarely the {@link Table} implementation you want. First,
+ * it requires that the complete universe of rows and columns be specified at construction time.
+ * Second, it is always backed by an array large enough to hold a value for every possible
+ * combination of row and column keys. (This is rarely optimal unless the table is extremely dense.)
+ * Finally, every possible combination of row and column keys is always considered to have a value
+ * associated with it: It is not possible to "remove" a value, only to replace it with {@code null},
+ * which will still appear when iterating over the table's contents in a foreach loop or a call to a
+ * null-hostile method like {@link ImmutableTable#copyOf}. For alternatives, please see <a
+ * href="https://github.com/google/guava/wiki/NewCollectionTypesExplained#table">the wiki</a>.
+ *
  * <p>The allowed row and column keys must be supplied when the table is created. The table always
  * contains a mapping for every row key / column pair. The value corresponding to a given row and
  * column is null unless another value is provided.
@@ -78,7 +91,9 @@
  */
 @Beta
 @GwtCompatible(emulated = true)
-public final class ArrayTable<R, C, V> extends AbstractTable<R, C, V> implements Serializable {
+@ElementTypesAreNonnullByDefault
+public final class ArrayTable<R, C, V> extends AbstractTable<R, C, @Nullable V>
+    implements Serializable {
 
   /**
    * Creates an {@code ArrayTable} filled with {@code null}.
@@ -118,8 +133,8 @@
    *
    * @throws NullPointerException if {@code table} has a null key
    */
-  public static <R, C, V> ArrayTable<R, C, V> create(Table<R, C, V> table) {
-    return (table instanceof ArrayTable<?, ?, ?>)
+  public static <R, C, V> ArrayTable<R, C, V> create(Table<R, C, ? extends @Nullable V> table) {
+    return (table instanceof ArrayTable)
         ? new ArrayTable<R, C, V>((ArrayTable<R, C, V>) table)
         : new ArrayTable<R, C, V>(table);
   }
@@ -130,7 +145,7 @@
   // TODO(jlevy): Add getters returning rowKeyToIndex and columnKeyToIndex?
   private final ImmutableMap<R, Integer> rowKeyToIndex;
   private final ImmutableMap<C, Integer> columnKeyToIndex;
-  private final V[][] array;
+  private final @Nullable V[][] array;
 
   private ArrayTable(Iterable<? extends R> rowKeys, Iterable<? extends C> columnKeys) {
     this.rowList = ImmutableList.copyOf(rowKeys);
@@ -147,13 +162,14 @@
     columnKeyToIndex = Maps.indexMap(columnList);
 
     @SuppressWarnings("unchecked")
-    V[][] tmpArray = (V[][]) new Object[rowList.size()][columnList.size()];
+    @Nullable
+    V[][] tmpArray = (@Nullable V[][]) new Object[rowList.size()][columnList.size()];
     array = tmpArray;
     // Necessary because in GWT the arrays are initialized with "undefined" instead of null.
     eraseAll();
   }
 
-  private ArrayTable(Table<R, C, V> table) {
+  private ArrayTable(Table<R, C, ? extends @Nullable V> table) {
     this(table.rowKeySet(), table.columnKeySet());
     putAll(table);
   }
@@ -164,14 +180,16 @@
     rowKeyToIndex = table.rowKeyToIndex;
     columnKeyToIndex = table.columnKeyToIndex;
     @SuppressWarnings("unchecked")
-    V[][] copy = (V[][]) new Object[rowList.size()][columnList.size()];
+    @Nullable
+    V[][] copy = (@Nullable V[][]) new Object[rowList.size()][columnList.size()];
     array = copy;
     for (int i = 0; i < rowList.size(); i++) {
       System.arraycopy(table.array[i], 0, copy[i], 0, table.array[i].length);
     }
   }
 
-  private abstract static class ArrayMap<K, V> extends IteratorBasedAbstractMap<K, V> {
+  private abstract static class ArrayMap<K, V extends @Nullable Object>
+      extends IteratorBasedAbstractMap<K, V> {
     private final ImmutableMap<K, Integer> keyIndex;
 
     private ArrayMap(ImmutableMap<K, Integer> keyIndex) {
@@ -189,9 +207,11 @@
 
     abstract String getKeyRole();
 
-    abstract @Nullable V getValue(int index);
+    @ParametricNullness
+    abstract V getValue(int index);
 
-    abstract @Nullable V setValue(int index, V newValue);
+    @ParametricNullness
+    abstract V setValue(int index, @ParametricNullness V newValue);
 
     @Override
     public int size() {
@@ -212,12 +232,14 @@
         }
 
         @Override
+        @ParametricNullness
         public V getValue() {
           return ArrayMap.this.getValue(index);
         }
 
         @Override
-        public V setValue(V value) {
+        @ParametricNullness
+        public V setValue(@ParametricNullness V value) {
           return ArrayMap.this.setValue(index, value);
         }
       };
@@ -241,12 +263,13 @@
     // TODO(lowasser): consider an optimized values() implementation
 
     @Override
-    public boolean containsKey(@Nullable Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return keyIndex.containsKey(key);
     }
 
+    @CheckForNull
     @Override
-    public V get(@Nullable Object key) {
+    public V get(@CheckForNull Object key) {
       Integer index = keyIndex.get(key);
       if (index == null) {
         return null;
@@ -256,7 +279,8 @@
     }
 
     @Override
-    public V put(K key, V value) {
+    @CheckForNull
+    public V put(K key, @ParametricNullness V value) {
       Integer index = keyIndex.get(key);
       if (index == null) {
         throw new IllegalArgumentException(
@@ -266,7 +290,8 @@
     }
 
     @Override
-    public V remove(Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       throw new UnsupportedOperationException();
     }
 
@@ -304,6 +329,7 @@
    *     or equal to the number of allowed row keys, or {@code columnIndex} is greater than or equal
    *     to the number of allowed column keys
    */
+  @CheckForNull
   public V at(int rowIndex, int columnIndex) {
     // In GWT array access never throws IndexOutOfBoundsException.
     checkElementIndex(rowIndex, rowList.size());
@@ -325,7 +351,8 @@
    *     to the number of allowed column keys
    */
   @CanIgnoreReturnValue
-  public V set(int rowIndex, int columnIndex, @Nullable V value) {
+  @CheckForNull
+  public V set(int rowIndex, int columnIndex, @CheckForNull V value) {
     // In GWT array access never throws IndexOutOfBoundsException.
     checkElementIndex(rowIndex, rowList.size());
     checkElementIndex(columnIndex, columnList.size());
@@ -344,9 +371,10 @@
    * @param valueClass class of values stored in the returned array
    */
   @GwtIncompatible // reflection
-  public V[][] toArray(Class<V> valueClass) {
+  public @Nullable V[][] toArray(Class<V> valueClass) {
     @SuppressWarnings("unchecked") // TODO: safe?
-    V[][] copy = (V[][]) Array.newInstance(valueClass, rowList.size(), columnList.size());
+    @Nullable
+    V[][] copy = (@Nullable V[][]) Array.newInstance(valueClass, rowList.size(), columnList.size());
     for (int i = 0; i < rowList.size(); i++) {
       System.arraycopy(array[i], 0, copy[i], 0, array[i].length);
     }
@@ -359,6 +387,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link #eraseAll}
    */
+  @DoNotCall("Always throws UnsupportedOperationException")
   @Override
   @Deprecated
   public void clear() {
@@ -367,7 +396,7 @@
 
   /** Associates the value {@code null} with every pair of allowed row and column keys. */
   public void eraseAll() {
-    for (V[] row : array) {
+    for (@Nullable V[] row : array) {
       Arrays.fill(row, null);
     }
   }
@@ -377,7 +406,7 @@
    * constructed.
    */
   @Override
-  public boolean contains(@Nullable Object rowKey, @Nullable Object columnKey) {
+  public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return containsRow(rowKey) && containsColumn(columnKey);
   }
 
@@ -386,7 +415,7 @@
    * table was constructed.
    */
   @Override
-  public boolean containsColumn(@Nullable Object columnKey) {
+  public boolean containsColumn(@CheckForNull Object columnKey) {
     return columnKeyToIndex.containsKey(columnKey);
   }
 
@@ -395,13 +424,13 @@
    * constructed.
    */
   @Override
-  public boolean containsRow(@Nullable Object rowKey) {
+  public boolean containsRow(@CheckForNull Object rowKey) {
     return rowKeyToIndex.containsKey(rowKey);
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
-    for (V[] row : array) {
+  public boolean containsValue(@CheckForNull Object value) {
+    for (@Nullable V[] row : array) {
       for (V element : row) {
         if (Objects.equal(value, element)) {
           return true;
@@ -412,7 +441,8 @@
   }
 
   @Override
-  public V get(@Nullable Object rowKey, @Nullable Object columnKey) {
+  @CheckForNull
+  public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Integer rowIndex = rowKeyToIndex.get(rowKey);
     Integer columnIndex = columnKeyToIndex.get(columnKey);
     return (rowIndex == null || columnIndex == null) ? null : at(rowIndex, columnIndex);
@@ -434,7 +464,8 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public V put(R rowKey, C columnKey, @Nullable V value) {
+  @CheckForNull
+  public V put(R rowKey, C columnKey, @CheckForNull V value) {
     checkNotNull(rowKey);
     checkNotNull(columnKey);
     Integer rowIndex = rowKeyToIndex.get(rowKey);
@@ -460,7 +491,7 @@
    *     in {@link #rowKeySet()} or {@link #columnKeySet()}
    */
   @Override
-  public void putAll(Table<? extends R, ? extends C, ? extends V> table) {
+  public void putAll(Table<? extends R, ? extends C, ? extends @Nullable V> table) {
     super.putAll(table);
   }
 
@@ -470,10 +501,12 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link #erase}
    */
+  @DoNotCall("Always throws UnsupportedOperationException")
   @CanIgnoreReturnValue
   @Override
   @Deprecated
-  public V remove(Object rowKey, Object columnKey) {
+  @CheckForNull
+  public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     throw new UnsupportedOperationException();
   }
 
@@ -491,7 +524,8 @@
    *     for the keys
    */
   @CanIgnoreReturnValue
-  public V erase(@Nullable Object rowKey, @Nullable Object columnKey) {
+  @CheckForNull
+  public V erase(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Integer rowIndex = rowKeyToIndex.get(rowKey);
     Integer columnIndex = columnKeyToIndex.get(columnKey);
     if (rowIndex == null || columnIndex == null) {
@@ -519,28 +553,28 @@
    * @return set of table cells consisting of row key / column key / value triplets
    */
   @Override
-  public Set<Cell<R, C, V>> cellSet() {
+  public Set<Cell<R, C, @Nullable V>> cellSet() {
     return super.cellSet();
   }
 
   @Override
-  Iterator<Cell<R, C, V>> cellIterator() {
-    return new AbstractIndexedListIterator<Cell<R, C, V>>(size()) {
+  Iterator<Cell<R, C, @Nullable V>> cellIterator() {
+    return new AbstractIndexedListIterator<Cell<R, C, @Nullable V>>(size()) {
       @Override
-      protected Cell<R, C, V> get(final int index) {
+      protected Cell<R, C, @Nullable V> get(final int index) {
         return getCell(index);
       }
     };
   }
 
   @Override
-  Spliterator<Cell<R, C, V>> cellSpliterator() {
-    return CollectSpliterators.indexed(
+  Spliterator<Cell<R, C, @Nullable V>> cellSpliterator() {
+    return CollectSpliterators.<Cell<R, C, @Nullable V>>indexed(
         size(), Spliterator.ORDERED | Spliterator.NONNULL | Spliterator.DISTINCT, this::getCell);
   }
 
-  private Cell<R, C, V> getCell(final int index) {
-    return new Tables.AbstractCell<R, C, V>() {
+  private Cell<R, C, @Nullable V> getCell(final int index) {
+    return new Tables.AbstractCell<R, C, @Nullable V>() {
       final int rowIndex = index / columnList.size();
       final int columnIndex = index % columnList.size();
 
@@ -555,12 +589,14 @@
       }
 
       @Override
+      @CheckForNull
       public V getValue() {
         return at(rowIndex, columnIndex);
       }
     };
   }
 
+  @CheckForNull
   private V getValue(int index) {
     int rowIndex = index / columnList.size();
     int columnIndex = index % columnList.size();
@@ -579,13 +615,17 @@
    * @return the corresponding map from row keys to values
    */
   @Override
-  public Map<R, V> column(C columnKey) {
+  public Map<R, @Nullable V> column(C columnKey) {
     checkNotNull(columnKey);
     Integer columnIndex = columnKeyToIndex.get(columnKey);
-    return (columnIndex == null) ? ImmutableMap.<R, V>of() : new Column(columnIndex);
+    if (columnIndex == null) {
+      return emptyMap();
+    } else {
+      return new Column(columnIndex);
+    }
   }
 
-  private class Column extends ArrayMap<R, V> {
+  private class Column extends ArrayMap<R, @Nullable V> {
     final int columnIndex;
 
     Column(int columnIndex) {
@@ -599,12 +639,14 @@
     }
 
     @Override
+    @CheckForNull
     V getValue(int index) {
       return at(index, columnIndex);
     }
 
     @Override
-    V setValue(int index, V newValue) {
+    @CheckForNull
+    V setValue(int index, @CheckForNull V newValue) {
       return set(index, columnIndex, newValue);
     }
   }
@@ -620,16 +662,16 @@
     return columnKeyToIndex.keySet();
   }
 
-  private transient @Nullable ColumnMap columnMap;
+  @CheckForNull private transient ColumnMap columnMap;
 
   @Override
-  public Map<C, Map<R, V>> columnMap() {
+  public Map<C, Map<R, @Nullable V>> columnMap() {
     ColumnMap map = columnMap;
     return (map == null) ? columnMap = new ColumnMap() : map;
   }
 
   @WeakOuter
-  private class ColumnMap extends ArrayMap<C, Map<R, V>> {
+  private class ColumnMap extends ArrayMap<C, Map<R, @Nullable V>> {
     private ColumnMap() {
       super(columnKeyToIndex);
     }
@@ -640,17 +682,18 @@
     }
 
     @Override
-    Map<R, V> getValue(int index) {
+    Map<R, @Nullable V> getValue(int index) {
       return new Column(index);
     }
 
     @Override
-    Map<R, V> setValue(int index, Map<R, V> newValue) {
+    Map<R, @Nullable V> setValue(int index, Map<R, @Nullable V> newValue) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Map<R, V> put(C key, Map<R, V> value) {
+    @CheckForNull
+    public Map<R, @Nullable V> put(C key, Map<R, @Nullable V> value) {
       throw new UnsupportedOperationException();
     }
   }
@@ -667,13 +710,17 @@
    * @return the corresponding map from column keys to values
    */
   @Override
-  public Map<C, V> row(R rowKey) {
+  public Map<C, @Nullable V> row(R rowKey) {
     checkNotNull(rowKey);
     Integer rowIndex = rowKeyToIndex.get(rowKey);
-    return (rowIndex == null) ? ImmutableMap.<C, V>of() : new Row(rowIndex);
+    if (rowIndex == null) {
+      return emptyMap();
+    } else {
+      return new Row(rowIndex);
+    }
   }
 
-  private class Row extends ArrayMap<C, V> {
+  private class Row extends ArrayMap<C, @Nullable V> {
     final int rowIndex;
 
     Row(int rowIndex) {
@@ -687,12 +734,14 @@
     }
 
     @Override
+    @CheckForNull
     V getValue(int index) {
       return at(rowIndex, index);
     }
 
     @Override
-    V setValue(int index, V newValue) {
+    @CheckForNull
+    V setValue(int index, @CheckForNull V newValue) {
       return set(rowIndex, index, newValue);
     }
   }
@@ -708,16 +757,16 @@
     return rowKeyToIndex.keySet();
   }
 
-  private transient @Nullable RowMap rowMap;
+  @CheckForNull private transient RowMap rowMap;
 
   @Override
-  public Map<R, Map<C, V>> rowMap() {
+  public Map<R, Map<C, @Nullable V>> rowMap() {
     RowMap map = rowMap;
     return (map == null) ? rowMap = new RowMap() : map;
   }
 
   @WeakOuter
-  private class RowMap extends ArrayMap<R, Map<C, V>> {
+  private class RowMap extends ArrayMap<R, Map<C, @Nullable V>> {
     private RowMap() {
       super(rowKeyToIndex);
     }
@@ -728,17 +777,18 @@
     }
 
     @Override
-    Map<C, V> getValue(int index) {
+    Map<C, @Nullable V> getValue(int index) {
       return new Row(index);
     }
 
     @Override
-    Map<C, V> setValue(int index, Map<C, V> newValue) {
+    Map<C, @Nullable V> setValue(int index, Map<C, @Nullable V> newValue) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Map<C, V> put(R key, Map<C, V> value) {
+    @CheckForNull
+    public Map<C, @Nullable V> put(R key, Map<C, @Nullable V> value) {
       throw new UnsupportedOperationException();
     }
   }
@@ -753,14 +803,15 @@
    * @return collection of values
    */
   @Override
-  public Collection<V> values() {
+  public Collection<@Nullable V> values() {
     return super.values();
   }
 
   @Override
-  Iterator<V> valuesIterator() {
-    return new AbstractIndexedListIterator<V>(size()) {
+  Iterator<@Nullable V> valuesIterator() {
+    return new AbstractIndexedListIterator<@Nullable V>(size()) {
       @Override
+      @CheckForNull
       protected V get(int index) {
         return getValue(index);
       }
@@ -768,8 +819,8 @@
   }
 
   @Override
-  Spliterator<V> valuesSpliterator() {
-    return CollectSpliterators.indexed(size(), Spliterator.ORDERED, this::getValue);
+  Spliterator<@Nullable V> valuesSpliterator() {
+    return CollectSpliterators.<@Nullable V>indexed(size(), Spliterator.ORDERED, this::getValue);
   }
 
   private static final long serialVersionUID = 0;
diff --git a/guava/src/com/google/common/collect/BaseImmutableMultimap.java b/guava/src/com/google/common/collect/BaseImmutableMultimap.java
index 6ebdf14..2e69c2a 100644
--- a/guava/src/com/google/common/collect/BaseImmutableMultimap.java
+++ b/guava/src/com/google/common/collect/BaseImmutableMultimap.java
@@ -22,4 +22,5 @@
  * retaining additional implementation details of {@link ImmutableMultimap}.
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 abstract class BaseImmutableMultimap<K, V> extends AbstractMultimap<K, V> {}
diff --git a/guava/src/com/google/common/collect/BiMap.java b/guava/src/com/google/common/collect/BiMap.java
index e4a755e..12eb4e3 100644
--- a/guava/src/com/google/common/collect/BiMap.java
+++ b/guava/src/com/google/common/collect/BiMap.java
@@ -20,6 +20,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -28,13 +29,14 @@
  * bimap containing the same entries as this bimap but with reversed keys and values.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap"> {@code BiMap}</a>.
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#bimap">{@code BiMap}</a>.
  *
  * @author Kevin Bourrillion
  * @since 2.0
  */
 @GwtCompatible
-public interface BiMap<K, V> extends Map<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface BiMap<K extends @Nullable Object, V extends @Nullable Object> extends Map<K, V> {
   // Modification Operations
 
   /**
@@ -46,8 +48,8 @@
    */
   @CanIgnoreReturnValue
   @Override
-  @Nullable
-  V put(@Nullable K key, @Nullable V value);
+  @CheckForNull
+  V put(@ParametricNullness K key, @ParametricNullness V value);
 
   /**
    * An alternate form of {@code put} that silently removes any existing entry with the value {@code
@@ -62,12 +64,14 @@
    *
    * @param key the key with which the specified value is to be associated
    * @param value the value to be associated with the specified key
-   * @return the value which was previously associated with the key, which may be {@code null}, or
-   *     {@code null} if there was no previous entry
+   * @return the value that was previously associated with the key, or {@code null} if there was no
+   *     previous entry. (If the bimap contains null values, then {@code forcePut}, like {@code
+   *     put}, returns {@code null} both if the key is absent and if it is present with a null
+   *     value.)
    */
   @CanIgnoreReturnValue
-  @Nullable
-  V forcePut(@Nullable K key, @Nullable V value);
+  @CheckForNull
+  V forcePut(@ParametricNullness K key, @ParametricNullness V value);
 
   // Bulk Operations
 
diff --git a/guava/src/com/google/common/collect/BoundType.java b/guava/src/com/google/common/collect/BoundType.java
index ce03802..00ac08c 100644
--- a/guava/src/com/google/common/collect/BoundType.java
+++ b/guava/src/com/google/common/collect/BoundType.java
@@ -24,6 +24,7 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public enum BoundType {
   /** The endpoint value <i>is not</i> considered part of the set ("exclusive"). */
   OPEN(false),
@@ -39,8 +40,4 @@
   static BoundType forBoolean(boolean inclusive) {
     return inclusive ? CLOSED : OPEN;
   }
-
-  BoundType flip() {
-    return forBoolean(!inclusive);
-  }
 }
diff --git a/guava/src/com/google/common/collect/ByFunctionOrdering.java b/guava/src/com/google/common/collect/ByFunctionOrdering.java
index f05bf01..43ebddd 100644
--- a/guava/src/com/google/common/collect/ByFunctionOrdering.java
+++ b/guava/src/com/google/common/collect/ByFunctionOrdering.java
@@ -22,6 +22,7 @@
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
 import java.io.Serializable;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -29,7 +30,9 @@
  * elements.
  */
 @GwtCompatible(serializable = true)
-final class ByFunctionOrdering<F, T> extends Ordering<F> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class ByFunctionOrdering<F extends @Nullable Object, T extends @Nullable Object>
+    extends Ordering<F> implements Serializable {
   final Function<F, ? extends T> function;
   final Ordering<T> ordering;
 
@@ -39,12 +42,12 @@
   }
 
   @Override
-  public int compare(F left, F right) {
+  public int compare(@ParametricNullness F left, @ParametricNullness F right) {
     return ordering.compare(function.apply(left), function.apply(right));
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/collect/CartesianList.java b/guava/src/com/google/common/collect/CartesianList.java
index ebff724..475b3f2 100644
--- a/guava/src/com/google/common/collect/CartesianList.java
+++ b/guava/src/com/google/common/collect/CartesianList.java
@@ -22,7 +22,7 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@link Lists#cartesianProduct(List)}.
@@ -30,6 +30,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class CartesianList<E> extends AbstractList<List<E>> implements RandomAccess {
 
   private final transient ImmutableList<List<E>> axes;
@@ -67,7 +68,7 @@
   }
 
   @Override
-  public int indexOf(Object o) {
+  public int indexOf(@CheckForNull Object o) {
     if (!(o instanceof List)) {
       return -1;
     }
@@ -89,7 +90,7 @@
   }
 
   @Override
-  public int lastIndexOf(Object o) {
+  public int lastIndexOf(@CheckForNull Object o) {
     if (!(o instanceof List)) {
       return -1;
     }
@@ -140,7 +141,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object object) {
+  public boolean contains(@CheckForNull Object object) {
     if (!(object instanceof List)) {
       return false;
     }
diff --git a/guava/src/com/google/common/collect/ClassToInstanceMap.java b/guava/src/com/google/common/collect/ClassToInstanceMap.java
index a173556..9bd826f 100644
--- a/guava/src/com/google/common/collect/ClassToInstanceMap.java
+++ b/guava/src/com/google/common/collect/ClassToInstanceMap.java
@@ -20,7 +20,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A map, each entry of which maps a Java <a href="http://tinyurl.com/2cmwkz">raw type</a> to an
@@ -30,8 +30,19 @@
  * <p>Like any other {@code Map<Class, Object>}, this map may contain entries for primitive types,
  * and a primitive type and its corresponding wrapper type may map to different values.
  *
+ * <p>This class's support for {@code null} requires some explanation: From release 31.0 onward,
+ * Guava specifies the nullness of its types through annotations. In the case of {@code
+ * ClassToInstanceMap}, it specifies that both the key and value types are restricted to
+ * non-nullable types. This specification is reasonable for <i>keys</i>, which must be non-null
+ * classes. This is in contrast to the specification for <i>values</i>: Null values <i>are</i>
+ * supported by the implementation {@link MutableClassToInstanceMap}, even though that
+ * implementation and this interface specify otherwise. Thus, if you use a nullness checker, you can
+ * safely suppress any warnings it produces when you write null values into a {@code
+ * MutableClassToInstanceMap}. Just be sure to be prepared for null values when reading from it,
+ * since nullness checkers will assume that vaules are non-null then, too.
+ *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#classtoinstancemap"> {@code
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#classtoinstancemap">{@code
  * ClassToInstanceMap}</a>.
  *
  * <p>To map a generic type to an instance of that type, use {@link
@@ -43,12 +54,18 @@
  */
 @DoNotMock("Use ImmutableClassToInstanceMap or MutableClassToInstanceMap")
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
+// If we ever support non-null projections (https://github.com/jspecify/jspecify/issues/86), we
+// we might annotate this as...
+// ClassToInstanceMap<B extends @Nullable Object> extends Map<Class<? extends @Nonnull B>, B>
+// ...and change its methods similarly (<T extends @Nonnull B> or Class<@Nonnull T>).
 public interface ClassToInstanceMap<B> extends Map<Class<? extends B>, B> {
   /**
    * Returns the value the specified class is mapped to, or {@code null} if no entry for this class
    * is present. This will only return a value that was bound to this specific class, not a value
    * that may have been bound to a subtype.
    */
+  @CheckForNull
   <T extends B> T getInstance(Class<T> type);
 
   /**
@@ -59,5 +76,6 @@
    *     null} if there was no previous entry.
    */
   @CanIgnoreReturnValue
-  <T extends B> T putInstance(Class<T> type, @Nullable T value);
+  @CheckForNull
+  <T extends B> T putInstance(Class<T> type, T value);
 }
diff --git a/guava/src/com/google/common/collect/CollectCollectors.java b/guava/src/com/google/common/collect/CollectCollectors.java
index 8e038c8..63eec12 100644
--- a/guava/src/com/google/common/collect/CollectCollectors.java
+++ b/guava/src/com/google/common/collect/CollectCollectors.java
@@ -20,77 +20,63 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.common.base.Preconditions;
+import java.util.Collection;
 import java.util.Comparator;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.LinkedHashMap;
+import java.util.TreeMap;
+import java.util.function.BinaryOperator;
 import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.function.ToIntFunction;
 import java.util.stream.Collector;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Collectors utilities for {@code common.collect} internals. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class CollectCollectors {
-  static <T, K, V> Collector<T, ?, ImmutableBiMap<K, V>> toImmutableBiMap(
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction) {
-    checkNotNull(keyFunction);
-    checkNotNull(valueFunction);
-    return Collector.of(
-        ImmutableBiMap.Builder<K, V>::new,
-        (builder, input) -> builder.put(keyFunction.apply(input), valueFunction.apply(input)),
-        ImmutableBiMap.Builder::combine,
-        ImmutableBiMap.Builder::build,
-        new Collector.Characteristics[0]);
-  }
 
   private static final Collector<Object, ?, ImmutableList<Object>> TO_IMMUTABLE_LIST =
       Collector.of(
-          ImmutableList::<Object>builder,
+          ImmutableList::builder,
           ImmutableList.Builder::add,
           ImmutableList.Builder::combine,
           ImmutableList.Builder::build);
 
-  static <E> Collector<E, ?, ImmutableList<E>> toImmutableList() {
-    return (Collector) TO_IMMUTABLE_LIST;
-  }
-
-  static <T, K, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction) {
-    checkNotNull(keyFunction);
-    checkNotNull(valueFunction);
-    return Collector.of(
-        ImmutableMap.Builder<K, V>::new,
-        (builder, input) -> builder.put(keyFunction.apply(input), valueFunction.apply(input)),
-        ImmutableMap.Builder::combine,
-        ImmutableMap.Builder::build);
-  }
-
   private static final Collector<Object, ?, ImmutableSet<Object>> TO_IMMUTABLE_SET =
       Collector.of(
-          ImmutableSet::<Object>builder,
+          ImmutableSet::builder,
           ImmutableSet.Builder::add,
           ImmutableSet.Builder::combine,
           ImmutableSet.Builder::build);
 
-  static <E> Collector<E, ?, ImmutableSet<E>> toImmutableSet() {
-    return (Collector) TO_IMMUTABLE_SET;
+  @GwtIncompatible
+  private static final Collector<Range<Comparable<?>>, ?, ImmutableRangeSet<Comparable<?>>>
+      TO_IMMUTABLE_RANGE_SET =
+          Collector.of(
+              ImmutableRangeSet::builder,
+              ImmutableRangeSet.Builder::add,
+              ImmutableRangeSet.Builder::combine,
+              ImmutableRangeSet.Builder::build);
+
+  // Lists
+
+  @SuppressWarnings({"rawtypes", "unchecked"})
+  static <E> Collector<E, ?, ImmutableList<E>> toImmutableList() {
+    return (Collector) TO_IMMUTABLE_LIST;
   }
 
-  static <T, K, V> Collector<T, ?, ImmutableSortedMap<K, V>> toImmutableSortedMap(
-      Comparator<? super K> comparator,
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction) {
-    checkNotNull(comparator);
-    checkNotNull(keyFunction);
-    checkNotNull(valueFunction);
-    /*
-     * We will always fail if there are duplicate keys, and the keys are always sorted by
-     * the Comparator, so the entries can come in in arbitrary order -- so we report UNORDERED.
-     */
-    return Collector.of(
-        () -> new ImmutableSortedMap.Builder<K, V>(comparator),
-        (builder, input) -> builder.put(keyFunction.apply(input), valueFunction.apply(input)),
-        ImmutableSortedMap.Builder::combine,
-        ImmutableSortedMap.Builder::build,
-        Collector.Characteristics.UNORDERED);
+  // Sets
+
+  @SuppressWarnings({"rawtypes", "unchecked"})
+  static <E> Collector<E, ?, ImmutableSet<E>> toImmutableSet() {
+    return (Collector) TO_IMMUTABLE_SET;
   }
 
   static <E> Collector<E, ?, ImmutableSortedSet<E>> toImmutableSortedSet(
@@ -103,23 +89,252 @@
         ImmutableSortedSet.Builder::build);
   }
 
-  @GwtIncompatible
-  private static final Collector<Range<Comparable>, ?, ImmutableRangeSet<Comparable>>
-      TO_IMMUTABLE_RANGE_SET =
-          Collector.of(
-              ImmutableRangeSet::<Comparable>builder,
-              ImmutableRangeSet.Builder::add,
-              ImmutableRangeSet.Builder::combine,
-              ImmutableRangeSet.Builder::build);
+  @SuppressWarnings({"rawtypes", "unchecked"})
+  static <E extends Enum<E>> Collector<E, ?, ImmutableSet<E>> toImmutableEnumSet() {
+    return (Collector) EnumSetAccumulator.TO_IMMUTABLE_ENUM_SET;
+  }
+
+  private static final class EnumSetAccumulator<E extends Enum<E>> {
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    static final Collector<Enum<?>, ?, ImmutableSet<? extends Enum<?>>> TO_IMMUTABLE_ENUM_SET =
+        (Collector)
+            Collector.<Enum, EnumSetAccumulator, ImmutableSet<?>>of(
+                EnumSetAccumulator::new,
+                EnumSetAccumulator::add,
+                EnumSetAccumulator::combine,
+                EnumSetAccumulator::toImmutableSet,
+                Collector.Characteristics.UNORDERED);
+
+    @CheckForNull private EnumSet<E> set;
+
+    void add(E e) {
+      if (set == null) {
+        set = EnumSet.of(e);
+      } else {
+        set.add(e);
+      }
+    }
+
+    EnumSetAccumulator<E> combine(EnumSetAccumulator<E> other) {
+      if (this.set == null) {
+        return other;
+      } else if (other.set == null) {
+        return this;
+      } else {
+        this.set.addAll(other.set);
+        return this;
+      }
+    }
+
+    ImmutableSet<E> toImmutableSet() {
+      return (set == null) ? ImmutableSet.<E>of() : ImmutableEnumSet.asImmutable(set);
+    }
+  }
 
   @GwtIncompatible
+  @SuppressWarnings({"rawtypes", "unchecked"})
   static <E extends Comparable<? super E>>
       Collector<Range<E>, ?, ImmutableRangeSet<E>> toImmutableRangeSet() {
     return (Collector) TO_IMMUTABLE_RANGE_SET;
   }
 
+  // Multisets
+
+  static <T extends @Nullable Object, E> Collector<T, ?, ImmutableMultiset<E>> toImmutableMultiset(
+      Function<? super T, ? extends E> elementFunction, ToIntFunction<? super T> countFunction) {
+    checkNotNull(elementFunction);
+    checkNotNull(countFunction);
+    return Collector.of(
+        LinkedHashMultiset::create,
+        (multiset, t) ->
+            multiset.add(checkNotNull(elementFunction.apply(t)), countFunction.applyAsInt(t)),
+        (multiset1, multiset2) -> {
+          multiset1.addAll(multiset2);
+          return multiset1;
+        },
+        (Multiset<E> multiset) -> ImmutableMultiset.copyFromEntries(multiset.entrySet()));
+  }
+
+  static <T extends @Nullable Object, E extends @Nullable Object, M extends Multiset<E>>
+      Collector<T, ?, M> toMultiset(
+          Function<? super T, E> elementFunction,
+          ToIntFunction<? super T> countFunction,
+          Supplier<M> multisetSupplier) {
+    checkNotNull(elementFunction);
+    checkNotNull(countFunction);
+    checkNotNull(multisetSupplier);
+    return Collector.of(
+        multisetSupplier,
+        (ms, t) -> ms.add(elementFunction.apply(t), countFunction.applyAsInt(t)),
+        (ms1, ms2) -> {
+          ms1.addAll(ms2);
+          return ms1;
+        });
+  }
+
+  // Maps
+
+  static <T extends @Nullable Object, K, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
+      Function<? super T, ? extends K> keyFunction,
+      Function<? super T, ? extends V> valueFunction) {
+    checkNotNull(keyFunction);
+    checkNotNull(valueFunction);
+    return Collector.of(
+        ImmutableMap.Builder<K, V>::new,
+        (builder, input) -> builder.put(keyFunction.apply(input), valueFunction.apply(input)),
+        ImmutableMap.Builder::combine,
+        ImmutableMap.Builder::build);
+  }
+
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction) {
+    checkNotNull(keyFunction);
+    checkNotNull(valueFunction);
+    checkNotNull(mergeFunction);
+    return Collectors.collectingAndThen(
+        Collectors.toMap(keyFunction, valueFunction, mergeFunction, LinkedHashMap::new),
+        ImmutableMap::copyOf);
+  }
+
+  static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableSortedMap<K, V>> toImmutableSortedMap(
+          Comparator<? super K> comparator,
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction) {
+    checkNotNull(comparator);
+    checkNotNull(keyFunction);
+    checkNotNull(valueFunction);
+    /*
+     * We will always fail if there are duplicate keys, and the keys are always sorted by
+     * the Comparator, so the entries can come in an arbitrary order -- so we report UNORDERED.
+     */
+    return Collector.of(
+        () -> new ImmutableSortedMap.Builder<K, V>(comparator),
+        (builder, input) -> builder.put(keyFunction.apply(input), valueFunction.apply(input)),
+        ImmutableSortedMap.Builder::combine,
+        ImmutableSortedMap.Builder::build,
+        Collector.Characteristics.UNORDERED);
+  }
+
+  static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableSortedMap<K, V>> toImmutableSortedMap(
+          Comparator<? super K> comparator,
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction) {
+    checkNotNull(comparator);
+    checkNotNull(keyFunction);
+    checkNotNull(valueFunction);
+    checkNotNull(mergeFunction);
+    return Collectors.collectingAndThen(
+        Collectors.toMap(
+            keyFunction, valueFunction, mergeFunction, () -> new TreeMap<K, V>(comparator)),
+        ImmutableSortedMap::copyOfSorted);
+  }
+
+  static <T extends @Nullable Object, K, V> Collector<T, ?, ImmutableBiMap<K, V>> toImmutableBiMap(
+      Function<? super T, ? extends K> keyFunction,
+      Function<? super T, ? extends V> valueFunction) {
+    checkNotNull(keyFunction);
+    checkNotNull(valueFunction);
+    return Collector.of(
+        ImmutableBiMap.Builder<K, V>::new,
+        (builder, input) -> builder.put(keyFunction.apply(input), valueFunction.apply(input)),
+        ImmutableBiMap.Builder::combine,
+        ImmutableBiMap.Builder::build,
+        new Collector.Characteristics[0]);
+  }
+
+  static <T extends @Nullable Object, K extends Enum<K>, V>
+      Collector<T, ?, ImmutableMap<K, V>> toImmutableEnumMap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction) {
+    checkNotNull(keyFunction);
+    checkNotNull(valueFunction);
+    return Collector.of(
+        () ->
+            new EnumMapAccumulator<K, V>(
+                (v1, v2) -> {
+                  throw new IllegalArgumentException("Multiple values for key: " + v1 + ", " + v2);
+                }),
+        (accum, t) -> {
+          /*
+           * We assign these to variables before calling checkNotNull to work around a bug in our
+           * nullness checker.
+           */
+          K key = keyFunction.apply(t);
+          V newValue = valueFunction.apply(t);
+          accum.put(
+              checkNotNull(key, "Null key for input %s", t),
+              checkNotNull(newValue, "Null value for input %s", t));
+        },
+        EnumMapAccumulator::combine,
+        EnumMapAccumulator::toImmutableMap,
+        Collector.Characteristics.UNORDERED);
+  }
+
+  static <T extends @Nullable Object, K extends Enum<K>, V>
+      Collector<T, ?, ImmutableMap<K, V>> toImmutableEnumMap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction) {
+    checkNotNull(keyFunction);
+    checkNotNull(valueFunction);
+    checkNotNull(mergeFunction);
+    // not UNORDERED because we don't know if mergeFunction is commutative
+    return Collector.of(
+        () -> new EnumMapAccumulator<K, V>(mergeFunction),
+        (accum, t) -> {
+          /*
+           * We assign these to variables before calling checkNotNull to work around a bug in our
+           * nullness checker.
+           */
+          K key = keyFunction.apply(t);
+          V newValue = valueFunction.apply(t);
+          accum.put(
+              checkNotNull(key, "Null key for input %s", t),
+              checkNotNull(newValue, "Null value for input %s", t));
+        },
+        EnumMapAccumulator::combine,
+        EnumMapAccumulator::toImmutableMap);
+  }
+
+  private static class EnumMapAccumulator<K extends Enum<K>, V> {
+    private final BinaryOperator<V> mergeFunction;
+    @CheckForNull private EnumMap<K, V> map = null;
+
+    EnumMapAccumulator(BinaryOperator<V> mergeFunction) {
+      this.mergeFunction = mergeFunction;
+    }
+
+    void put(K key, V value) {
+      if (map == null) {
+        map = new EnumMap<>(key.getDeclaringClass());
+      }
+      map.merge(key, value, mergeFunction);
+    }
+
+    EnumMapAccumulator<K, V> combine(EnumMapAccumulator<K, V> other) {
+      if (this.map == null) {
+        return other;
+      } else if (other.map == null) {
+        return this;
+      } else {
+        other.map.forEach(this::put);
+        return this;
+      }
+    }
+
+    ImmutableMap<K, V> toImmutableMap() {
+      return (map == null) ? ImmutableMap.<K, V>of() : ImmutableEnumMap.asImmutable(map);
+    }
+  }
+
   @GwtIncompatible
-  static <T, K extends Comparable<? super K>, V>
+  static <T extends @Nullable Object, K extends Comparable<? super K>, V>
       Collector<T, ?, ImmutableRangeMap<K, V>> toImmutableRangeMap(
           Function<? super T, Range<K>> keyFunction,
           Function<? super T, ? extends V> valueFunction) {
@@ -131,4 +346,106 @@
         ImmutableRangeMap.Builder::combine,
         ImmutableRangeMap.Builder::build);
   }
+
+  // Multimaps
+
+  static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableListMultimap<K, V>> toImmutableListMultimap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction) {
+    checkNotNull(keyFunction, "keyFunction");
+    checkNotNull(valueFunction, "valueFunction");
+    return Collector.of(
+        ImmutableListMultimap::<K, V>builder,
+        (builder, t) -> builder.put(keyFunction.apply(t), valueFunction.apply(t)),
+        ImmutableListMultimap.Builder::combine,
+        ImmutableListMultimap.Builder::build);
+  }
+
+  static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableListMultimap<K, V>> flatteningToImmutableListMultimap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends Stream<? extends V>> valuesFunction) {
+    checkNotNull(keyFunction);
+    checkNotNull(valuesFunction);
+    return Collectors.collectingAndThen(
+        flatteningToMultimap(
+            input -> checkNotNull(keyFunction.apply(input)),
+            input -> valuesFunction.apply(input).peek(Preconditions::checkNotNull),
+            MultimapBuilder.linkedHashKeys().arrayListValues()::<K, V>build),
+        ImmutableListMultimap::copyOf);
+  }
+
+  static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableSetMultimap<K, V>> toImmutableSetMultimap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction) {
+    checkNotNull(keyFunction, "keyFunction");
+    checkNotNull(valueFunction, "valueFunction");
+    return Collector.of(
+        ImmutableSetMultimap::<K, V>builder,
+        (builder, t) -> builder.put(keyFunction.apply(t), valueFunction.apply(t)),
+        ImmutableSetMultimap.Builder::combine,
+        ImmutableSetMultimap.Builder::build);
+  }
+
+  static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableSetMultimap<K, V>> flatteningToImmutableSetMultimap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends Stream<? extends V>> valuesFunction) {
+    checkNotNull(keyFunction);
+    checkNotNull(valuesFunction);
+    return Collectors.collectingAndThen(
+        flatteningToMultimap(
+            input -> checkNotNull(keyFunction.apply(input)),
+            input -> valuesFunction.apply(input).peek(Preconditions::checkNotNull),
+            MultimapBuilder.linkedHashKeys().linkedHashSetValues()::<K, V>build),
+        ImmutableSetMultimap::copyOf);
+  }
+
+  static <
+          T extends @Nullable Object,
+          K extends @Nullable Object,
+          V extends @Nullable Object,
+          M extends Multimap<K, V>>
+      Collector<T, ?, M> toMultimap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction,
+          Supplier<M> multimapSupplier) {
+    checkNotNull(keyFunction);
+    checkNotNull(valueFunction);
+    checkNotNull(multimapSupplier);
+    return Collector.of(
+        multimapSupplier,
+        (multimap, input) -> multimap.put(keyFunction.apply(input), valueFunction.apply(input)),
+        (multimap1, multimap2) -> {
+          multimap1.putAll(multimap2);
+          return multimap1;
+        });
+  }
+
+  static <
+          T extends @Nullable Object,
+          K extends @Nullable Object,
+          V extends @Nullable Object,
+          M extends Multimap<K, V>>
+      Collector<T, ?, M> flatteningToMultimap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends Stream<? extends V>> valueFunction,
+          Supplier<M> multimapSupplier) {
+    checkNotNull(keyFunction);
+    checkNotNull(valueFunction);
+    checkNotNull(multimapSupplier);
+    return Collector.of(
+        multimapSupplier,
+        (multimap, input) -> {
+          K key = keyFunction.apply(input);
+          Collection<V> valuesForKey = multimap.get(key);
+          valueFunction.apply(input).forEachOrdered(valuesForKey::add);
+        },
+        (multimap1, multimap2) -> {
+          multimap1.putAll(multimap2);
+          return multimap1;
+        });
+  }
 }
diff --git a/guava/src/com/google/common/collect/CollectPreconditions.java b/guava/src/com/google/common/collect/CollectPreconditions.java
index 98b30c6..c649b03 100644
--- a/guava/src/com/google/common/collect/CollectPreconditions.java
+++ b/guava/src/com/google/common/collect/CollectPreconditions.java
@@ -23,6 +23,7 @@
 
 /** Precondition checks useful in collection implementations. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class CollectPreconditions {
 
   static void checkEntryNotNull(Object key, Object value) {
diff --git a/guava/src/com/google/common/collect/CollectSpliterators.java b/guava/src/com/google/common/collect/CollectSpliterators.java
index 974f77f..91f563d 100644
--- a/guava/src/com/google/common/collect/CollectSpliterators.java
+++ b/guava/src/com/google/common/collect/CollectSpliterators.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.j2objc.annotations.Weak;
@@ -31,22 +32,25 @@
 import java.util.function.LongConsumer;
 import java.util.function.Predicate;
 import java.util.stream.IntStream;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Spliterator utilities for {@code common.collect} internals. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class CollectSpliterators {
   private CollectSpliterators() {}
 
-  static <T> Spliterator<T> indexed(int size, int extraCharacteristics, IntFunction<T> function) {
+  static <T extends @Nullable Object> Spliterator<T> indexed(
+      int size, int extraCharacteristics, IntFunction<T> function) {
     return indexed(size, extraCharacteristics, function, null);
   }
 
-  static <T> Spliterator<T> indexed(
+  static <T extends @Nullable Object> Spliterator<T> indexed(
       int size,
       int extraCharacteristics,
       IntFunction<T> function,
-      Comparator<? super T> comparator) {
+      @CheckForNull Comparator<? super T> comparator) {
     if (comparator != null) {
       checkArgument((extraCharacteristics & Spliterator.SORTED) != 0);
     }
@@ -68,7 +72,8 @@
       }
 
       @Override
-      public @Nullable Spliterator<T> trySplit() {
+      @CheckForNull
+      public Spliterator<T> trySplit() {
         Spliterator.OfInt split = delegate.trySplit();
         return (split == null) ? null : new WithCharacteristics(split);
       }
@@ -87,6 +92,7 @@
       }
 
       @Override
+      @CheckForNull
       public Comparator<? super T> getComparator() {
         if (hasCharacteristics(Spliterator.SORTED)) {
           return comparator;
@@ -102,9 +108,10 @@
    * Returns a {@code Spliterator} over the elements of {@code fromSpliterator} mapped by {@code
    * function}.
    */
-  static <InElementT, OutElementT> Spliterator<OutElementT> map(
-      Spliterator<InElementT> fromSpliterator,
-      Function<? super InElementT, ? extends OutElementT> function) {
+  static <InElementT extends @Nullable Object, OutElementT extends @Nullable Object>
+      Spliterator<OutElementT> map(
+          Spliterator<InElementT> fromSpliterator,
+          Function<? super InElementT, ? extends OutElementT> function) {
     checkNotNull(fromSpliterator);
     checkNotNull(function);
     return new Spliterator<OutElementT>() {
@@ -121,6 +128,7 @@
       }
 
       @Override
+      @CheckForNull
       public Spliterator<OutElementT> trySplit() {
         Spliterator<InElementT> fromSplit = fromSpliterator.trySplit();
         return (fromSplit != null) ? map(fromSplit, function) : null;
@@ -140,14 +148,15 @@
   }
 
   /** Returns a {@code Spliterator} filtered by the specified predicate. */
-  static <T> Spliterator<T> filter(Spliterator<T> fromSpliterator, Predicate<? super T> predicate) {
+  static <T extends @Nullable Object> Spliterator<T> filter(
+      Spliterator<T> fromSpliterator, Predicate<? super T> predicate) {
     checkNotNull(fromSpliterator);
     checkNotNull(predicate);
     class Splitr implements Spliterator<T>, Consumer<T> {
-      T holder = null;
+      @CheckForNull T holder = null;
 
       @Override
-      public void accept(T t) {
+      public void accept(@ParametricNullness T t) {
         this.holder = t;
       }
 
@@ -155,8 +164,10 @@
       public boolean tryAdvance(Consumer<? super T> action) {
         while (fromSpliterator.tryAdvance(this)) {
           try {
-            if (predicate.test(holder)) {
-              action.accept(holder);
+            // The cast is safe because tryAdvance puts a T into `holder`.
+            T next = uncheckedCastNullableTToT(holder);
+            if (predicate.test(next)) {
+              action.accept(next);
               return true;
             }
           } finally {
@@ -167,6 +178,7 @@
       }
 
       @Override
+      @CheckForNull
       public Spliterator<T> trySplit() {
         Spliterator<T> fromSplit = fromSpliterator.trySplit();
         return (fromSplit == null) ? null : filter(fromSplit, predicate);
@@ -178,6 +190,7 @@
       }
 
       @Override
+      @CheckForNull
       public Comparator<? super T> getComparator() {
         return fromSpliterator.getComparator();
       }
@@ -198,11 +211,12 @@
    * Returns a {@code Spliterator} that iterates over the elements of the spliterators generated by
    * applying {@code function} to the elements of {@code fromSpliterator}.
    */
-  static <InElementT, OutElementT> Spliterator<OutElementT> flatMap(
-      Spliterator<InElementT> fromSpliterator,
-      Function<? super InElementT, Spliterator<OutElementT>> function,
-      int topCharacteristics,
-      long topSize) {
+  static <InElementT extends @Nullable Object, OutElementT extends @Nullable Object>
+      Spliterator<OutElementT> flatMap(
+          Spliterator<InElementT> fromSpliterator,
+          Function<? super InElementT, Spliterator<OutElementT>> function,
+          int topCharacteristics,
+          long topSize) {
     checkArgument(
         (topCharacteristics & Spliterator.SUBSIZED) == 0,
         "flatMap does not support SUBSIZED characteristic");
@@ -220,7 +234,7 @@
    * generated by applying {@code function} to the elements of {@code fromSpliterator}. (If {@code
    * function} returns {@code null} for an input, it is replaced with an empty stream.)
    */
-  static <InElementT> Spliterator.OfInt flatMapToInt(
+  static <InElementT extends @Nullable Object> Spliterator.OfInt flatMapToInt(
       Spliterator<InElementT> fromSpliterator,
       Function<? super InElementT, Spliterator.OfInt> function,
       int topCharacteristics,
@@ -242,7 +256,7 @@
    * generated by applying {@code function} to the elements of {@code fromSpliterator}. (If {@code
    * function} returns {@code null} for an input, it is replaced with an empty stream.)
    */
-  static <InElementT> Spliterator.OfLong flatMapToLong(
+  static <InElementT extends @Nullable Object> Spliterator.OfLong flatMapToLong(
       Spliterator<InElementT> fromSpliterator,
       Function<? super InElementT, Spliterator.OfLong> function,
       int topCharacteristics,
@@ -264,7 +278,7 @@
    * generated by applying {@code function} to the elements of {@code fromSpliterator}. (If {@code
    * function} returns {@code null} for an input, it is replaced with an empty stream.)
    */
-  static <InElementT> Spliterator.OfDouble flatMapToDouble(
+  static <InElementT extends @Nullable Object> Spliterator.OfDouble flatMapToDouble(
       Spliterator<InElementT> fromSpliterator,
       Function<? super InElementT, Spliterator.OfDouble> function,
       int topCharacteristics,
@@ -289,20 +303,22 @@
    * @param <OutSpliteratorT> the type of the output spliterators
    */
   abstract static class FlatMapSpliterator<
-          InElementT, OutElementT, OutSpliteratorT extends Spliterator<OutElementT>>
+          InElementT extends @Nullable Object,
+          OutElementT extends @Nullable Object,
+          OutSpliteratorT extends Spliterator<OutElementT>>
       implements Spliterator<OutElementT> {
     /** Factory for constructing {@link FlatMapSpliterator} instances. */
     @FunctionalInterface
-    interface Factory<InElementT, OutSpliteratorT extends Spliterator<?>> {
+    interface Factory<InElementT extends @Nullable Object, OutSpliteratorT extends Spliterator<?>> {
       OutSpliteratorT newFlatMapSpliterator(
-          OutSpliteratorT prefix,
+          @CheckForNull OutSpliteratorT prefix,
           Spliterator<InElementT> fromSplit,
           Function<? super InElementT, OutSpliteratorT> function,
           int splitCharacteristics,
           long estSplitSize);
     }
 
-    @Nullable @Weak OutSpliteratorT prefix;
+    @Weak @CheckForNull OutSpliteratorT prefix;
     final Spliterator<InElementT> from;
     final Function<? super InElementT, OutSpliteratorT> function;
     final Factory<InElementT, OutSpliteratorT> factory;
@@ -310,7 +326,7 @@
     long estimatedSize;
 
     FlatMapSpliterator(
-        OutSpliteratorT prefix,
+        @CheckForNull OutSpliteratorT prefix,
         Spliterator<InElementT> from,
         Function<? super InElementT, OutSpliteratorT> function,
         Factory<InElementT, OutSpliteratorT> factory,
@@ -365,6 +381,7 @@
     }
 
     @Override
+    @CheckForNull
     public final OutSpliteratorT trySplit() {
       Spliterator<InElementT> fromSplit = from.trySplit();
       if (fromSplit != null) {
@@ -414,10 +431,11 @@
    * @param <InElementT> the element type of the input spliterator
    * @param <OutElementT> the element type of the output spliterators
    */
-  static final class FlatMapSpliteratorOfObject<InElementT, OutElementT>
+  static final class FlatMapSpliteratorOfObject<
+          InElementT extends @Nullable Object, OutElementT extends @Nullable Object>
       extends FlatMapSpliterator<InElementT, OutElementT, Spliterator<OutElementT>> {
     FlatMapSpliteratorOfObject(
-        Spliterator<OutElementT> prefix,
+        @CheckForNull Spliterator<OutElementT> prefix,
         Spliterator<InElementT> from,
         Function<? super InElementT, Spliterator<OutElementT>> function,
         int characteristics,
@@ -436,8 +454,8 @@
    * @param <OutSpliteratorT> the primitive spliterator type associated with {@code OutElementT}
    */
   abstract static class FlatMapSpliteratorOfPrimitive<
-          InElementT,
-          OutElementT,
+          InElementT extends @Nullable Object,
+          OutElementT extends @Nullable Object,
           OutConsumerT,
           OutSpliteratorT extends
               Spliterator.OfPrimitive<OutElementT, OutConsumerT, OutSpliteratorT>>
@@ -445,7 +463,7 @@
       implements Spliterator.OfPrimitive<OutElementT, OutConsumerT, OutSpliteratorT> {
 
     FlatMapSpliteratorOfPrimitive(
-        OutSpliteratorT prefix,
+        @CheckForNull OutSpliteratorT prefix,
         Spliterator<InElementT> from,
         Function<? super InElementT, OutSpliteratorT> function,
         Factory<InElementT, OutSpliteratorT> factory,
@@ -489,11 +507,11 @@
   }
 
   /** Implementation of {@link #flatMapToInt}. */
-  static final class FlatMapSpliteratorOfInt<InElementT>
+  static final class FlatMapSpliteratorOfInt<InElementT extends @Nullable Object>
       extends FlatMapSpliteratorOfPrimitive<InElementT, Integer, IntConsumer, Spliterator.OfInt>
       implements Spliterator.OfInt {
     FlatMapSpliteratorOfInt(
-        Spliterator.OfInt prefix,
+        @CheckForNull Spliterator.OfInt prefix,
         Spliterator<InElementT> from,
         Function<? super InElementT, Spliterator.OfInt> function,
         int characteristics,
@@ -503,11 +521,11 @@
   }
 
   /** Implementation of {@link #flatMapToLong}. */
-  static final class FlatMapSpliteratorOfLong<InElementT>
+  static final class FlatMapSpliteratorOfLong<InElementT extends @Nullable Object>
       extends FlatMapSpliteratorOfPrimitive<InElementT, Long, LongConsumer, Spliterator.OfLong>
       implements Spliterator.OfLong {
     FlatMapSpliteratorOfLong(
-        Spliterator.OfLong prefix,
+        @CheckForNull Spliterator.OfLong prefix,
         Spliterator<InElementT> from,
         Function<? super InElementT, Spliterator.OfLong> function,
         int characteristics,
@@ -517,12 +535,12 @@
   }
 
   /** Implementation of {@link #flatMapToDouble}. */
-  static final class FlatMapSpliteratorOfDouble<InElementT>
+  static final class FlatMapSpliteratorOfDouble<InElementT extends @Nullable Object>
       extends FlatMapSpliteratorOfPrimitive<
           InElementT, Double, DoubleConsumer, Spliterator.OfDouble>
       implements Spliterator.OfDouble {
     FlatMapSpliteratorOfDouble(
-        Spliterator.OfDouble prefix,
+        @CheckForNull Spliterator.OfDouble prefix,
         Spliterator<InElementT> from,
         Function<? super InElementT, Spliterator.OfDouble> function,
         int characteristics,
diff --git a/guava/src/com/google/common/collect/Collections2.java b/guava/src/com/google/common/collect/Collections2.java
index 009f10e..eb92859 100644
--- a/guava/src/com/google/common/collect/Collections2.java
+++ b/guava/src/com/google/common/collect/Collections2.java
@@ -19,6 +19,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -37,6 +38,7 @@
 import java.util.List;
 import java.util.Spliterator;
 import java.util.function.Consumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -53,6 +55,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Collections2 {
   private Collections2() {}
 
@@ -83,7 +86,8 @@
    */
   // TODO(kevinb): how can we omit that Iterables link when building gwt
   // javadoc?
-  public static <E> Collection<E> filter(Collection<E> unfiltered, Predicate<? super E> predicate) {
+  public static <E extends @Nullable Object> Collection<E> filter(
+      Collection<E> unfiltered, Predicate<? super E> predicate) {
     if (unfiltered instanceof FilteredCollection) {
       // Support clear(), removeAll(), and retainAll() when filtering a filtered
       // collection.
@@ -97,7 +101,7 @@
    * Delegates to {@link Collection#contains}. Returns {@code false} if the {@code contains} method
    * throws a {@code ClassCastException} or {@code NullPointerException}.
    */
-  static boolean safeContains(Collection<?> collection, @Nullable Object object) {
+  static boolean safeContains(Collection<?> collection, @CheckForNull Object object) {
     checkNotNull(collection);
     try {
       return collection.contains(object);
@@ -110,7 +114,7 @@
    * Delegates to {@link Collection#remove}. Returns {@code false} if the {@code remove} method
    * throws a {@code ClassCastException} or {@code NullPointerException}.
    */
-  static boolean safeRemove(Collection<?> collection, @Nullable Object object) {
+  static boolean safeRemove(Collection<?> collection, @CheckForNull Object object) {
     checkNotNull(collection);
     try {
       return collection.remove(object);
@@ -119,7 +123,7 @@
     }
   }
 
-  static class FilteredCollection<E> extends AbstractCollection<E> {
+  static class FilteredCollection<E extends @Nullable Object> extends AbstractCollection<E> {
     final Collection<E> unfiltered;
     final Predicate<? super E> predicate;
 
@@ -134,7 +138,7 @@
     }
 
     @Override
-    public boolean add(E element) {
+    public boolean add(@ParametricNullness E element) {
       checkArgument(predicate.apply(element));
       return unfiltered.add(element);
     }
@@ -153,7 +157,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object element) {
+    public boolean contains(@CheckForNull Object element) {
       if (safeContains(unfiltered, element)) {
         @SuppressWarnings("unchecked") // element is in unfiltered, so it must be an E
         E e = (E) element;
@@ -194,7 +198,7 @@
     }
 
     @Override
-    public boolean remove(Object element) {
+    public boolean remove(@CheckForNull Object element) {
       return contains(element) && unfiltered.remove(element);
     }
 
@@ -226,13 +230,14 @@
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       // creating an ArrayList so filtering happens once
       return Lists.newArrayList(iterator()).toArray();
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return Lists.newArrayList(iterator()).toArray(array);
     }
   }
@@ -256,12 +261,13 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link java.util.stream.Stream#map Stream.map}.
    */
-  public static <F, T> Collection<T> transform(
+  public static <F extends @Nullable Object, T extends @Nullable Object> Collection<T> transform(
       Collection<F> fromCollection, Function<? super F, T> function) {
     return new TransformedCollection<>(fromCollection, function);
   }
 
-  static class TransformedCollection<F, T> extends AbstractCollection<T> {
+  static class TransformedCollection<F extends @Nullable Object, T extends @Nullable Object>
+      extends AbstractCollection<T> {
     final Collection<F> fromCollection;
     final Function<? super F, ? extends T> function;
 
@@ -489,7 +495,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object obj) {
+    public boolean contains(@CheckForNull Object obj) {
       if (obj instanceof List) {
         List<?> list = (List<?>) obj;
         return isPermutation(inputList, list);
@@ -504,7 +510,7 @@
   }
 
   private static final class OrderedPermutationIterator<E> extends AbstractIterator<List<E>> {
-    @Nullable List<E> nextPermutation;
+    @CheckForNull List<E> nextPermutation;
     final Comparator<? super E> comparator;
 
     OrderedPermutationIterator(List<E> list, Comparator<? super E> comparator) {
@@ -513,6 +519,7 @@
     }
 
     @Override
+    @CheckForNull
     protected List<E> computeNext() {
       if (nextPermutation == null) {
         return endOfData();
@@ -528,6 +535,11 @@
         nextPermutation = null;
         return;
       }
+      /*
+       * requireNonNull is safe because we don't clear nextPermutation until we're done calling this
+       * method.
+       */
+      requireNonNull(nextPermutation);
 
       int l = findNextL(j);
       Collections.swap(nextPermutation, j, l);
@@ -536,6 +548,11 @@
     }
 
     int findNextJ() {
+      /*
+       * requireNonNull is safe because we don't clear nextPermutation until we're done calling this
+       * method.
+       */
+      requireNonNull(nextPermutation);
       for (int k = nextPermutation.size() - 2; k >= 0; k--) {
         if (comparator.compare(nextPermutation.get(k), nextPermutation.get(k + 1)) < 0) {
           return k;
@@ -545,6 +562,11 @@
     }
 
     int findNextL(int j) {
+      /*
+       * requireNonNull is safe because we don't clear nextPermutation until we're done calling this
+       * method.
+       */
+      requireNonNull(nextPermutation);
       E ak = nextPermutation.get(j);
       for (int l = nextPermutation.size() - 1; l > j; l--) {
         if (comparator.compare(ak, nextPermutation.get(l)) < 0) {
@@ -600,7 +622,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object obj) {
+    public boolean contains(@CheckForNull Object obj) {
       if (obj instanceof List) {
         List<?> list = (List<?>) obj;
         return isPermutation(inputList, list);
@@ -631,6 +653,7 @@
     }
 
     @Override
+    @CheckForNull
     protected List<E> computeNext() {
       if (j <= 0) {
         return endOfData();
diff --git a/guava/src/com/google/common/collect/CompactHashMap.java b/guava/src/com/google/common/collect/CompactHashMap.java
index a68890e..e40b05e 100644
--- a/guava/src/com/google/common/collect/CompactHashMap.java
+++ b/guava/src/com/google/common/collect/CompactHashMap.java
@@ -20,6 +20,9 @@
 import static com.google.common.collect.CollectPreconditions.checkRemove;
 import static com.google.common.collect.CompactHashing.UNSET;
 import static com.google.common.collect.Hashing.smearedHash;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static com.google.common.collect.NullnessCasts.unsafeNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -47,6 +50,7 @@
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import java.util.function.Consumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -76,7 +80,9 @@
  * @author Jon Noack
  */
 @GwtIncompatible // not worth using in GWT for now
-class CompactHashMap<K, V> extends AbstractMap<K, V> implements Serializable {
+@ElementTypesAreNonnullByDefault
+class CompactHashMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMap<K, V> implements Serializable {
   /*
    * TODO: Make this a drop-in replacement for j.u. versions, actually drop them in, and test the
    * world. Figure out what sort of space-time tradeoff we're actually going to get here with the
@@ -86,7 +92,8 @@
    */
 
   /** Creates an empty {@code CompactHashMap} instance. */
-  public static <K, V> CompactHashMap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      CompactHashMap<K, V> create() {
     return new CompactHashMap<>();
   }
 
@@ -99,7 +106,8 @@
    *     elements without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <K, V> CompactHashMap<K, V> createWithExpectedSize(int expectedSize) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      CompactHashMap<K, V> createWithExpectedSize(int expectedSize) {
     return new CompactHashMap<>(expectedSize);
   }
 
@@ -119,6 +127,46 @@
    */
   private static final int MAX_HASH_BUCKET_LENGTH = 9;
 
+  // The way the `table`, `entries`, `keys`, and `values` arrays work together is as follows.
+  //
+  // The `table` array always has a size that is a power of 2. The hashcode of a key in the map
+  // is masked in order to correspond to the current table size. For example, if the table size
+  // is 128 then the mask is 127 == 0x7f, keeping the bottom 7 bits of the hash value.
+  // If a key hashes to 0x89abcdef the mask reduces it to 0x89abcdef & 0x7f == 0x6f. We'll call this
+  // the "short hash".
+  //
+  // The `keys`, `values`, and `entries` arrays always have the same size as each other. They can be
+  // seen as fields of an imaginary `Entry` object like this:
+  //
+  // class Entry {
+  //    int hash;
+  //    Entry next;
+  //    K key;
+  //    V value;
+  // }
+  //
+  // The imaginary `hash` and `next` values are combined into a single `int` value in the `entries`
+  // array. The top bits of this value are the remaining bits of the hash value that were not used
+  // in the short hash. We saw that a mask of 0x7f would keep the 7-bit value 0x6f from a full
+  // hashcode of 0x89abcdef. The imaginary `hash` value would then be the remaining top 25 bits,
+  // 0x89abcd80. To this is added (or'd) the `next` value, which is an index within `entries`
+  // (and therefore within `keys` and `values`) of another entry that has the same short hash
+  // value. In our example, it would be another entry for a key whose short hash is also 0x6f.
+  //
+  // Essentially, then, `table[h]` gives us the start of a linked list in `entries`, where every
+  // element of the list has the short hash value h.
+  //
+  // A wrinkle here is that the value 0 (called UNSET in the code) is used as the equivalent of a
+  // null pointer. If `table[h] == 0` that means there are no keys in the map whose short hash is h.
+  // If the `next` bits in `entries[i]` are 0 that means there are no further entries for the given
+  // short hash. But 0 is also a valid index in `entries`, so we add 1 to these indices before
+  // putting them in `table` or in `next` bits, and subtract 1 again when we need an index value.
+  //
+  // The elements of `keys`, `values`, and `entries` are added sequentially, so that elements 0 to
+  // `size() - 1` are used and remaining elements are not. This makes iteration straightforward.
+  // Removing an entry generally involves moving the last element of each array to where the removed
+  // entry was, and adjusting index links accordingly.
+
   /**
    * The hashtable object. This can be either:
    *
@@ -138,7 +186,7 @@
    *   <li>null, if no entries have yet been added to the map
    * </ul>
    */
-  @Nullable private transient Object table;
+  @CheckForNull private transient Object table;
 
   /**
    * Contains the logical entries, in the range of [0, size()). The high bits of each int are the
@@ -148,32 +196,38 @@
    *
    * <pre>
    * hash  = aaaaaaaa
-   * mask  = 0000ffff
-   * next  = 0000bbbb
-   * entry = aaaabbbb
+   * mask  = 00000fff
+   * next  = 00000bbb
+   * entry = aaaaabbb
    * </pre>
    *
    * <p>The pointers in [size(), entries.length) are all "null" (UNSET).
    */
-  @VisibleForTesting transient int @Nullable [] entries;
+  @VisibleForTesting @CheckForNull transient int[] entries;
 
   /**
    * The keys of the entries in the map, in the range of [0, size()). The keys in [size(),
    * keys.length) are all {@code null}.
    */
-  @VisibleForTesting transient Object @Nullable [] keys;
+  @VisibleForTesting @CheckForNull transient @Nullable Object[] keys;
 
   /**
    * The values of the entries in the map, in the range of [0, size()). The values in [size(),
    * values.length) are all {@code null}.
    */
-  @VisibleForTesting transient Object @Nullable [] values;
+  @VisibleForTesting @CheckForNull transient @Nullable Object[] values;
 
   /**
    * Keeps track of metadata like the number of hash table bits and modifications of this data
    * structure (to make it possible to throw ConcurrentModificationException in the iterator). Note
    * that we choose not to make this volatile, so we do less of a "best effort" to track such
    * errors, for better performance.
+   *
+   * <p>For a new instance, where the arrays above have not yet been allocated, the value of {@code
+   * metadata} is the size that the arrays should be allocated with. Once the arrays have been
+   * allocated, the value of {@code metadata} combines the number of bits in the "short hash", in
+   * its bottom {@value CompactHashing#HASH_TABLE_BITS_MAX_BITS} bits, with a modification count in
+   * the remaining bits that is used to detect concurrent modification during iteration.
    */
   private transient int metadata;
 
@@ -227,7 +281,7 @@
 
   @SuppressWarnings("unchecked")
   @VisibleForTesting
-  @Nullable
+  @CheckForNull
   Map<K, V> delegateOrNull() {
     if (table instanceof Map) {
       return (Map<K, V>) table;
@@ -239,13 +293,12 @@
     return new LinkedHashMap<>(tableSize, 1.0f);
   }
 
-  @SuppressWarnings("unchecked")
   @VisibleForTesting
   @CanIgnoreReturnValue
   Map<K, V> convertToHashFloodingResistantImplementation() {
     Map<K, V> newDelegate = createHashFloodingResistantDelegate(hashTableMask() + 1);
     for (int i = firstEntryIndex(); i >= 0; i = getSuccessor(i)) {
-      newDelegate.put((K) keys[i], (V) values[i]);
+      newDelegate.put(key(i), value(i));
     }
     this.table = newDelegate;
     this.entries = null;
@@ -281,30 +334,31 @@
 
   @CanIgnoreReturnValue
   @Override
-  public @Nullable V put(@Nullable K key, @Nullable V value) {
+  @CheckForNull
+  public V put(@ParametricNullness K key, @ParametricNullness V value) {
     if (needsAllocArrays()) {
       allocArrays();
     }
-    @Nullable Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.put(key, value);
     }
-    int[] entries = this.entries;
-    Object[] keys = this.keys;
-    Object[] values = this.values;
+    int[] entries = requireEntries();
+    @Nullable Object[] keys = requireKeys();
+    @Nullable Object[] values = requireValues();
 
     int newEntryIndex = this.size; // current size, and pointer to the entry to be appended
     int newSize = newEntryIndex + 1;
     int hash = smearedHash(key);
     int mask = hashTableMask();
     int tableIndex = hash & mask;
-    int next = CompactHashing.tableGet(table, tableIndex);
+    int next = CompactHashing.tableGet(requireTable(), tableIndex);
     if (next == UNSET) { // uninitialized bucket
       if (newSize > mask) {
         // Resize and add new entry
         mask = resizeTable(mask, CompactHashing.newCapacity(mask), hash, newEntryIndex);
       } else {
-        CompactHashing.tableSet(table, tableIndex, newEntryIndex + 1);
+        CompactHashing.tableSet(requireTable(), tableIndex, newEntryIndex + 1);
       }
     } else {
       int entryIndex;
@@ -317,7 +371,6 @@
         if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
             && Objects.equal(key, keys[entryIndex])) {
           @SuppressWarnings("unchecked") // known to be a V
-          @Nullable
           V oldValue = (V) values[entryIndex];
 
           values[entryIndex] = value;
@@ -349,15 +402,16 @@
   /**
    * Creates a fresh entry with the specified object at the specified position in the entry arrays.
    */
-  void insertEntry(int entryIndex, @Nullable K key, @Nullable V value, int hash, int mask) {
-    this.entries[entryIndex] = CompactHashing.maskCombine(hash, UNSET, mask);
-    this.keys[entryIndex] = key;
-    this.values[entryIndex] = value;
+  void insertEntry(
+      int entryIndex, @ParametricNullness K key, @ParametricNullness V value, int hash, int mask) {
+    this.setEntry(entryIndex, CompactHashing.maskCombine(hash, UNSET, mask));
+    this.setKey(entryIndex, key);
+    this.setValue(entryIndex, value);
   }
 
   /** Resizes the entries storage if necessary. */
   private void resizeMeMaybe(int newSize) {
-    int entriesSize = entries.length;
+    int entriesSize = requireEntries().length;
     if (newSize > entriesSize) {
       // 1.5x but round up to nearest odd (this is optimal for memory consumption on Android)
       int newCapacity =
@@ -373,13 +427,13 @@
    * the current capacity.
    */
   void resizeEntries(int newCapacity) {
-    this.entries = Arrays.copyOf(entries, newCapacity);
-    this.keys = Arrays.copyOf(keys, newCapacity);
-    this.values = Arrays.copyOf(values, newCapacity);
+    this.entries = Arrays.copyOf(requireEntries(), newCapacity);
+    this.keys = Arrays.copyOf(requireKeys(), newCapacity);
+    this.values = Arrays.copyOf(requireValues(), newCapacity);
   }
 
   @CanIgnoreReturnValue
-  private int resizeTable(int mask, int newCapacity, int targetHash, int targetEntryIndex) {
+  private int resizeTable(int oldMask, int newCapacity, int targetHash, int targetEntryIndex) {
     Object newTable = CompactHashing.createTable(newCapacity);
     int newMask = newCapacity - 1;
 
@@ -388,25 +442,35 @@
       CompactHashing.tableSet(newTable, targetHash & newMask, targetEntryIndex + 1);
     }
 
-    Object table = this.table;
-    int[] entries = this.entries;
+    Object oldTable = requireTable();
+    int[] entries = requireEntries();
 
-    // Loop over current hashtable
-    for (int tableIndex = 0; tableIndex <= mask; tableIndex++) {
-      int next = CompactHashing.tableGet(table, tableIndex);
-      while (next != UNSET) {
-        int entryIndex = next - 1;
-        int entry = entries[entryIndex];
+    // Loop over `oldTable` to construct its replacement, ``newTable`. The entries do not move, so
+    // the `keys` and `values` arrays do not need to change. But because the "short hash" now has a
+    // different number of bits, we must rewrite each element of `entries` so that its contribution
+    // to the full hashcode reflects the change, and so that its `next` link corresponds to the new
+    // linked list of entries with the new short hash.
+    for (int oldTableIndex = 0; oldTableIndex <= oldMask; oldTableIndex++) {
+      int oldNext = CompactHashing.tableGet(oldTable, oldTableIndex);
+      // Each element of `oldTable` is the head of a (possibly empty) linked list of elements in
+      // `entries`. The `oldNext` loop is going to traverse that linked list.
+      // We need to rewrite the `next` link of each of the elements so that it is in the appropriate
+      // linked list starting from `newTable`. In general, each element from the old linked list
+      // belongs to a different linked list from `newTable`. We insert each element in turn at the
+      // head of its appropriate `newTable` linked list.
+      while (oldNext != UNSET) {
+        int entryIndex = oldNext - 1;
+        int oldEntry = entries[entryIndex];
 
-        // Rebuild hash using entry hashPrefix and tableIndex ("hashSuffix")
-        int hash = CompactHashing.getHashPrefix(entry, mask) | tableIndex;
+        // Rebuild the full 32-bit hash using entry hashPrefix and oldTableIndex ("hashSuffix").
+        int hash = CompactHashing.getHashPrefix(oldEntry, oldMask) | oldTableIndex;
 
         int newTableIndex = hash & newMask;
         int newNext = CompactHashing.tableGet(newTable, newTableIndex);
-        CompactHashing.tableSet(newTable, newTableIndex, next);
+        CompactHashing.tableSet(newTable, newTableIndex, oldNext);
         entries[entryIndex] = CompactHashing.maskCombine(hash, newNext, newMask);
 
-        next = CompactHashing.getNext(entry, mask);
+        oldNext = CompactHashing.getNext(oldEntry, oldMask);
       }
     }
 
@@ -415,22 +479,22 @@
     return newMask;
   }
 
-  private int indexOf(@Nullable Object key) {
+  private int indexOf(@CheckForNull Object key) {
     if (needsAllocArrays()) {
       return -1;
     }
     int hash = smearedHash(key);
     int mask = hashTableMask();
-    int next = CompactHashing.tableGet(table, hash & mask);
+    int next = CompactHashing.tableGet(requireTable(), hash & mask);
     if (next == UNSET) {
       return -1;
     }
     int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
     do {
       int entryIndex = next - 1;
-      int entry = entries[entryIndex];
+      int entry = entry(entryIndex);
       if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
-          && Objects.equal(key, keys[entryIndex])) {
+          && Objects.equal(key, key(entryIndex))) {
         return entryIndex;
       }
       next = CompactHashing.getNext(entry, mask);
@@ -439,15 +503,15 @@
   }
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
-    @Nullable Map<K, V> delegate = delegateOrNull();
+  public boolean containsKey(@CheckForNull Object key) {
+    Map<K, V> delegate = delegateOrNull();
     return (delegate != null) ? delegate.containsKey(key) : indexOf(key) != -1;
   }
 
-  @SuppressWarnings("unchecked") // known to be a V
   @Override
-  public V get(@Nullable Object key) {
-    @Nullable Map<K, V> delegate = delegateOrNull();
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.get(key);
     }
@@ -456,14 +520,15 @@
       return null;
     }
     accessEntry(index);
-    return (V) values[index];
+    return value(index);
   }
 
   @CanIgnoreReturnValue
   @SuppressWarnings("unchecked") // known to be a V
   @Override
-  public @Nullable V remove(@Nullable Object key) {
-    @Nullable Map<K, V> delegate = delegateOrNull();
+  @CheckForNull
+  public V remove(@CheckForNull Object key) {
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.remove(key);
     }
@@ -471,19 +536,25 @@
     return (oldValue == NOT_FOUND) ? null : (V) oldValue;
   }
 
-  private @Nullable Object removeHelper(@Nullable Object key) {
+  private @Nullable Object removeHelper(@CheckForNull Object key) {
     if (needsAllocArrays()) {
       return NOT_FOUND;
     }
     int mask = hashTableMask();
     int index =
         CompactHashing.remove(
-            key, /* value= */ null, mask, table, entries, keys, /* values= */ null);
+            key,
+            /* value= */ null,
+            mask,
+            requireTable(),
+            requireEntries(),
+            requireKeys(),
+            /* values= */ null);
     if (index == -1) {
       return NOT_FOUND;
     }
 
-    @Nullable Object oldValue = values[index];
+    Object oldValue = value(index);
 
     moveLastEntry(index, mask);
     size--;
@@ -496,10 +567,14 @@
    * Moves the last entry in the entry array into {@code dstIndex}, and nulls out its old position.
    */
   void moveLastEntry(int dstIndex, int mask) {
+    Object table = requireTable();
+    int[] entries = requireEntries();
+    @Nullable Object[] keys = requireKeys();
+    @Nullable Object[] values = requireValues();
     int srcIndex = size() - 1;
     if (dstIndex < srcIndex) {
       // move last entry to deleted spot
-      @Nullable Object key = keys[srcIndex];
+      Object key = keys[srcIndex];
       keys[dstIndex] = key;
       values[dstIndex] = values[srcIndex];
       keys[srcIndex] = null;
@@ -552,7 +627,7 @@
     return indexBeforeRemove - 1;
   }
 
-  private abstract class Itr<T> implements Iterator<T> {
+  private abstract class Itr<T extends @Nullable Object> implements Iterator<T> {
     int expectedMetadata = metadata;
     int currentIndex = firstEntryIndex();
     int indexToRemove = -1;
@@ -562,9 +637,11 @@
       return currentIndex >= 0;
     }
 
+    @ParametricNullness
     abstract T getOutput(int entry);
 
     @Override
+    @ParametricNullness
     public T next() {
       checkForConcurrentModification();
       if (!hasNext()) {
@@ -581,7 +658,7 @@
       checkForConcurrentModification();
       checkRemove(indexToRemove >= 0);
       incrementExpectedModCount();
-      CompactHashMap.this.remove(keys[indexToRemove]);
+      CompactHashMap.this.remove(key(indexToRemove));
       currentIndex = adjustAfterRemove(currentIndex, indexToRemove);
       indexToRemove = -1;
     }
@@ -597,21 +674,20 @@
     }
   }
 
-  @SuppressWarnings("unchecked") // known to be Ks and Vs
   @Override
   public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
     checkNotNull(function);
-    @Nullable Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       delegate.replaceAll(function);
     } else {
       for (int i = 0; i < size; i++) {
-        values[i] = function.apply((K) keys[i], (V) values[i]);
+        setValue(i, function.apply(key(i), value(i)));
       }
     }
   }
 
-  private transient @Nullable Set<K> keySetView;
+  @CheckForNull private transient Set<K> keySetView;
 
   @Override
   public Set<K> keySet() {
@@ -629,33 +705,35 @@
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       if (needsAllocArrays()) {
         return new Object[0];
       }
-      @Nullable Map<K, V> delegate = delegateOrNull();
+      Map<K, V> delegate = delegateOrNull();
       return (delegate != null)
           ? delegate.keySet().toArray()
-          : ObjectArrays.copyAsObjectArray(keys, 0, size);
+          : ObjectArrays.copyAsObjectArray(requireKeys(), 0, size);
     }
 
     @Override
-    public <T> T[] toArray(T[] a) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] a) {
       if (needsAllocArrays()) {
         if (a.length > 0) {
-          a[0] = null;
+          @Nullable Object[] unsoundlyCovariantArray = a;
+          unsoundlyCovariantArray[0] = null;
         }
         return a;
       }
-      @Nullable Map<K, V> delegate = delegateOrNull();
+      Map<K, V> delegate = delegateOrNull();
       return (delegate != null)
           ? delegate.keySet().toArray(a)
-          : ObjectArrays.toArrayImpl(keys, 0, size, a);
+          : ObjectArrays.toArrayImpl(requireKeys(), 0, size, a);
     }
 
     @Override
-    public boolean remove(@Nullable Object o) {
-      @Nullable Map<K, V> delegate = delegateOrNull();
+    public boolean remove(@CheckForNull Object o) {
+      Map<K, V> delegate = delegateOrNull();
       return (delegate != null)
           ? delegate.keySet().remove(o)
           : CompactHashMap.this.removeHelper(o) != NOT_FOUND;
@@ -671,56 +749,55 @@
       if (needsAllocArrays()) {
         return Spliterators.spliterator(new Object[0], Spliterator.DISTINCT | Spliterator.ORDERED);
       }
-      @Nullable Map<K, V> delegate = delegateOrNull();
+      Map<K, V> delegate = delegateOrNull();
       return (delegate != null)
           ? delegate.keySet().spliterator()
-          : Spliterators.spliterator(keys, 0, size, Spliterator.DISTINCT | Spliterator.ORDERED);
+          : Spliterators.spliterator(
+              requireKeys(), 0, size, Spliterator.DISTINCT | Spliterator.ORDERED);
     }
 
-    @SuppressWarnings("unchecked") // known to be Ks
     @Override
     public void forEach(Consumer<? super K> action) {
       checkNotNull(action);
-      @Nullable Map<K, V> delegate = delegateOrNull();
+      Map<K, V> delegate = delegateOrNull();
       if (delegate != null) {
         delegate.keySet().forEach(action);
       } else {
         for (int i = firstEntryIndex(); i >= 0; i = getSuccessor(i)) {
-          action.accept((K) keys[i]);
+          action.accept(key(i));
         }
       }
     }
   }
 
   Iterator<K> keySetIterator() {
-    @Nullable Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.keySet().iterator();
     }
     return new Itr<K>() {
-      @SuppressWarnings("unchecked") // known to be a K
       @Override
+      @ParametricNullness
       K getOutput(int entry) {
-        return (K) keys[entry];
+        return key(entry);
       }
     };
   }
 
-  @SuppressWarnings("unchecked") // known to be Ks and Vs
   @Override
   public void forEach(BiConsumer<? super K, ? super V> action) {
     checkNotNull(action);
-    @Nullable Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       delegate.forEach(action);
     } else {
       for (int i = firstEntryIndex(); i >= 0; i = getSuccessor(i)) {
-        action.accept((K) keys[i], (V) values[i]);
+        action.accept(key(i), value(i));
       }
     }
   }
 
-  private transient @Nullable Set<Entry<K, V>> entrySetView;
+  @CheckForNull private transient Set<Entry<K, V>> entrySetView;
 
   @Override
   public Set<Entry<K, V>> entrySet() {
@@ -745,7 +822,7 @@
 
     @Override
     public Spliterator<Entry<K, V>> spliterator() {
-      @Nullable Map<K, V> delegate = delegateOrNull();
+      Map<K, V> delegate = delegateOrNull();
       return (delegate != null)
           ? delegate.entrySet().spliterator()
           : CollectSpliterators.indexed(
@@ -753,21 +830,21 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object o) {
-      @Nullable Map<K, V> delegate = delegateOrNull();
+    public boolean contains(@CheckForNull Object o) {
+      Map<K, V> delegate = delegateOrNull();
       if (delegate != null) {
         return delegate.entrySet().contains(o);
       } else if (o instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) o;
         int index = indexOf(entry.getKey());
-        return index != -1 && Objects.equal(values[index], entry.getValue());
+        return index != -1 && Objects.equal(value(index), entry.getValue());
       }
       return false;
     }
 
     @Override
-    public boolean remove(@Nullable Object o) {
-      @Nullable Map<K, V> delegate = delegateOrNull();
+    public boolean remove(@CheckForNull Object o) {
+      Map<K, V> delegate = delegateOrNull();
       if (delegate != null) {
         return delegate.entrySet().remove(o);
       } else if (o instanceof Entry) {
@@ -778,7 +855,13 @@
         int mask = hashTableMask();
         int index =
             CompactHashing.remove(
-                entry.getKey(), entry.getValue(), mask, table, entries, keys, values);
+                entry.getKey(),
+                entry.getValue(),
+                mask,
+                requireTable(),
+                requireEntries(),
+                requireKeys(),
+                requireValues());
         if (index == -1) {
           return false;
         }
@@ -794,7 +877,7 @@
   }
 
   Iterator<Entry<K, V>> entrySetIterator() {
-    @Nullable Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.entrySet().iterator();
     }
@@ -807,18 +890,17 @@
   }
 
   final class MapEntry extends AbstractMapEntry<K, V> {
-    private final @Nullable K key;
+    @ParametricNullness private final K key;
 
     private int lastKnownIndex;
 
-    @SuppressWarnings("unchecked") // known to be a K
     MapEntry(int index) {
-      this.key = (K) keys[index];
+      this.key = key(index);
       this.lastKnownIndex = index;
     }
 
-    @Nullable
     @Override
+    @ParametricNullness
     public K getKey() {
       return key;
     }
@@ -826,36 +908,48 @@
     private void updateLastKnownIndex() {
       if (lastKnownIndex == -1
           || lastKnownIndex >= size()
-          || !Objects.equal(key, keys[lastKnownIndex])) {
+          || !Objects.equal(key, key(lastKnownIndex))) {
         lastKnownIndex = indexOf(key);
       }
     }
 
-    @SuppressWarnings("unchecked") // known to be a V
     @Override
-    public @Nullable V getValue() {
-      @Nullable Map<K, V> delegate = delegateOrNull();
+    @ParametricNullness
+    public V getValue() {
+      Map<K, V> delegate = delegateOrNull();
       if (delegate != null) {
-        return delegate.get(key);
+        /*
+         * The cast is safe because the entry is present in the map. Or, if it has been removed by a
+         * concurrent modification, behavior is undefined.
+         */
+        return uncheckedCastNullableTToT(delegate.get(key));
       }
       updateLastKnownIndex();
-      return (lastKnownIndex == -1) ? null : (V) values[lastKnownIndex];
+      /*
+       * If the entry has been removed from the map, we return null, even though that might not be a
+       * valid value. That's the best we can do, short of holding a reference to the most recently
+       * seen value. And while we *could* do that, we aren't required to: Map.Entry explicitly says
+       * that behavior is undefined when the backing map is modified through another API. (It even
+       * permits us to throw IllegalStateException. Maybe we should have done that, but we probably
+       * shouldn't change now for fear of breaking people.)
+       */
+      return (lastKnownIndex == -1) ? unsafeNull() : value(lastKnownIndex);
     }
 
-    @SuppressWarnings("unchecked") // known to be a V
     @Override
-    public V setValue(V value) {
-      @Nullable Map<K, V> delegate = delegateOrNull();
+    @ParametricNullness
+    public V setValue(@ParametricNullness V value) {
+      Map<K, V> delegate = delegateOrNull();
       if (delegate != null) {
-        return delegate.put(key, value);
+        return uncheckedCastNullableTToT(delegate.put(key, value)); // See discussion in getValue().
       }
       updateLastKnownIndex();
       if (lastKnownIndex == -1) {
         put(key, value);
-        return null;
+        return unsafeNull(); // See discussion in getValue().
       } else {
-        V old = (V) values[lastKnownIndex];
-        values[lastKnownIndex] = value;
+        V old = value(lastKnownIndex);
+        CompactHashMap.this.setValue(lastKnownIndex, value);
         return old;
       }
     }
@@ -863,7 +957,7 @@
 
   @Override
   public int size() {
-    @Nullable Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     return (delegate != null) ? delegate.size() : size;
   }
 
@@ -873,20 +967,20 @@
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
-    @Nullable Map<K, V> delegate = delegateOrNull();
+  public boolean containsValue(@CheckForNull Object value) {
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.containsValue(value);
     }
     for (int i = 0; i < size; i++) {
-      if (Objects.equal(value, values[i])) {
+      if (Objects.equal(value, value(i))) {
         return true;
       }
     }
     return false;
   }
 
-  private transient @Nullable Collection<V> valuesView;
+  @CheckForNull private transient Collection<V> valuesView;
 
   @Override
   public Collection<V> values() {
@@ -908,16 +1002,15 @@
       return valuesIterator();
     }
 
-    @SuppressWarnings("unchecked") // known to be Vs
     @Override
     public void forEach(Consumer<? super V> action) {
       checkNotNull(action);
-      @Nullable Map<K, V> delegate = delegateOrNull();
+      Map<K, V> delegate = delegateOrNull();
       if (delegate != null) {
         delegate.values().forEach(action);
       } else {
         for (int i = firstEntryIndex(); i >= 0; i = getSuccessor(i)) {
-          action.accept((V) values[i]);
+          action.accept(value(i));
         }
       }
     }
@@ -927,48 +1020,50 @@
       if (needsAllocArrays()) {
         return Spliterators.spliterator(new Object[0], Spliterator.ORDERED);
       }
-      @Nullable Map<K, V> delegate = delegateOrNull();
+      Map<K, V> delegate = delegateOrNull();
       return (delegate != null)
           ? delegate.values().spliterator()
-          : Spliterators.spliterator(values, 0, size, Spliterator.ORDERED);
+          : Spliterators.spliterator(requireValues(), 0, size, Spliterator.ORDERED);
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       if (needsAllocArrays()) {
         return new Object[0];
       }
-      @Nullable Map<K, V> delegate = delegateOrNull();
+      Map<K, V> delegate = delegateOrNull();
       return (delegate != null)
           ? delegate.values().toArray()
-          : ObjectArrays.copyAsObjectArray(values, 0, size);
+          : ObjectArrays.copyAsObjectArray(requireValues(), 0, size);
     }
 
     @Override
-    public <T> T[] toArray(T[] a) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] a) {
       if (needsAllocArrays()) {
         if (a.length > 0) {
-          a[0] = null;
+          @Nullable Object[] unsoundlyCovariantArray = a;
+          unsoundlyCovariantArray[0] = null;
         }
         return a;
       }
-      @Nullable Map<K, V> delegate = delegateOrNull();
+      Map<K, V> delegate = delegateOrNull();
       return (delegate != null)
           ? delegate.values().toArray(a)
-          : ObjectArrays.toArrayImpl(values, 0, size, a);
+          : ObjectArrays.toArrayImpl(requireValues(), 0, size, a);
     }
   }
 
   Iterator<V> valuesIterator() {
-    @Nullable Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.values().iterator();
     }
     return new Itr<V>() {
-      @SuppressWarnings("unchecked") // known to be a V
       @Override
+      @ParametricNullness
       V getOutput(int entry) {
-        return (V) values[entry];
+        return value(entry);
       }
     };
   }
@@ -981,7 +1076,7 @@
     if (needsAllocArrays()) {
       return;
     }
-    @Nullable Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       Map<K, V> newDelegate = createHashFloodingResistantDelegate(size());
       newDelegate.putAll(delegate);
@@ -989,7 +1084,7 @@
       return;
     }
     int size = this.size;
-    if (size < entries.length) {
+    if (size < requireEntries().length) {
       resizeEntries(size);
     }
     int minimumTableSize = CompactHashing.tableSize(size);
@@ -1005,7 +1100,7 @@
       return;
     }
     incrementModCount();
-    @Nullable Map<K, V> delegate = delegateOrNull();
+    Map<K, V> delegate = delegateOrNull();
     if (delegate != null) {
       metadata =
           Ints.constrainToRange(size(), CompactHashing.DEFAULT_SIZE, CompactHashing.MAX_SIZE);
@@ -1013,10 +1108,10 @@
       table = null;
       size = 0;
     } else {
-      Arrays.fill(keys, 0, size, null);
-      Arrays.fill(values, 0, size, null);
-      CompactHashing.tableClear(table);
-      Arrays.fill(entries, 0, size, 0);
+      Arrays.fill(requireKeys(), 0, size, null);
+      Arrays.fill(requireValues(), 0, size, null);
+      CompactHashing.tableClear(requireTable());
+      Arrays.fill(requireEntries(), 0, size, 0);
       this.size = 0;
     }
   }
@@ -1046,4 +1141,66 @@
       put(key, value);
     }
   }
+
+  /*
+   * The following methods are safe to call as long as both of the following hold:
+   *
+   * - allocArrays() has been called. Callers can confirm this by checking needsAllocArrays().
+   *
+   * - The map has not switched to delegating to a java.util implementation to mitigate hash
+   *   flooding. Callers can confirm this by null-checking delegateOrNull().
+   *
+   * In an ideal world, we would document why we know those things are true every time we call these
+   * methods. But that is a bit too painful....
+   */
+
+  private Object requireTable() {
+    return requireNonNull(table);
+  }
+
+  private int[] requireEntries() {
+    return requireNonNull(entries);
+  }
+
+  private @Nullable Object[] requireKeys() {
+    return requireNonNull(keys);
+  }
+
+  private @Nullable Object[] requireValues() {
+    return requireNonNull(values);
+  }
+
+  /*
+   * The following methods are safe to call as long as the conditions in the *previous* comment are
+   * met *and* the index is less than size().
+   *
+   * (The above explains when these methods are safe from a `nullness` perspective. From an
+   * `unchecked` perspective, they're safe because we put only K/V elements into each array.)
+   */
+
+  @SuppressWarnings("unchecked")
+  private K key(int i) {
+    return (K) requireKeys()[i];
+  }
+
+  @SuppressWarnings("unchecked")
+  private V value(int i) {
+    return (V) requireValues()[i];
+  }
+
+  private int entry(int i) {
+    return requireEntries()[i];
+  }
+
+  private void setKey(int i, K key) {
+    requireKeys()[i] = key;
+  }
+
+  private void setValue(int i, V value) {
+    requireValues()[i] = value;
+  }
+
+  private void setEntry(int i, int value) {
+    requireEntries()[i] = value;
+  }
 }
diff --git a/guava/src/com/google/common/collect/CompactHashSet.java b/guava/src/com/google/common/collect/CompactHashSet.java
index d54e166..2cfcf0a 100644
--- a/guava/src/com/google/common/collect/CompactHashSet.java
+++ b/guava/src/com/google/common/collect/CompactHashSet.java
@@ -20,6 +20,7 @@
 import static com.google.common.collect.CollectPreconditions.checkRemove;
 import static com.google.common.collect.CompactHashing.UNSET;
 import static com.google.common.collect.Hashing.smearedHash;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -44,6 +45,7 @@
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.function.Consumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -74,11 +76,12 @@
  * @author Jon Noack
  */
 @GwtIncompatible // not worth using in GWT for now
-class CompactHashSet<E> extends AbstractSet<E> implements Serializable {
+@ElementTypesAreNonnullByDefault
+class CompactHashSet<E extends @Nullable Object> extends AbstractSet<E> implements Serializable {
   // TODO(user): cache all field accesses in local vars
 
   /** Creates an empty {@code CompactHashSet} instance. */
-  public static <E> CompactHashSet<E> create() {
+  public static <E extends @Nullable Object> CompactHashSet<E> create() {
     return new CompactHashSet<>();
   }
 
@@ -89,7 +92,8 @@
    * @param collection the elements that the set should contain
    * @return a new {@code CompactHashSet} containing those elements (minus duplicates)
    */
-  public static <E> CompactHashSet<E> create(Collection<? extends E> collection) {
+  public static <E extends @Nullable Object> CompactHashSet<E> create(
+      Collection<? extends E> collection) {
     CompactHashSet<E> set = createWithExpectedSize(collection.size());
     set.addAll(collection);
     return set;
@@ -103,7 +107,7 @@
    * @return a new {@code CompactHashSet} containing those elements (minus duplicates)
    */
   @SafeVarargs
-  public static <E> CompactHashSet<E> create(E... elements) {
+  public static <E extends @Nullable Object> CompactHashSet<E> create(E... elements) {
     CompactHashSet<E> set = createWithExpectedSize(elements.length);
     Collections.addAll(set, elements);
     return set;
@@ -118,7 +122,8 @@
    *     elements without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <E> CompactHashSet<E> createWithExpectedSize(int expectedSize) {
+  public static <E extends @Nullable Object> CompactHashSet<E> createWithExpectedSize(
+      int expectedSize) {
     return new CompactHashSet<>(expectedSize);
   }
 
@@ -136,6 +141,10 @@
    */
   private static final int MAX_HASH_BUCKET_LENGTH = 9;
 
+  // See CompactHashMap for a detailed description of how the following fields work. That
+  // description talks about `keys`, `values`, and `entries`; here the `keys` and `values` arrays
+  // are replaced by a single `elements` array but everything else works similarly.
+
   /**
    * The hashtable object. This can be either:
    *
@@ -155,7 +164,7 @@
    *   <li>null, if no entries have yet been added to the map
    * </ul>
    */
-  @Nullable private transient Object table;
+  @CheckForNull private transient Object table;
 
   /**
    * Contains the logical entries, in the range of [0, size()). The high bits of each int are the
@@ -165,20 +174,20 @@
    *
    * <pre>
    * hash  = aaaaaaaa
-   * mask  = 0000ffff
-   * next  = 0000bbbb
-   * entry = aaaabbbb
+   * mask  = 00000fff
+   * next  = 00000bbb
+   * entry = aaaaabbb
    * </pre>
    *
    * <p>The pointers in [size(), entries.length) are all "null" (UNSET).
    */
-  private transient int @Nullable [] entries;
+  @CheckForNull private transient int[] entries;
 
   /**
    * The elements contained in the set, in the range of [0, size()). The elements in [size(),
    * elements.length) are all {@code null}.
    */
-  @VisibleForTesting transient Object @Nullable [] elements;
+  @VisibleForTesting @CheckForNull transient @Nullable Object[] elements;
 
   /**
    * Keeps track of metadata like the number of hash table bits and modifications of this data
@@ -237,7 +246,7 @@
 
   @SuppressWarnings("unchecked")
   @VisibleForTesting
-  @Nullable
+  @CheckForNull
   Set<E> delegateOrNull() {
     if (table instanceof Set) {
       return (Set<E>) table;
@@ -249,13 +258,12 @@
     return new LinkedHashSet<>(tableSize, 1.0f);
   }
 
-  @SuppressWarnings("unchecked")
   @VisibleForTesting
   @CanIgnoreReturnValue
   Set<E> convertToHashFloodingResistantImplementation() {
     Set<E> newDelegate = createHashFloodingResistantDelegate(hashTableMask() + 1);
     for (int i = firstEntryIndex(); i >= 0; i = getSuccessor(i)) {
-      newDelegate.add((E) elements[i]);
+      newDelegate.add(element(i));
     }
     this.table = newDelegate;
     this.entries = null;
@@ -287,29 +295,29 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean add(@Nullable E object) {
+  public boolean add(@ParametricNullness E object) {
     if (needsAllocArrays()) {
       allocArrays();
     }
-    @Nullable Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.add(object);
     }
-    int[] entries = this.entries;
-    Object[] elements = this.elements;
+    int[] entries = requireEntries();
+    @Nullable Object[] elements = requireElements();
 
     int newEntryIndex = this.size; // current size, and pointer to the entry to be appended
     int newSize = newEntryIndex + 1;
     int hash = smearedHash(object);
     int mask = hashTableMask();
     int tableIndex = hash & mask;
-    int next = CompactHashing.tableGet(table, tableIndex);
+    int next = CompactHashing.tableGet(requireTable(), tableIndex);
     if (next == UNSET) { // uninitialized bucket
       if (newSize > mask) {
         // Resize and add new entry
         mask = resizeTable(mask, CompactHashing.newCapacity(mask), hash, newEntryIndex);
       } else {
-        CompactHashing.tableSet(table, tableIndex, newEntryIndex + 1);
+        CompactHashing.tableSet(requireTable(), tableIndex, newEntryIndex + 1);
       }
     } else {
       int entryIndex;
@@ -348,14 +356,14 @@
   /**
    * Creates a fresh entry with the specified object at the specified position in the entry arrays.
    */
-  void insertEntry(int entryIndex, @Nullable E object, int hash, int mask) {
-    this.entries[entryIndex] = CompactHashing.maskCombine(hash, UNSET, mask);
-    this.elements[entryIndex] = object;
+  void insertEntry(int entryIndex, @ParametricNullness E object, int hash, int mask) {
+    setEntry(entryIndex, CompactHashing.maskCombine(hash, UNSET, mask));
+    setElement(entryIndex, object);
   }
 
   /** Resizes the entries storage if necessary. */
   private void resizeMeMaybe(int newSize) {
-    int entriesSize = entries.length;
+    int entriesSize = requireEntries().length;
     if (newSize > entriesSize) {
       // 1.5x but round up to nearest odd (this is optimal for memory consumption on Android)
       int newCapacity =
@@ -371,12 +379,12 @@
    * the current capacity.
    */
   void resizeEntries(int newCapacity) {
-    this.entries = Arrays.copyOf(entries, newCapacity);
-    this.elements = Arrays.copyOf(elements, newCapacity);
+    this.entries = Arrays.copyOf(requireEntries(), newCapacity);
+    this.elements = Arrays.copyOf(requireElements(), newCapacity);
   }
 
   @CanIgnoreReturnValue
-  private int resizeTable(int mask, int newCapacity, int targetHash, int targetEntryIndex) {
+  private int resizeTable(int oldMask, int newCapacity, int targetHash, int targetEntryIndex) {
     Object newTable = CompactHashing.createTable(newCapacity);
     int newMask = newCapacity - 1;
 
@@ -385,25 +393,25 @@
       CompactHashing.tableSet(newTable, targetHash & newMask, targetEntryIndex + 1);
     }
 
-    Object table = this.table;
-    int[] entries = this.entries;
+    Object oldTable = requireTable();
+    int[] entries = requireEntries();
 
     // Loop over current hashtable
-    for (int tableIndex = 0; tableIndex <= mask; tableIndex++) {
-      int next = CompactHashing.tableGet(table, tableIndex);
-      while (next != UNSET) {
-        int entryIndex = next - 1;
-        int entry = entries[entryIndex];
+    for (int oldTableIndex = 0; oldTableIndex <= oldMask; oldTableIndex++) {
+      int oldNext = CompactHashing.tableGet(oldTable, oldTableIndex);
+      while (oldNext != UNSET) {
+        int entryIndex = oldNext - 1;
+        int oldEntry = entries[entryIndex];
 
         // Rebuild hash using entry hashPrefix and tableIndex ("hashSuffix")
-        int hash = CompactHashing.getHashPrefix(entry, mask) | tableIndex;
+        int hash = CompactHashing.getHashPrefix(oldEntry, oldMask) | oldTableIndex;
 
         int newTableIndex = hash & newMask;
         int newNext = CompactHashing.tableGet(newTable, newTableIndex);
-        CompactHashing.tableSet(newTable, newTableIndex, next);
+        CompactHashing.tableSet(newTable, newTableIndex, oldNext);
         entries[entryIndex] = CompactHashing.maskCombine(hash, newNext, newMask);
 
-        next = CompactHashing.getNext(entry, mask);
+        oldNext = CompactHashing.getNext(oldEntry, oldMask);
       }
     }
 
@@ -413,26 +421,26 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object object) {
+  public boolean contains(@CheckForNull Object object) {
     if (needsAllocArrays()) {
       return false;
     }
-    @Nullable Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.contains(object);
     }
     int hash = smearedHash(object);
     int mask = hashTableMask();
-    int next = CompactHashing.tableGet(table, hash & mask);
+    int next = CompactHashing.tableGet(requireTable(), hash & mask);
     if (next == UNSET) {
       return false;
     }
     int hashPrefix = CompactHashing.getHashPrefix(hash, mask);
     do {
       int entryIndex = next - 1;
-      int entry = entries[entryIndex];
+      int entry = entry(entryIndex);
       if (CompactHashing.getHashPrefix(entry, mask) == hashPrefix
-          && Objects.equal(object, elements[entryIndex])) {
+          && Objects.equal(object, element(entryIndex))) {
         return true;
       }
       next = CompactHashing.getNext(entry, mask);
@@ -442,18 +450,24 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean remove(@Nullable Object object) {
+  public boolean remove(@CheckForNull Object object) {
     if (needsAllocArrays()) {
       return false;
     }
-    @Nullable Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.remove(object);
     }
     int mask = hashTableMask();
     int index =
         CompactHashing.remove(
-            object, /* value= */ null, mask, table, entries, elements, /* values= */ null);
+            object,
+            /* value= */ null,
+            mask,
+            requireTable(),
+            requireEntries(),
+            requireElements(),
+            /* values= */ null);
     if (index == -1) {
       return false;
     }
@@ -469,10 +483,13 @@
    * Moves the last entry in the entry array into {@code dstIndex}, and nulls out its old position.
    */
   void moveLastEntry(int dstIndex, int mask) {
+    Object table = requireTable();
+    int[] entries = requireEntries();
+    @Nullable Object[] elements = requireElements();
     int srcIndex = size() - 1;
     if (dstIndex < srcIndex) {
       // move last entry to deleted spot
-      @Nullable Object object = elements[srcIndex];
+      Object object = elements[srcIndex];
       elements[dstIndex] = object;
       elements[srcIndex] = null;
 
@@ -524,7 +541,7 @@
 
   @Override
   public Iterator<E> iterator() {
-    @Nullable Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       return delegate.iterator();
     }
@@ -538,15 +555,15 @@
         return currentIndex >= 0;
       }
 
-      @SuppressWarnings("unchecked") // known to be Es
       @Override
+      @ParametricNullness
       public E next() {
         checkForConcurrentModification();
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
         indexToRemove = currentIndex;
-        E result = (E) elements[currentIndex];
+        E result = element(currentIndex);
         currentIndex = getSuccessor(currentIndex);
         return result;
       }
@@ -556,7 +573,7 @@
         checkForConcurrentModification();
         checkRemove(indexToRemove >= 0);
         incrementExpectedModCount();
-        CompactHashSet.this.remove(elements[indexToRemove]);
+        CompactHashSet.this.remove(element(indexToRemove));
         currentIndex = adjustAfterRemove(currentIndex, indexToRemove);
         indexToRemove = -1;
       }
@@ -578,29 +595,29 @@
     if (needsAllocArrays()) {
       return Spliterators.spliterator(new Object[0], Spliterator.DISTINCT | Spliterator.ORDERED);
     }
-    @Nullable Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     return (delegate != null)
         ? delegate.spliterator()
-        : Spliterators.spliterator(elements, 0, size, Spliterator.DISTINCT | Spliterator.ORDERED);
+        : Spliterators.spliterator(
+            requireElements(), 0, size, Spliterator.DISTINCT | Spliterator.ORDERED);
   }
 
-  @SuppressWarnings("unchecked") // known to be Es
   @Override
   public void forEach(Consumer<? super E> action) {
     checkNotNull(action);
-    @Nullable Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       delegate.forEach(action);
     } else {
       for (int i = firstEntryIndex(); i >= 0; i = getSuccessor(i)) {
-        action.accept((E) elements[i]);
+        action.accept(element(i));
       }
     }
   }
 
   @Override
   public int size() {
-    @Nullable Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     return (delegate != null) ? delegate.size() : size;
   }
 
@@ -610,27 +627,28 @@
   }
 
   @Override
-  public Object[] toArray() {
+  public @Nullable Object[] toArray() {
     if (needsAllocArrays()) {
       return new Object[0];
     }
-    @Nullable Set<E> delegate = delegateOrNull();
-    return (delegate != null) ? delegate.toArray() : Arrays.copyOf(elements, size);
+    Set<E> delegate = delegateOrNull();
+    return (delegate != null) ? delegate.toArray() : Arrays.copyOf(requireElements(), size);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public <T> T[] toArray(T[] a) {
+  @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+  public <T extends @Nullable Object> T[] toArray(T[] a) {
     if (needsAllocArrays()) {
       if (a.length > 0) {
         a[0] = null;
       }
       return a;
     }
-    @Nullable Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     return (delegate != null)
         ? delegate.toArray(a)
-        : ObjectArrays.toArrayImpl(elements, 0, size, a);
+        : ObjectArrays.toArrayImpl(requireElements(), 0, size, a);
   }
 
   /**
@@ -641,7 +659,7 @@
     if (needsAllocArrays()) {
       return;
     }
-    @Nullable Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       Set<E> newDelegate = createHashFloodingResistantDelegate(size());
       newDelegate.addAll(delegate);
@@ -649,7 +667,7 @@
       return;
     }
     int size = this.size;
-    if (size < entries.length) {
+    if (size < requireEntries().length) {
       resizeEntries(size);
     }
     int minimumTableSize = CompactHashing.tableSize(size);
@@ -665,7 +683,7 @@
       return;
     }
     incrementModCount();
-    @Nullable Set<E> delegate = delegateOrNull();
+    Set<E> delegate = delegateOrNull();
     if (delegate != null) {
       metadata =
           Ints.constrainToRange(size(), CompactHashing.DEFAULT_SIZE, CompactHashing.MAX_SIZE);
@@ -673,9 +691,9 @@
       table = null;
       size = 0;
     } else {
-      Arrays.fill(elements, 0, size, null);
-      CompactHashing.tableClear(table);
-      Arrays.fill(entries, 0, size, 0);
+      Arrays.fill(requireElements(), 0, size, null);
+      CompactHashing.tableClear(requireTable());
+      Arrays.fill(requireEntries(), 0, size, 0);
       this.size = 0;
     }
   }
@@ -701,4 +719,38 @@
       add(element);
     }
   }
+
+  /*
+   * For discussion of the safety of the following methods, see the comments near the end of
+   * CompactHashMap.
+   */
+
+  private Object requireTable() {
+    return requireNonNull(table);
+  }
+
+  private int[] requireEntries() {
+    return requireNonNull(entries);
+  }
+
+  private @Nullable Object[] requireElements() {
+    return requireNonNull(elements);
+  }
+
+  @SuppressWarnings("unchecked")
+  private E element(int i) {
+    return (E) requireElements()[i];
+  }
+
+  private int entry(int i) {
+    return requireEntries()[i];
+  }
+
+  private void setElement(int i, E value) {
+    requireElements()[i] = value;
+  }
+
+  private void setEntry(int i, int value) {
+    requireEntries()[i] = value;
+  }
 }
diff --git a/guava/src/com/google/common/collect/CompactHashing.java b/guava/src/com/google/common/collect/CompactHashing.java
index 3444aeb..a8fe902 100644
--- a/guava/src/com/google/common/collect/CompactHashing.java
+++ b/guava/src/com/google/common/collect/CompactHashing.java
@@ -20,6 +20,7 @@
 import com.google.common.base.Objects;
 import com.google.common.primitives.Ints;
 import java.util.Arrays;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -28,6 +29,7 @@
  * @author Jon Noack
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class CompactHashing {
   private CompactHashing() {}
 
@@ -96,6 +98,11 @@
     }
   }
 
+  /**
+   * Returns {@code table[index]}, where {@code table} is actually a {@code byte[]}, {@code
+   * short[]}, or {@code int[]}. When it is a {@code byte[]} or {@code short[]}, the returned value
+   * is unsigned, so the range of possible returned values is 0–255 or 0–65535, respectively.
+   */
   static int tableGet(Object table, int index) {
     if (table instanceof byte[]) {
       return ((byte[]) table)[index] & BYTE_MASK; // unsigned read
@@ -106,6 +113,13 @@
     }
   }
 
+  /**
+   * Sets {@code table[index]} to {@code entry}, where {@code table} is actually a {@code byte[]},
+   * {@code short[]}, or {@code int[]}. The value of {@code entry} should fit in the size of the
+   * assigned array element, when seen as an unsigned value. So if {@code table} is a {@code byte[]}
+   * then we should have {@code 0 ≤ entry ≤ 255}, and if {@code table} is a {@code short[]} then we
+   * should have {@code 0 ≤ entry ≤ 65535}. It is the caller's responsibility to ensure this.
+   */
   static void tableSet(Object table, int index, int entry) {
     if (table instanceof byte[]) {
       ((byte[]) table)[index] = (byte) entry; // unsigned write
@@ -143,13 +157,13 @@
   }
 
   static int remove(
-      @Nullable Object key,
-      @Nullable Object value,
+      @CheckForNull Object key,
+      @CheckForNull Object value,
       int mask,
       Object table,
       int[] entries,
-      Object[] keys,
-      Object @Nullable [] values) {
+      @Nullable Object[] keys,
+      @CheckForNull @Nullable Object[] values) {
     int hash = Hashing.smearedHash(key);
     int tableIndex = hash & mask;
     int next = tableGet(table, tableIndex);
diff --git a/guava/src/com/google/common/collect/CompactLinkedHashMap.java b/guava/src/com/google/common/collect/CompactLinkedHashMap.java
index be878c8..97b3a4b 100644
--- a/guava/src/com/google/common/collect/CompactLinkedHashMap.java
+++ b/guava/src/com/google/common/collect/CompactLinkedHashMap.java
@@ -16,6 +16,8 @@
 
 package com.google.common.collect;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -27,6 +29,7 @@
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.Spliterators;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -50,11 +53,14 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible // not worth using in GWT for now
-class CompactLinkedHashMap<K, V> extends CompactHashMap<K, V> {
+@ElementTypesAreNonnullByDefault
+class CompactLinkedHashMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends CompactHashMap<K, V> {
   // TODO(lowasser): implement removeEldestEntry so this can be used as a drop-in replacement
 
   /** Creates an empty {@code CompactLinkedHashMap} instance. */
-  public static <K, V> CompactLinkedHashMap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      CompactLinkedHashMap<K, V> create() {
     return new CompactLinkedHashMap<>();
   }
 
@@ -67,7 +73,8 @@
    *     expectedSize} elements without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <K, V> CompactLinkedHashMap<K, V> createWithExpectedSize(int expectedSize) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      CompactLinkedHashMap<K, V> createWithExpectedSize(int expectedSize) {
     return new CompactLinkedHashMap<>(expectedSize);
   }
 
@@ -82,7 +89,7 @@
    * <p>A node with "prev" pointer equal to {@code ENDPOINT} is the first node in the linked list,
    * and a node with "next" pointer equal to {@code ENDPOINT} is the last node.
    */
-  @VisibleForTesting transient long @Nullable [] links;
+  @CheckForNull @VisibleForTesting transient long[] links;
 
   /** Pointer to the first node in the linked list, or {@code ENDPOINT} if there are no entries. */
   private transient int firstEntry;
@@ -132,23 +139,29 @@
     return result;
   }
 
+  /*
+   * For discussion of the safety of the following methods for operating on predecessors and
+   * successors, see the comments near the end of CompactHashMap, noting that the methods here call
+   * link(), which is defined at the end of this file.
+   */
+
   private int getPredecessor(int entry) {
-    return ((int) (links[entry] >>> 32)) - 1;
+    return ((int) (link(entry) >>> 32)) - 1;
   }
 
   @Override
   int getSuccessor(int entry) {
-    return ((int) links[entry]) - 1;
+    return ((int) link(entry)) - 1;
   }
 
   private void setSuccessor(int entry, int succ) {
     long succMask = (~0L) >>> 32;
-    links[entry] = (links[entry] & ~succMask) | ((succ + 1) & succMask);
+    setLink(entry, (link(entry) & ~succMask) | ((succ + 1) & succMask));
   }
 
   private void setPredecessor(int entry, int pred) {
     long predMask = ~0L << 32;
-    links[entry] = (links[entry] & ~predMask) | ((long) (pred + 1) << 32);
+    setLink(entry, (link(entry) & ~predMask) | ((long) (pred + 1) << 32));
   }
 
   private void setSucceeds(int pred, int succ) {
@@ -166,7 +179,8 @@
   }
 
   @Override
-  void insertEntry(int entryIndex, @Nullable K key, @Nullable V value, int hash, int mask) {
+  void insertEntry(
+      int entryIndex, @ParametricNullness K key, @ParametricNullness V value, int hash, int mask) {
     super.insertEntry(entryIndex, key, value, hash, mask);
     setSucceeds(lastEntry, entryIndex);
     setSucceeds(entryIndex, ENDPOINT);
@@ -194,13 +208,13 @@
       setSucceeds(getPredecessor(srcIndex), dstIndex);
       setSucceeds(dstIndex, getSuccessor(srcIndex));
     }
-    links[srcIndex] = 0;
+    setLink(srcIndex, 0);
   }
 
   @Override
   void resizeEntries(int newCapacity) {
     super.resizeEntries(newCapacity);
-    links = Arrays.copyOf(links, newCapacity);
+    links = Arrays.copyOf(requireLinks(), newCapacity);
   }
 
   @Override
@@ -230,12 +244,13 @@
     @WeakOuter
     class KeySetImpl extends KeySetView {
       @Override
-      public Object[] toArray() {
+      public @Nullable Object[] toArray() {
         return ObjectArrays.toArrayImpl(this);
       }
 
       @Override
-      public <T> T[] toArray(T[] a) {
+      @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+      public <T extends @Nullable Object> T[] toArray(T[] a) {
         return ObjectArrays.toArrayImpl(this, a);
       }
 
@@ -252,12 +267,13 @@
     @WeakOuter
     class ValuesImpl extends ValuesView {
       @Override
-      public Object[] toArray() {
+      public @Nullable Object[] toArray() {
         return ObjectArrays.toArrayImpl(this);
       }
 
       @Override
-      public <T> T[] toArray(T[] a) {
+      @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+      public <T extends @Nullable Object> T[] toArray(T[] a) {
         return ObjectArrays.toArrayImpl(this, a);
       }
 
@@ -281,4 +297,27 @@
     }
     super.clear();
   }
+
+  /*
+   * For discussion of the safety of the following methods, see the comments near the end of
+   * CompactHashMap.
+   */
+
+  private long[] requireLinks() {
+    return requireNonNull(links);
+  }
+
+  private long link(int i) {
+    return requireLinks()[i];
+  }
+
+  private void setLink(int i, long value) {
+    requireLinks()[i] = value;
+  }
+
+  /*
+   * We don't define getPredecessor+getSuccessor and setPredecessor+setSuccessor here because
+   * they're defined above -- including logic to add and subtract 1 to map between the values stored
+   * in the predecessor/successor arrays and the indexes in the elements array that they identify.
+   */
 }
diff --git a/guava/src/com/google/common/collect/CompactLinkedHashSet.java b/guava/src/com/google/common/collect/CompactLinkedHashSet.java
index 74caf47..c1d813c 100644
--- a/guava/src/com/google/common/collect/CompactLinkedHashSet.java
+++ b/guava/src/com/google/common/collect/CompactLinkedHashSet.java
@@ -16,6 +16,8 @@
 
 package com.google.common.collect;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Arrays;
@@ -24,6 +26,7 @@
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.Spliterators;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -48,10 +51,11 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible // not worth using in GWT for now
-class CompactLinkedHashSet<E> extends CompactHashSet<E> {
+@ElementTypesAreNonnullByDefault
+class CompactLinkedHashSet<E extends @Nullable Object> extends CompactHashSet<E> {
 
   /** Creates an empty {@code CompactLinkedHashSet} instance. */
-  public static <E> CompactLinkedHashSet<E> create() {
+  public static <E extends @Nullable Object> CompactLinkedHashSet<E> create() {
     return new CompactLinkedHashSet<>();
   }
 
@@ -62,7 +66,8 @@
    * @param collection the elements that the set should contain
    * @return a new {@code CompactLinkedHashSet} containing those elements (minus duplicates)
    */
-  public static <E> CompactLinkedHashSet<E> create(Collection<? extends E> collection) {
+  public static <E extends @Nullable Object> CompactLinkedHashSet<E> create(
+      Collection<? extends E> collection) {
     CompactLinkedHashSet<E> set = createWithExpectedSize(collection.size());
     set.addAll(collection);
     return set;
@@ -76,7 +81,7 @@
    * @return a new {@code CompactLinkedHashSet} containing those elements (minus duplicates)
    */
   @SafeVarargs
-  public static <E> CompactLinkedHashSet<E> create(E... elements) {
+  public static <E extends @Nullable Object> CompactLinkedHashSet<E> create(E... elements) {
     CompactLinkedHashSet<E> set = createWithExpectedSize(elements.length);
     Collections.addAll(set, elements);
     return set;
@@ -91,7 +96,8 @@
    *     expectedSize} elements without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <E> CompactLinkedHashSet<E> createWithExpectedSize(int expectedSize) {
+  public static <E extends @Nullable Object> CompactLinkedHashSet<E> createWithExpectedSize(
+      int expectedSize) {
     return new CompactLinkedHashSet<>(expectedSize);
   }
 
@@ -105,13 +111,13 @@
    * Pointer to the predecessor of an entry in insertion order. ENDPOINT indicates a node is the
    * first node in insertion order; all values at indices ≥ {@link #size()} are UNSET.
    */
-  private transient int @Nullable [] predecessor;
+  @CheckForNull private transient int[] predecessor;
 
   /**
    * Pointer to the successor of an entry in insertion order. ENDPOINT indicates a node is the last
    * node in insertion order; all values at indices ≥ {@link #size()} are UNSET.
    */
-  private transient int @Nullable [] successor;
+  @CheckForNull private transient int[] successor;
 
   /** Pointer to the first node in the linked list, or {@code ENDPOINT} if there are no entries. */
   private transient int firstEntry;
@@ -151,21 +157,27 @@
     return result;
   }
 
+  /*
+   * For discussion of the safety of the following methods for operating on predecessors and
+   * successors, see the comments near the end of CompactHashMap, noting that the methods here call
+   * requirePredecessors() and requireSuccessors(), which are defined at the end of this file.
+   */
+
   private int getPredecessor(int entry) {
-    return predecessor[entry] - 1;
+    return requirePredecessors()[entry] - 1;
   }
 
   @Override
   int getSuccessor(int entry) {
-    return successor[entry] - 1;
+    return requireSuccessors()[entry] - 1;
   }
 
   private void setSuccessor(int entry, int succ) {
-    successor[entry] = succ + 1;
+    requireSuccessors()[entry] = succ + 1;
   }
 
   private void setPredecessor(int entry, int pred) {
-    predecessor[entry] = pred + 1;
+    requirePredecessors()[entry] = pred + 1;
   }
 
   private void setSucceeds(int pred, int succ) {
@@ -183,7 +195,7 @@
   }
 
   @Override
-  void insertEntry(int entryIndex, @Nullable E object, int hash, int mask) {
+  void insertEntry(int entryIndex, @ParametricNullness E object, int hash, int mask) {
     super.insertEntry(entryIndex, object, hash, mask);
     setSucceeds(lastEntry, entryIndex);
     setSucceeds(entryIndex, ENDPOINT);
@@ -199,15 +211,15 @@
       setSucceeds(getPredecessor(srcIndex), dstIndex);
       setSucceeds(dstIndex, getSuccessor(srcIndex));
     }
-    predecessor[srcIndex] = 0;
-    successor[srcIndex] = 0;
+    requirePredecessors()[srcIndex] = 0;
+    requireSuccessors()[srcIndex] = 0;
   }
 
   @Override
   void resizeEntries(int newCapacity) {
     super.resizeEntries(newCapacity);
-    predecessor = Arrays.copyOf(predecessor, newCapacity);
-    successor = Arrays.copyOf(successor, newCapacity);
+    predecessor = Arrays.copyOf(requirePredecessors(), newCapacity);
+    successor = Arrays.copyOf(requireSuccessors(), newCapacity);
   }
 
   @Override
@@ -221,12 +233,13 @@
   }
 
   @Override
-  public Object[] toArray() {
+  public @Nullable Object[] toArray() {
     return ObjectArrays.toArrayImpl(this);
   }
 
   @Override
-  public <T> T[] toArray(T[] a) {
+  @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+  public <T extends @Nullable Object> T[] toArray(T[] a) {
     return ObjectArrays.toArrayImpl(this, a);
   }
 
@@ -242,10 +255,30 @@
     }
     this.firstEntry = ENDPOINT;
     this.lastEntry = ENDPOINT;
-    if (predecessor != null) {
+    // Either both arrays are null or neither is, but we check both to satisfy the nullness checker.
+    if (predecessor != null && successor != null) {
       Arrays.fill(predecessor, 0, size(), 0);
       Arrays.fill(successor, 0, size(), 0);
     }
     super.clear();
   }
+
+  /*
+   * For discussion of the safety of the following methods, see the comments near the end of
+   * CompactHashMap.
+   */
+
+  private int[] requirePredecessors() {
+    return requireNonNull(predecessor);
+  }
+
+  private int[] requireSuccessors() {
+    return requireNonNull(successor);
+  }
+
+  /*
+   * We don't define getPredecessor+getSuccessor and setPredecessor+setSuccessor here because
+   * they're defined above -- including logic to add and subtract 1 to map between the values stored
+   * in the predecessor/successor arrays and the indexes in the elements array that they identify.
+   */
 }
diff --git a/guava/src/com/google/common/collect/ComparatorOrdering.java b/guava/src/com/google/common/collect/ComparatorOrdering.java
index 52cbf2a..8b34070 100644
--- a/guava/src/com/google/common/collect/ComparatorOrdering.java
+++ b/guava/src/com/google/common/collect/ComparatorOrdering.java
@@ -21,11 +21,14 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.Comparator;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering for a pre-existing comparator. */
 @GwtCompatible(serializable = true)
-final class ComparatorOrdering<T> extends Ordering<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class ComparatorOrdering<T extends @Nullable Object> extends Ordering<T>
+    implements Serializable {
   final Comparator<T> comparator;
 
   ComparatorOrdering(Comparator<T> comparator) {
@@ -33,12 +36,12 @@
   }
 
   @Override
-  public int compare(T a, T b) {
+  public int compare(@ParametricNullness T a, @ParametricNullness T b) {
     return comparator.compare(a, b);
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/collect/Comparators.java b/guava/src/com/google/common/collect/Comparators.java
index a541de9..1b90fb8 100644
--- a/guava/src/com/google/common/collect/Comparators.java
+++ b/guava/src/com/google/common/collect/Comparators.java
@@ -44,6 +44,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Comparators {
   private Comparators() {}
 
@@ -62,7 +63,8 @@
   // desired return type. However, *nested* generics introduce a special class of problems that we
   // think tip it over into being worthwhile.
   @Beta
-  public static <T, S extends T> Comparator<Iterable<S>> lexicographical(Comparator<T> comparator) {
+  public static <T extends @Nullable Object, S extends T> Comparator<Iterable<S>> lexicographical(
+      Comparator<T> comparator) {
     return new LexicographicalOrdering<S>(checkNotNull(comparator));
   }
 
@@ -72,7 +74,8 @@
    * always true when the iterable has fewer than two elements.
    */
   @Beta
-  public static <T> boolean isInOrder(Iterable<? extends T> iterable, Comparator<T> comparator) {
+  public static <T extends @Nullable Object> boolean isInOrder(
+      Iterable<? extends T> iterable, Comparator<T> comparator) {
     checkNotNull(comparator);
     Iterator<? extends T> it = iterable.iterator();
     if (it.hasNext()) {
@@ -94,7 +97,7 @@
    * this is always true when the iterable has fewer than two elements.
    */
   @Beta
-  public static <T> boolean isInStrictOrder(
+  public static <T extends @Nullable Object> boolean isInStrictOrder(
       Iterable<? extends T> iterable, Comparator<T> comparator) {
     checkNotNull(comparator);
     Iterator<? extends T> it = iterable.iterator();
@@ -131,7 +134,8 @@
    * @throws IllegalArgumentException if {@code k < 0}
    * @since 22.0
    */
-  public static <T> Collector<T, ?, List<T>> least(int k, Comparator<? super T> comparator) {
+  public static <T extends @Nullable Object> Collector<T, ?, List<T>> least(
+      int k, Comparator<? super T> comparator) {
     checkNonnegative(k, "k");
     checkNotNull(comparator);
     return Collector.of(
@@ -162,7 +166,8 @@
    * @throws IllegalArgumentException if {@code k < 0}
    * @since 22.0
    */
-  public static <T> Collector<T, ?, List<T>> greatest(int k, Comparator<? super T> comparator) {
+  public static <T extends @Nullable Object> Collector<T, ?, List<T>> greatest(
+      int k, Comparator<? super T> comparator) {
     return least(k, comparator.reversed());
   }
 
@@ -176,7 +181,8 @@
   @Beta
   public static <T> Comparator<Optional<T>> emptiesFirst(Comparator<? super T> valueComparator) {
     checkNotNull(valueComparator);
-    return Comparator.comparing(o -> o.orElse(null), Comparator.nullsFirst(valueComparator));
+    return Comparator.<Optional<T>, @Nullable T>comparing(
+        o -> o.orElse(null), Comparator.nullsFirst(valueComparator));
   }
 
   /**
@@ -189,7 +195,8 @@
   @Beta
   public static <T> Comparator<Optional<T>> emptiesLast(Comparator<? super T> valueComparator) {
     checkNotNull(valueComparator);
-    return Comparator.comparing(o -> o.orElse(null), Comparator.nullsLast(valueComparator));
+    return Comparator.<Optional<T>, @Nullable T>comparing(
+        o -> o.orElse(null), Comparator.nullsLast(valueComparator));
   }
 
   /**
@@ -226,7 +233,9 @@
    * @since 30.0
    */
   @Beta
-  public static <T> T min(@Nullable T a, @Nullable T b, Comparator<T> comparator) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T min(
+      @ParametricNullness T a, @ParametricNullness T b, Comparator<T> comparator) {
     return (comparator.compare(a, b) <= 0) ? a : b;
   }
 
@@ -264,7 +273,9 @@
    * @since 30.0
    */
   @Beta
-  public static <T> T max(@Nullable T a, @Nullable T b, Comparator<T> comparator) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T max(
+      @ParametricNullness T a, @ParametricNullness T b, Comparator<T> comparator) {
     return (comparator.compare(a, b) >= 0) ? a : b;
   }
 }
diff --git a/guava/src/com/google/common/collect/ComparisonChain.java b/guava/src/com/google/common/collect/ComparisonChain.java
index 578166d..32aeb4d 100644
--- a/guava/src/com/google/common/collect/ComparisonChain.java
+++ b/guava/src/com/google/common/collect/ComparisonChain.java
@@ -57,6 +57,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ComparisonChain {
   private ComparisonChain() {}
 
@@ -67,15 +68,15 @@
 
   private static final ComparisonChain ACTIVE =
       new ComparisonChain() {
-        @SuppressWarnings("unchecked")
+        @SuppressWarnings("unchecked") // unsafe; see discussion on supertype
         @Override
-        public ComparisonChain compare(Comparable left, Comparable right) {
-          return classify(left.compareTo(right));
+        public ComparisonChain compare(Comparable<?> left, Comparable<?> right) {
+          return classify(((Comparable<Object>) left).compareTo(right));
         }
 
         @Override
-        public <T> ComparisonChain compare(
-            @Nullable T left, @Nullable T right, Comparator<T> comparator) {
+        public <T extends @Nullable Object> ComparisonChain compare(
+            @ParametricNullness T left, @ParametricNullness T right, Comparator<T> comparator) {
           return classify(comparator.compare(left, right));
         }
 
@@ -131,13 +132,13 @@
     }
 
     @Override
-    public ComparisonChain compare(@Nullable Comparable left, @Nullable Comparable right) {
+    public ComparisonChain compare(Comparable<?> left, Comparable<?> right) {
       return this;
     }
 
     @Override
-    public <T> ComparisonChain compare(
-        @Nullable T left, @Nullable T right, @Nullable Comparator<T> comparator) {
+    public <T extends @Nullable Object> ComparisonChain compare(
+        @ParametricNullness T left, @ParametricNullness T right, Comparator<T> comparator) {
       return this;
     }
 
@@ -180,6 +181,18 @@
   /**
    * Compares two comparable objects as specified by {@link Comparable#compareTo}, <i>if</i> the
    * result of this comparison chain has not already been determined.
+   *
+   * <p>This method is declared to accept any 2 {@code Comparable} objects, even if they are not <a
+   * href="https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html">mutually
+   * comparable</a>. If you pass objects that are not mutually comparable, this method may throw an
+   * exception. (The reason for this decision is lost to time, but the reason <i>might</i> be that
+   * we wanted to support legacy classes that implement the raw type {@code Comparable} (instead of
+   * implementing {@code Comparable<Foo>}) without producing warnings. If so, we would prefer today
+   * to produce warnings in that case, and we may change this method to do so in the future. Support
+   * for raw {@code Comparable} types in Guava in general is tracked as <a
+   * href="https://github.com/google/guava/issues/989">#989</a>.)
+   *
+   * @throws ClassCastException if the parameters are not mutually comparable
    */
   public abstract ComparisonChain compare(Comparable<?> left, Comparable<?> right);
 
@@ -187,8 +200,8 @@
    * Compares two objects using a comparator, <i>if</i> the result of this comparison chain has not
    * already been determined.
    */
-  public abstract <T> ComparisonChain compare(
-      @Nullable T left, @Nullable T right, Comparator<T> comparator);
+  public abstract <T extends @Nullable Object> ComparisonChain compare(
+      @ParametricNullness T left, @ParametricNullness T right, Comparator<T> comparator);
 
   /**
    * Compares two {@code int} values as specified by {@link Ints#compare}, <i>if</i> the result of
diff --git a/guava/src/com/google/common/collect/CompoundOrdering.java b/guava/src/com/google/common/collect/CompoundOrdering.java
index e803acb..42feed3 100644
--- a/guava/src/com/google/common/collect/CompoundOrdering.java
+++ b/guava/src/com/google/common/collect/CompoundOrdering.java
@@ -20,10 +20,14 @@
 import java.io.Serializable;
 import java.util.Arrays;
 import java.util.Comparator;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering that tries several comparators in order. */
 @GwtCompatible(serializable = true)
-final class CompoundOrdering<T> extends Ordering<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class CompoundOrdering<T extends @Nullable Object> extends Ordering<T>
+    implements Serializable {
   final Comparator<? super T>[] comparators;
 
   CompoundOrdering(Comparator<? super T> primary, Comparator<? super T> secondary) {
@@ -35,7 +39,7 @@
   }
 
   @Override
-  public int compare(T left, T right) {
+  public int compare(@ParametricNullness T left, @ParametricNullness T right) {
     for (int i = 0; i < comparators.length; i++) {
       int result = comparators[i].compare(left, right);
       if (result != 0) {
@@ -46,7 +50,7 @@
   }
 
   @Override
-  public boolean equals(Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/collect/ComputationException.java b/guava/src/com/google/common/collect/ComputationException.java
index df8d377..b05577c 100644
--- a/guava/src/com/google/common/collect/ComputationException.java
+++ b/guava/src/com/google/common/collect/ComputationException.java
@@ -17,7 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Wraps an exception that occurred during a computation.
@@ -34,9 +34,10 @@
  */
 @Deprecated
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class ComputationException extends RuntimeException {
   /** Creates a new instance with the given cause. */
-  public ComputationException(@Nullable Throwable cause) {
+  public ComputationException(@CheckForNull Throwable cause) {
     super(cause);
   }
 
diff --git a/guava/src/com/google/common/collect/ConcurrentHashMultiset.java b/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
index 3aaa76e..ab03ead 100644
--- a/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
+++ b/guava/src/com/google/common/collect/ConcurrentHashMultiset.java
@@ -18,8 +18,8 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -41,6 +41,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -56,6 +57,7 @@
  * @since 2.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ConcurrentHashMultiset<E> extends AbstractMultiset<E> implements Serializable {
 
   /*
@@ -137,7 +139,7 @@
    * @return the nonnegative number of occurrences of the element
    */
   @Override
-  public int count(@Nullable Object element) {
+  public int count(@CheckForNull Object element) {
     AtomicInteger existingCounter = Maps.safeGet(countMap, element);
     return (existingCounter == null) ? 0 : existingCounter.get();
   }
@@ -168,7 +170,8 @@
   }
 
   @Override
-  public <T> T[] toArray(T[] array) {
+  @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+  public <T extends @Nullable Object> T[] toArray(T[] array) {
     return snapshot().toArray(array);
   }
 
@@ -205,7 +208,7 @@
     if (occurrences == 0) {
       return count(element);
     }
-    CollectPreconditions.checkPositive(occurrences, "occurences");
+    CollectPreconditions.checkPositive(occurrences, "occurrences");
 
     while (true) {
       AtomicInteger existingCounter = Maps.safeGet(countMap, element);
@@ -267,11 +270,11 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public int remove(@Nullable Object element, int occurrences) {
+  public int remove(@CheckForNull Object element, int occurrences) {
     if (occurrences == 0) {
       return count(element);
     }
-    CollectPreconditions.checkPositive(occurrences, "occurences");
+    CollectPreconditions.checkPositive(occurrences, "occurrences");
 
     AtomicInteger existingCounter = Maps.safeGet(countMap, element);
     if (existingCounter == null) {
@@ -308,11 +311,11 @@
    * @throws IllegalArgumentException if {@code occurrences} is negative
    */
   @CanIgnoreReturnValue
-  public boolean removeExactly(@Nullable Object element, int occurrences) {
+  public boolean removeExactly(@CheckForNull Object element, int occurrences) {
     if (occurrences == 0) {
       return true;
     }
-    CollectPreconditions.checkPositive(occurrences, "occurences");
+    CollectPreconditions.checkPositive(occurrences, "occurrences");
 
     AtomicInteger existingCounter = Maps.safeGet(countMap, element);
     if (existingCounter == null) {
@@ -454,7 +457,7 @@
       }
 
       @Override
-      public boolean contains(@Nullable Object object) {
+      public boolean contains(@CheckForNull Object object) {
         return object != null && Collections2.safeContains(delegate, object);
       }
 
@@ -464,7 +467,7 @@
       }
 
       @Override
-      public boolean remove(Object object) {
+      public boolean remove(@CheckForNull Object object) {
         return object != null && Collections2.safeRemove(delegate, object);
       }
 
@@ -507,6 +510,7 @@
               countMap.entrySet().iterator();
 
           @Override
+          @CheckForNull
           protected Entry<E> computeNext() {
             while (true) {
               if (!mapEntries.hasNext()) {
@@ -522,7 +526,7 @@
         };
 
     return new ForwardingIterator<Entry<E>>() {
-      private @Nullable Entry<E> last;
+      @CheckForNull private Entry<E> last;
 
       @Override
       protected Iterator<Entry<E>> delegate() {
@@ -537,7 +541,7 @@
 
       @Override
       public void remove() {
-        checkRemove(last != null);
+        checkState(last != null, "no calls to next() since the last call to remove()");
         ConcurrentHashMultiset.this.setCount(last.getElement(), 0);
         last = null;
       }
@@ -572,7 +576,8 @@
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return snapshot().toArray(array);
     }
 
diff --git a/guava/src/com/google/common/collect/ConsumingQueueIterator.java b/guava/src/com/google/common/collect/ConsumingQueueIterator.java
index 2f288f0..7721e12 100644
--- a/guava/src/com/google/common/collect/ConsumingQueueIterator.java
+++ b/guava/src/com/google/common/collect/ConsumingQueueIterator.java
@@ -17,29 +17,30 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.GwtCompatible;
-import java.util.ArrayDeque;
-import java.util.Collections;
 import java.util.Queue;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An Iterator implementation which draws elements from a queue, removing them from the queue as it
  * iterates.
  */
 @GwtCompatible
-class ConsumingQueueIterator<T> extends AbstractIterator<T> {
+@ElementTypesAreNonnullByDefault
+final class ConsumingQueueIterator<T extends @Nullable Object> extends AbstractIterator<T> {
   private final Queue<T> queue;
 
-  ConsumingQueueIterator(T... elements) {
-    this.queue = new ArrayDeque<T>(elements.length);
-    Collections.addAll(queue, elements);
-  }
-
   ConsumingQueueIterator(Queue<T> queue) {
     this.queue = checkNotNull(queue);
   }
 
   @Override
+  @CheckForNull
   public T computeNext() {
-    return queue.isEmpty() ? endOfData() : queue.remove();
+    // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+    if (queue.isEmpty()) {
+      return endOfData();
+    }
+    return queue.remove();
   }
 }
diff --git a/guava/src/com/google/common/collect/ContiguousSet.java b/guava/src/com/google/common/collect/ContiguousSet.java
index 6755be6..cd77042 100644
--- a/guava/src/com/google/common/collect/ContiguousSet.java
+++ b/guava/src/com/google/common/collect/ContiguousSet.java
@@ -16,10 +16,12 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.Collections;
 import java.util.NoSuchElementException;
 import java.util.Set;
@@ -48,6 +50,7 @@
  */
 @GwtCompatible(emulated = true)
 @SuppressWarnings("rawtypes") // allow ungenerified Comparable types
+@ElementTypesAreNonnullByDefault
 public abstract class ContiguousSet<C extends Comparable> extends ImmutableSortedSet<C> {
   /**
    * Returns a {@code ContiguousSet} containing the same values in the given domain {@linkplain
@@ -73,13 +76,19 @@
       throw new IllegalArgumentException(e);
     }
 
-    // Per class spec, we are allowed to throw CCE if necessary
-    boolean empty =
-        effectiveRange.isEmpty()
-            || Range.compareOrThrow(
-                    range.lowerBound.leastValueAbove(domain),
-                    range.upperBound.greatestValueBelow(domain))
-                > 0;
+    boolean empty;
+    if (effectiveRange.isEmpty()) {
+      empty = true;
+    } else {
+      /*
+       * requireNonNull is safe because the effectiveRange operations above would have thrown or
+       * effectiveRange.isEmpty() would have returned true.
+       */
+      C afterLower = requireNonNull(range.lowerBound.leastValueAbove(domain));
+      C beforeUpper = requireNonNull(range.upperBound.greatestValueBelow(domain));
+      // Per class spec, we are allowed to throw CCE if necessary
+      empty = Range.compareOrThrow(afterLower, beforeUpper) > 0;
+    }
 
     return empty
         ? new EmptyContiguousSet<C>(domain)
@@ -191,15 +200,14 @@
   /*
    * These methods perform most headSet, subSet, and tailSet logic, besides parameter validation.
    */
-  // TODO(kevinb): we can probably make these real @Overrides now
-  /* @Override */
+  @SuppressWarnings("MissingOverride") // Supermethod does not exist under GWT.
   abstract ContiguousSet<C> headSetImpl(C toElement, boolean inclusive);
 
-  /* @Override */
+  @SuppressWarnings("MissingOverride") // Supermethod does not exist under GWT.
   abstract ContiguousSet<C> subSetImpl(
       C fromElement, boolean fromInclusive, C toElement, boolean toInclusive);
 
-  /* @Override */
+  @SuppressWarnings("MissingOverride") // Supermethod does not exist under GWT.
   abstract ContiguousSet<C> tailSetImpl(C fromElement, boolean inclusive);
 
   /**
@@ -252,6 +260,7 @@
    * @deprecated Use {@link #create}.
    */
   @Deprecated
+  @DoNotCall("Always throws UnsupportedOperationException")
   public static <E> ImmutableSortedSet.Builder<E> builder() {
     throw new UnsupportedOperationException();
   }
diff --git a/guava/src/com/google/common/collect/Count.java b/guava/src/com/google/common/collect/Count.java
index e2da82a..7aa5550 100644
--- a/guava/src/com/google/common/collect/Count.java
+++ b/guava/src/com/google/common/collect/Count.java
@@ -16,7 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A mutable value of type {@code int}, for multisets to use in tracking counts of values.
@@ -24,6 +24,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class Count implements Serializable {
   private int value;
 
@@ -59,7 +60,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     return obj instanceof Count && ((Count) obj).value == value;
   }
 
diff --git a/guava/src/com/google/common/collect/Cut.java b/guava/src/com/google/common/collect/Cut.java
index 8f6cd81..4a8d4c7 100644
--- a/guava/src/com/google/common/collect/Cut.java
+++ b/guava/src/com/google/common/collect/Cut.java
@@ -20,7 +20,7 @@
 import com.google.common.primitives.Booleans;
 import java.io.Serializable;
 import java.util.NoSuchElementException;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation detail for the internal structure of {@link Range} instances. Represents a unique
@@ -32,10 +32,11 @@
  * @author Kevin Bourrillion
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 abstract class Cut<C extends Comparable> implements Comparable<Cut<C>>, Serializable {
-  final @Nullable C endpoint;
+  final C endpoint;
 
-  Cut(@Nullable C endpoint) {
+  Cut(C endpoint) {
     this.endpoint = endpoint;
   }
 
@@ -53,8 +54,10 @@
 
   abstract void describeAsUpperBound(StringBuilder sb);
 
+  @CheckForNull
   abstract C leastValueAbove(DiscreteDomain<C> domain);
 
+  @CheckForNull
   abstract C greatestValueBelow(DiscreteDomain<C> domain);
 
   /*
@@ -88,14 +91,15 @@
 
   @SuppressWarnings("unchecked") // catching CCE
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj instanceof Cut) {
       // It might not really be a Cut<C>, but we'll catch a CCE if it's not
       Cut<C> that = (Cut<C>) obj;
       try {
         int compareResult = compareTo(that);
         return compareResult == 0;
-      } catch (ClassCastException ignored) {
+      } catch (ClassCastException wastNotComparableToOurType) {
+        return false;
       }
     }
     return false;
@@ -120,7 +124,13 @@
     private static final BelowAll INSTANCE = new BelowAll();
 
     private BelowAll() {
-      super(null);
+      /*
+       * No code ever sees this bogus value for `endpoint`: This class overrides both methods that
+       * use the `endpoint` field, compareTo() and endpoint(). Additionally, the main implementation
+       * of Cut.compareTo checks for belowAll before reading accessing `endpoint` on another Cut
+       * instance.
+       */
+      super("");
     }
 
     @Override
@@ -219,7 +229,8 @@
     private static final AboveAll INSTANCE = new AboveAll();
 
     private AboveAll() {
-      super(null);
+      // For discussion of "", see BelowAll.
+      super("");
     }
 
     @Override
@@ -326,7 +337,7 @@
         case CLOSED:
           return this;
         case OPEN:
-          @Nullable C previous = domain.previous(endpoint);
+          C previous = domain.previous(endpoint);
           return (previous == null) ? Cut.<C>belowAll() : new AboveValue<C>(previous);
         default:
           throw new AssertionError();
@@ -337,7 +348,7 @@
     Cut<C> withUpperBoundType(BoundType boundType, DiscreteDomain<C> domain) {
       switch (boundType) {
         case CLOSED:
-          @Nullable C previous = domain.previous(endpoint);
+          C previous = domain.previous(endpoint);
           return (previous == null) ? Cut.<C>aboveAll() : new AboveValue<C>(previous);
         case OPEN:
           return this;
@@ -362,6 +373,7 @@
     }
 
     @Override
+    @CheckForNull
     C greatestValueBelow(DiscreteDomain<C> domain) {
       return domain.previous(endpoint);
     }
@@ -409,7 +421,7 @@
         case OPEN:
           return this;
         case CLOSED:
-          @Nullable C next = domain.next(endpoint);
+          C next = domain.next(endpoint);
           return (next == null) ? Cut.<C>belowAll() : belowValue(next);
         default:
           throw new AssertionError();
@@ -420,7 +432,7 @@
     Cut<C> withUpperBoundType(BoundType boundType, DiscreteDomain<C> domain) {
       switch (boundType) {
         case OPEN:
-          @Nullable C next = domain.next(endpoint);
+          C next = domain.next(endpoint);
           return (next == null) ? Cut.<C>aboveAll() : belowValue(next);
         case CLOSED:
           return this;
@@ -440,6 +452,7 @@
     }
 
     @Override
+    @CheckForNull
     C leastValueAbove(DiscreteDomain<C> domain) {
       return domain.next(endpoint);
     }
diff --git a/guava/src/com/google/common/collect/DenseImmutableTable.java b/guava/src/com/google/common/collect/DenseImmutableTable.java
index 91c2d48..9de77c5 100644
--- a/guava/src/com/google/common/collect/DenseImmutableTable.java
+++ b/guava/src/com/google/common/collect/DenseImmutableTable.java
@@ -14,16 +14,20 @@
 
 package com.google.common.collect;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.ImmutableMap.IteratorBasedImmutableMap;
 import com.google.errorprone.annotations.Immutable;
 import com.google.j2objc.annotations.WeakOuter;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** A {@code RegularImmutableTable} optimized for dense data. */
 @GwtCompatible
 @Immutable(containerOf = {"R", "C", "V"})
+@ElementTypesAreNonnullByDefault
 final class DenseImmutableTable<R, C, V> extends RegularImmutableTable<R, C, V> {
   private final ImmutableMap<R, Integer> rowKeyToIndex;
   private final ImmutableMap<C, Integer> columnKeyToIndex;
@@ -37,7 +41,7 @@
   private final int[] columnCounts;
 
   @SuppressWarnings("Immutable") // We don't modify this after construction.
-  private final V[][] values;
+  private final @Nullable V[][] values;
 
   // For each cell in iteration order, the index of that cell's row key in the row key list.
   @SuppressWarnings("Immutable") // We don't modify this after construction.
@@ -52,7 +56,8 @@
       ImmutableSet<R> rowSpace,
       ImmutableSet<C> columnSpace) {
     @SuppressWarnings("unchecked")
-    V[][] array = (V[][]) new Object[rowSpace.size()][columnSpace.size()];
+    @Nullable
+    V[][] array = (@Nullable V[][]) new Object[rowSpace.size()][columnSpace.size()];
     this.values = array;
     this.rowKeyToIndex = Maps.indexMap(rowSpace);
     this.columnKeyToIndex = Maps.indexMap(columnSpace);
@@ -64,8 +69,9 @@
       Cell<R, C, V> cell = cellList.get(i);
       R rowKey = cell.getRowKey();
       C columnKey = cell.getColumnKey();
-      int rowIndex = rowKeyToIndex.get(rowKey);
-      int columnIndex = columnKeyToIndex.get(columnKey);
+      // The requireNonNull calls are safe because we construct the indexes with indexMap.
+      int rowIndex = requireNonNull(rowKeyToIndex.get(rowKey));
+      int columnIndex = requireNonNull(columnKeyToIndex.get(columnKey));
       V existingValue = values[rowIndex][columnIndex];
       checkNoDuplicate(rowKey, columnKey, existingValue, cell.getValue());
       values[rowIndex][columnIndex] = cell.getValue();
@@ -99,7 +105,8 @@
       return keyToIndex().keySet().asList().get(index);
     }
 
-    abstract @Nullable V getValue(int keyIndex);
+    @CheckForNull
+    abstract V getValue(int keyIndex);
 
     @Override
     ImmutableSet<K> createKeySet() {
@@ -112,7 +119,8 @@
     }
 
     @Override
-    public V get(@Nullable Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       Integer keyIndex = keyToIndex().get(key);
       return (keyIndex == null) ? null : getValue(keyIndex);
     }
@@ -124,6 +132,7 @@
         private final int maxIndex = keyToIndex().size();
 
         @Override
+        @CheckForNull
         protected Entry<K, V> computeNext() {
           for (index++; index < maxIndex; index++) {
             V value = getValue(index);
@@ -151,6 +160,7 @@
     }
 
     @Override
+    @CheckForNull
     V getValue(int keyIndex) {
       return values[rowIndex][keyIndex];
     }
@@ -175,6 +185,7 @@
     }
 
     @Override
+    @CheckForNull
     V getValue(int keyIndex) {
       return values[keyIndex][columnIndex];
     }
@@ -244,7 +255,8 @@
   }
 
   @Override
-  public V get(@Nullable Object rowKey, @Nullable Object columnKey) {
+  @CheckForNull
+  public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     Integer rowIndex = rowKeyToIndex.get(rowKey);
     Integer columnIndex = columnKeyToIndex.get(columnKey);
     return ((rowIndex == null) || (columnIndex == null)) ? null : values[rowIndex][columnIndex];
@@ -261,13 +273,15 @@
     int columnIndex = cellColumnIndices[index];
     R rowKey = rowKeySet().asList().get(rowIndex);
     C columnKey = columnKeySet().asList().get(columnIndex);
-    V value = values[rowIndex][columnIndex];
+    // requireNonNull is safe because we use indexes that were populated by the constructor.
+    V value = requireNonNull(values[rowIndex][columnIndex]);
     return cellOf(rowKey, columnKey, value);
   }
 
   @Override
   V getValue(int index) {
-    return values[cellRowIndices[index]][cellColumnIndices[index]];
+    // requireNonNull is safe because we use indexes that were populated by the constructor.
+    return requireNonNull(values[cellRowIndices[index]][cellColumnIndices[index]]);
   }
 
   @Override
diff --git a/guava/src/com/google/common/collect/DescendingImmutableSortedMultiset.java b/guava/src/com/google/common/collect/DescendingImmutableSortedMultiset.java
index 346bafb..181731c 100644
--- a/guava/src/com/google/common/collect/DescendingImmutableSortedMultiset.java
+++ b/guava/src/com/google/common/collect/DescendingImmutableSortedMultiset.java
@@ -15,7 +15,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A descending wrapper around an {@code ImmutableSortedMultiset}
@@ -24,6 +24,7 @@
  */
 @SuppressWarnings("serial") // uses writeReplace, not default serialization
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class DescendingImmutableSortedMultiset<E> extends ImmutableSortedMultiset<E> {
   private final transient ImmutableSortedMultiset<E> forward;
 
@@ -32,16 +33,18 @@
   }
 
   @Override
-  public int count(@Nullable Object element) {
+  public int count(@CheckForNull Object element) {
     return forward.count(element);
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     return forward.lastEntry();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     return forward.firstEntry();
   }
diff --git a/guava/src/com/google/common/collect/DescendingImmutableSortedSet.java b/guava/src/com/google/common/collect/DescendingImmutableSortedSet.java
index 6354378..88c7d6b 100644
--- a/guava/src/com/google/common/collect/DescendingImmutableSortedSet.java
+++ b/guava/src/com/google/common/collect/DescendingImmutableSortedSet.java
@@ -17,7 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Skeletal implementation of {@link ImmutableSortedSet#descendingSet()}.
@@ -25,6 +25,7 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class DescendingImmutableSortedSet<E> extends ImmutableSortedSet<E> {
   private final ImmutableSortedSet<E> forward;
 
@@ -34,7 +35,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return forward.contains(object);
   }
 
@@ -83,27 +84,31 @@
   }
 
   @Override
+  @CheckForNull
   public E lower(E element) {
     return forward.higher(element);
   }
 
   @Override
+  @CheckForNull
   public E floor(E element) {
     return forward.ceiling(element);
   }
 
   @Override
+  @CheckForNull
   public E ceiling(E element) {
     return forward.floor(element);
   }
 
   @Override
+  @CheckForNull
   public E higher(E element) {
     return forward.lower(element);
   }
 
   @Override
-  int indexOf(@Nullable Object target) {
+  int indexOf(@CheckForNull Object target) {
     int index = forward.indexOf(target);
     if (index == -1) {
       return index;
diff --git a/guava/src/com/google/common/collect/DescendingMultiset.java b/guava/src/com/google/common/collect/DescendingMultiset.java
index 74590ac..ec5a1d0 100644
--- a/guava/src/com/google/common/collect/DescendingMultiset.java
+++ b/guava/src/com/google/common/collect/DescendingMultiset.java
@@ -22,6 +22,7 @@
 import java.util.Iterator;
 import java.util.NavigableSet;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -31,10 +32,12 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(emulated = true)
-abstract class DescendingMultiset<E> extends ForwardingMultiset<E> implements SortedMultiset<E> {
+@ElementTypesAreNonnullByDefault
+abstract class DescendingMultiset<E extends @Nullable Object> extends ForwardingMultiset<E>
+    implements SortedMultiset<E> {
   abstract SortedMultiset<E> forwardMultiset();
 
-  private transient @Nullable Comparator<? super E> comparator;
+  @CheckForNull private transient Comparator<? super E> comparator;
 
   @Override
   public Comparator<? super E> comparator() {
@@ -45,7 +48,7 @@
     return result;
   }
 
-  private transient @Nullable NavigableSet<E> elementSet;
+  @CheckForNull private transient NavigableSet<E> elementSet;
 
   @Override
   public NavigableSet<E> elementSet() {
@@ -57,30 +60,35 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollFirstEntry() {
     return forwardMultiset().pollLastEntry();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollLastEntry() {
     return forwardMultiset().pollFirstEntry();
   }
 
   @Override
-  public SortedMultiset<E> headMultiset(E toElement, BoundType boundType) {
+  public SortedMultiset<E> headMultiset(@ParametricNullness E toElement, BoundType boundType) {
     return forwardMultiset().tailMultiset(toElement, boundType).descendingMultiset();
   }
 
   @Override
   public SortedMultiset<E> subMultiset(
-      E fromElement, BoundType fromBoundType, E toElement, BoundType toBoundType) {
+      @ParametricNullness E fromElement,
+      BoundType fromBoundType,
+      @ParametricNullness E toElement,
+      BoundType toBoundType) {
     return forwardMultiset()
         .subMultiset(toElement, toBoundType, fromElement, fromBoundType)
         .descendingMultiset();
   }
 
   @Override
-  public SortedMultiset<E> tailMultiset(E fromElement, BoundType boundType) {
+  public SortedMultiset<E> tailMultiset(@ParametricNullness E fromElement, BoundType boundType) {
     return forwardMultiset().headMultiset(fromElement, boundType).descendingMultiset();
   }
 
@@ -95,18 +103,20 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     return forwardMultiset().lastEntry();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     return forwardMultiset().firstEntry();
   }
 
   abstract Iterator<Entry<E>> entryIterator();
 
-  private transient @Nullable Set<Entry<E>> entrySet;
+  @CheckForNull private transient Set<Entry<E>> entrySet;
 
   @Override
   public Set<Entry<E>> entrySet() {
@@ -141,12 +151,13 @@
   }
 
   @Override
-  public Object[] toArray() {
+  public @Nullable Object[] toArray() {
     return standardToArray();
   }
 
   @Override
-  public <T> T[] toArray(T[] array) {
+  @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+  public <T extends @Nullable Object> T[] toArray(T[] array) {
     return standardToArray(array);
   }
 
diff --git a/guava/src/com/google/common/collect/DiscreteDomain.java b/guava/src/com/google/common/collect/DiscreteDomain.java
index 3777a6d..bce7062 100644
--- a/guava/src/com/google/common/collect/DiscreteDomain.java
+++ b/guava/src/com/google/common/collect/DiscreteDomain.java
@@ -25,6 +25,7 @@
 import java.io.Serializable;
 import java.math.BigInteger;
 import java.util.NoSuchElementException;
+import javax.annotation.CheckForNull;
 
 /**
  * A descriptor for a <i>discrete</i> {@code Comparable} domain such as all {@link Integer}
@@ -43,6 +44,7 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class DiscreteDomain<C extends Comparable> {
 
   /**
@@ -62,12 +64,14 @@
     }
 
     @Override
+    @CheckForNull
     public Integer next(Integer value) {
       int i = value;
       return (i == Integer.MAX_VALUE) ? null : i + 1;
     }
 
     @Override
+    @CheckForNull
     public Integer previous(Integer value) {
       int i = value;
       return (i == Integer.MIN_VALUE) ? null : i - 1;
@@ -123,12 +127,14 @@
     }
 
     @Override
+    @CheckForNull
     public Long next(Long value) {
       long l = value;
       return (l == Long.MAX_VALUE) ? null : l + 1;
     }
 
     @Override
+    @CheckForNull
     public Long previous(Long value) {
       long l = value;
       return (l == Long.MIN_VALUE) ? null : l - 1;
@@ -248,11 +254,16 @@
    * #next} on {@code origin} {@code distance} times.
    */
   C offset(C origin, long distance) {
+    C current = origin;
     checkNonnegative(distance, "distance");
     for (long i = 0; i < distance; i++) {
-      origin = next(origin);
+      current = next(current);
+      if (current == null) {
+        throw new IllegalArgumentException(
+            "overflowed computing offset(" + origin + ", " + distance + ")");
+      }
     }
-    return origin;
+    return current;
   }
 
   /**
@@ -263,6 +274,7 @@
    * @return the least value greater than {@code value}, or {@code null} if {@code value} is {@code
    *     maxValue()}
    */
+  @CheckForNull
   public abstract C next(C value);
 
   /**
@@ -273,6 +285,7 @@
    * @return the greatest value less than {@code value}, or {@code null} if {@code value} is {@code
    *     minValue()}
    */
+  @CheckForNull
   public abstract C previous(C value);
 
   /**
diff --git a/guava/src/com/google/common/collect/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/collect/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..e1c640f
--- /dev/null
+++ b/guava/src/com/google/common/collect/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.collect;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/collect/EmptyContiguousSet.java b/guava/src/com/google/common/collect/EmptyContiguousSet.java
index fd90124..f4fe33c 100644
--- a/guava/src/com/google/common/collect/EmptyContiguousSet.java
+++ b/guava/src/com/google/common/collect/EmptyContiguousSet.java
@@ -18,7 +18,7 @@
 import java.io.Serializable;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An empty contiguous set.
@@ -27,6 +27,7 @@
  */
 @GwtCompatible(emulated = true)
 @SuppressWarnings("rawtypes") // allow ungenerified Comparable types
+@ElementTypesAreNonnullByDefault
 final class EmptyContiguousSet<C extends Comparable> extends ContiguousSet<C> {
   EmptyContiguousSet(DiscreteDomain<C> domain) {
     super(domain);
@@ -79,13 +80,13 @@
   }
 
   @Override
-  public boolean contains(Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return false;
   }
 
   @GwtIncompatible // not used by GWT emulation
   @Override
-  int indexOf(Object target) {
+  int indexOf(@CheckForNull Object target) {
     return -1;
   }
 
@@ -121,7 +122,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Set) {
       Set<?> that = (Set<?>) object;
       return that.isEmpty();
diff --git a/guava/src/com/google/common/collect/EmptyImmutableListMultimap.java b/guava/src/com/google/common/collect/EmptyImmutableListMultimap.java
index 9b167fb..10d030f 100644
--- a/guava/src/com/google/common/collect/EmptyImmutableListMultimap.java
+++ b/guava/src/com/google/common/collect/EmptyImmutableListMultimap.java
@@ -24,6 +24,7 @@
  * @author Jared Levy
  */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 class EmptyImmutableListMultimap extends ImmutableListMultimap<Object, Object> {
   static final EmptyImmutableListMultimap INSTANCE = new EmptyImmutableListMultimap();
 
diff --git a/guava/src/com/google/common/collect/EmptyImmutableSetMultimap.java b/guava/src/com/google/common/collect/EmptyImmutableSetMultimap.java
index ec2ce2e..bd0a67a 100644
--- a/guava/src/com/google/common/collect/EmptyImmutableSetMultimap.java
+++ b/guava/src/com/google/common/collect/EmptyImmutableSetMultimap.java
@@ -24,6 +24,7 @@
  * @author Mike Ward
  */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 class EmptyImmutableSetMultimap extends ImmutableSetMultimap<Object, Object> {
   static final EmptyImmutableSetMultimap INSTANCE = new EmptyImmutableSetMultimap();
 
diff --git a/guava/src/com/google/common/collect/EnumBiMap.java b/guava/src/com/google/common/collect/EnumBiMap.java
index f72b8b9..82aa052 100644
--- a/guava/src/com/google/common/collect/EnumBiMap.java
+++ b/guava/src/com/google/common/collect/EnumBiMap.java
@@ -38,6 +38,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class EnumBiMap<K extends Enum<K>, V extends Enum<V>> extends AbstractBiMap<K, V> {
   private transient Class<K> keyType;
   private transient Class<V> valueType;
diff --git a/guava/src/com/google/common/collect/EnumHashBiMap.java b/guava/src/com/google/common/collect/EnumHashBiMap.java
index 47094ae..f68bc4c 100644
--- a/guava/src/com/google/common/collect/EnumHashBiMap.java
+++ b/guava/src/com/google/common/collect/EnumHashBiMap.java
@@ -27,6 +27,7 @@
 import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -41,7 +42,9 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
-public final class EnumHashBiMap<K extends Enum<K>, V> extends AbstractBiMap<K, V> {
+@ElementTypesAreNonnullByDefault
+public final class EnumHashBiMap<K extends Enum<K>, V extends @Nullable Object>
+    extends AbstractBiMap<K, V> {
   private transient Class<K> keyType;
 
   /**
@@ -49,7 +52,8 @@
    *
    * @param keyType the key type
    */
-  public static <K extends Enum<K>, V> EnumHashBiMap<K, V> create(Class<K> keyType) {
+  public static <K extends Enum<K>, V extends @Nullable Object> EnumHashBiMap<K, V> create(
+      Class<K> keyType) {
     return new EnumHashBiMap<>(keyType);
   }
 
@@ -63,7 +67,8 @@
    * @throws IllegalArgumentException if map is not an {@code EnumBiMap} or an {@code EnumHashBiMap}
    *     instance and contains no mappings
    */
-  public static <K extends Enum<K>, V> EnumHashBiMap<K, V> create(Map<K, ? extends V> map) {
+  public static <K extends Enum<K>, V extends @Nullable Object> EnumHashBiMap<K, V> create(
+      Map<K, ? extends V> map) {
     EnumHashBiMap<K, V> bimap = create(EnumBiMap.inferKeyType(map));
     bimap.putAll(map);
     return bimap;
@@ -85,13 +90,19 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V put(K key, @Nullable V value) {
+  @SuppressWarnings("RedundantOverride") // b/192446478: RedundantOverride ignores some annotations.
+  // TODO(b/192446998): Remove this override after tools understand nullness better.
+  @CheckForNull
+  public V put(K key, @ParametricNullness V value) {
     return super.put(key, value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public V forcePut(K key, @Nullable V value) {
+  @SuppressWarnings("RedundantOverride") // b/192446478: RedundantOverride ignores some annotations.
+  // TODO(b/192446998): Remove this override after tools understand nullness better.
+  @CheckForNull
+  public V forcePut(K key, @ParametricNullness V value) {
     return super.forcePut(key, value);
   }
 
diff --git a/guava/src/com/google/common/collect/EnumMultiset.java b/guava/src/com/google/common/collect/EnumMultiset.java
index c6b9b5b..09dde1b 100644
--- a/guava/src/com/google/common/collect/EnumMultiset.java
+++ b/guava/src/com/google/common/collect/EnumMultiset.java
@@ -31,7 +31,7 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.function.ObjIntConsumer;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Multiset implementation specialized for enum elements, supporting all single-element operations
@@ -45,6 +45,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class EnumMultiset<E extends Enum<E>> extends AbstractMultiset<E>
     implements Serializable {
   /** Creates an empty {@code EnumMultiset}. */
@@ -94,7 +95,7 @@
     this.counts = new int[enumConstants.length];
   }
 
-  private boolean isActuallyE(@Nullable Object o) {
+  private boolean isActuallyE(@CheckForNull Object o) {
     if (o instanceof Enum) {
       Enum<?> e = (Enum<?>) o;
       int index = e.ordinal();
@@ -107,7 +108,7 @@
    * Returns {@code element} cast to {@code E}, if it actually is a nonnull E. Otherwise, throws
    * either a NullPointerException or a ClassCastException as appropriate.
    */
-  void checkIsE(@Nullable Object element) {
+  private void checkIsE(Object element) {
     checkNotNull(element);
     if (!isActuallyE(element)) {
       throw new ClassCastException("Expected an " + type + " but got " + element);
@@ -125,8 +126,9 @@
   }
 
   @Override
-  public int count(@Nullable Object element) {
-    if (!isActuallyE(element)) {
+  public int count(@CheckForNull Object element) {
+    // isActuallyE checks for null, but we check explicitly to help nullness checkers.
+    if (element == null || !isActuallyE(element)) {
       return 0;
     }
     Enum<?> e = (Enum<?>) element;
@@ -157,8 +159,9 @@
   // Modification Operations
   @CanIgnoreReturnValue
   @Override
-  public int remove(@Nullable Object element, int occurrences) {
-    if (!isActuallyE(element)) {
+  public int remove(@CheckForNull Object element, int occurrences) {
+    // isActuallyE checks for null, but we check explicitly to help nullness checkers.
+    if (element == null || !isActuallyE(element)) {
       return 0;
     }
     Enum<?> e = (Enum<?>) element;
diff --git a/guava/src/com/google/common/collect/EvictingQueue.java b/guava/src/com/google/common/collect/EvictingQueue.java
index 37a65f3..45f59f3 100644
--- a/guava/src/com/google/common/collect/EvictingQueue.java
+++ b/guava/src/com/google/common/collect/EvictingQueue.java
@@ -45,6 +45,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class EvictingQueue<E> extends ForwardingQueue<E> implements Serializable {
 
   private final Queue<E> delegate;
@@ -126,17 +127,19 @@
   }
 
   @Override
-  public boolean contains(Object object) {
-    return delegate().contains(checkNotNull(object));
+  public Object[] toArray() {
+    /*
+     * If we could, we'd declare the no-arg `Collection.toArray()` to return "Object[] but elements
+     * have the same nullness as E." Since we can't, we declare it to return nullable elements, and
+     * we can override it in our non-null-guaranteeing subtypes to present a better signature to
+     * their users.
+     *
+     * However, the checker *we* use has this special knowledge about `Collection.toArray()` anyway,
+     * so in our implementation code, we can rely on that. That's why the expression below
+     * type-checks.
+     */
+    return super.toArray();
   }
 
-  @Override
-  @CanIgnoreReturnValue
-  public boolean remove(Object object) {
-    return delegate().remove(checkNotNull(object));
-  }
-
-  // TODO(kak): Do we want to checkNotNull each element in containsAll, removeAll, and retainAll?
-
   private static final long serialVersionUID = 0L;
 }
diff --git a/guava/src/com/google/common/collect/ExplicitOrdering.java b/guava/src/com/google/common/collect/ExplicitOrdering.java
index 526e6e3..383318a 100644
--- a/guava/src/com/google/common/collect/ExplicitOrdering.java
+++ b/guava/src/com/google/common/collect/ExplicitOrdering.java
@@ -19,10 +19,11 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.List;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /** An ordering that compares objects according to a given order. */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 final class ExplicitOrdering<T> extends Ordering<T> implements Serializable {
   final ImmutableMap<T, Integer> rankMap;
 
@@ -48,7 +49,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof ExplicitOrdering) {
       ExplicitOrdering<?> that = (ExplicitOrdering<?>) object;
       return this.rankMap.equals(that.rankMap);
diff --git a/guava/src/com/google/common/collect/FilteredEntryMultimap.java b/guava/src/com/google/common/collect/FilteredEntryMultimap.java
index ced909a..3ff00b7 100644
--- a/guava/src/com/google/common/collect/FilteredEntryMultimap.java
+++ b/guava/src/com/google/common/collect/FilteredEntryMultimap.java
@@ -33,6 +33,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -42,7 +43,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-class FilteredEntryMultimap<K, V> extends AbstractMultimap<K, V> implements FilteredMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+class FilteredEntryMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMultimap<K, V> implements FilteredMultimap<K, V> {
   final Multimap<K, V> unfiltered;
   final Predicate<? super Entry<K, V>> predicate;
 
@@ -66,24 +69,24 @@
     return entries().size();
   }
 
-  private boolean satisfies(K key, V value) {
+  private boolean satisfies(@ParametricNullness K key, @ParametricNullness V value) {
     return predicate.apply(Maps.immutableEntry(key, value));
   }
 
   final class ValuePredicate implements Predicate<V> {
-    private final K key;
+    @ParametricNullness private final K key;
 
-    ValuePredicate(K key) {
+    ValuePredicate(@ParametricNullness K key) {
       this.key = key;
     }
 
     @Override
-    public boolean apply(@Nullable V value) {
+    public boolean apply(@ParametricNullness V value) {
       return satisfies(key, value);
     }
   }
 
-  static <E> Collection<E> filterCollection(
+  static <E extends @Nullable Object> Collection<E> filterCollection(
       Collection<E> collection, Predicate<? super E> predicate) {
     if (collection instanceof Set) {
       return Sets.filter((Set<E>) collection, predicate);
@@ -93,12 +96,12 @@
   }
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return asMap().get(key) != null;
   }
 
   @Override
-  public Collection<V> removeAll(@Nullable Object key) {
+  public Collection<V> removeAll(@CheckForNull Object key) {
     return MoreObjects.firstNonNull(asMap().remove(key), unmodifiableEmptyCollection());
   }
 
@@ -115,7 +118,7 @@
   }
 
   @Override
-  public Collection<V> get(final K key) {
+  public Collection<V> get(@ParametricNullness final K key) {
     return filterCollection(unfiltered.get(key), new ValuePredicate(key));
   }
 
@@ -166,7 +169,7 @@
   @WeakOuter
   class AsMap extends ViewCachingAbstractMap<K, Collection<V>> {
     @Override
-    public boolean containsKey(@Nullable Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return get(key) != null;
     }
 
@@ -176,7 +179,8 @@
     }
 
     @Override
-    public Collection<V> get(@Nullable Object key) {
+    @CheckForNull
+    public Collection<V> get(@CheckForNull Object key) {
       Collection<V> result = unfiltered.asMap().get(key);
       if (result == null) {
         return null;
@@ -188,7 +192,8 @@
     }
 
     @Override
-    public Collection<V> remove(@Nullable Object key) {
+    @CheckForNull
+    public Collection<V> remove(@CheckForNull Object key) {
       Collection<V> collection = unfiltered.asMap().get(key);
       if (collection == null) {
         return null;
@@ -232,7 +237,7 @@
         }
 
         @Override
-        public boolean remove(@Nullable Object o) {
+        public boolean remove(@CheckForNull Object o) {
           return AsMap.this.remove(o) != null;
         }
       }
@@ -255,6 +260,7 @@
                 unfiltered.asMap().entrySet().iterator();
 
             @Override
+            @CheckForNull
             protected Entry<K, Collection<V>> computeNext() {
               while (backingIterator.hasNext()) {
                 Entry<K, Collection<V>> entry = backingIterator.next();
@@ -297,7 +303,7 @@
         }
 
         @Override
-        public boolean remove(@Nullable Object o) {
+        public boolean remove(@CheckForNull Object o) {
           if (o instanceof Collection) {
             Collection<?> c = (Collection<?>) o;
             Iterator<Entry<K, Collection<V>>> entryIterator =
@@ -346,7 +352,7 @@
     }
 
     @Override
-    public int remove(@Nullable Object key, int occurrences) {
+    public int remove(@CheckForNull Object key, int occurrences) {
       checkNonnegative(occurrences, "occurrences");
       if (occurrences == 0) {
         return count(key);
diff --git a/guava/src/com/google/common/collect/FilteredEntrySetMultimap.java b/guava/src/com/google/common/collect/FilteredEntrySetMultimap.java
index 94740a4..20413f8 100644
--- a/guava/src/com/google/common/collect/FilteredEntrySetMultimap.java
+++ b/guava/src/com/google/common/collect/FilteredEntrySetMultimap.java
@@ -20,6 +20,8 @@
 import com.google.common.base.Predicate;
 import java.util.Map.Entry;
 import java.util.Set;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link Multimaps#filterEntries(SetMultimap, Predicate)}.
@@ -27,8 +29,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-final class FilteredEntrySetMultimap<K, V> extends FilteredEntryMultimap<K, V>
-    implements FilteredSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+final class FilteredEntrySetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends FilteredEntryMultimap<K, V> implements FilteredSetMultimap<K, V> {
 
   FilteredEntrySetMultimap(SetMultimap<K, V> unfiltered, Predicate<? super Entry<K, V>> predicate) {
     super(unfiltered, predicate);
@@ -40,17 +43,17 @@
   }
 
   @Override
-  public Set<V> get(K key) {
+  public Set<V> get(@ParametricNullness K key) {
     return (Set<V>) super.get(key);
   }
 
   @Override
-  public Set<V> removeAll(Object key) {
+  public Set<V> removeAll(@CheckForNull Object key) {
     return (Set<V>) super.removeAll(key);
   }
 
   @Override
-  public Set<V> replaceValues(K key, Iterable<? extends V> values) {
+  public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (Set<V>) super.replaceValues(key, values);
   }
 
diff --git a/guava/src/com/google/common/collect/FilteredKeyListMultimap.java b/guava/src/com/google/common/collect/FilteredKeyListMultimap.java
index 8de9ed4..c82c8da 100644
--- a/guava/src/com/google/common/collect/FilteredKeyListMultimap.java
+++ b/guava/src/com/google/common/collect/FilteredKeyListMultimap.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Predicate;
 import java.util.List;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -27,8 +28,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-final class FilteredKeyListMultimap<K, V> extends FilteredKeyMultimap<K, V>
-    implements ListMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+final class FilteredKeyListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends FilteredKeyMultimap<K, V> implements ListMultimap<K, V> {
   FilteredKeyListMultimap(ListMultimap<K, V> unfiltered, Predicate<? super K> keyPredicate) {
     super(unfiltered, keyPredicate);
   }
@@ -39,17 +41,17 @@
   }
 
   @Override
-  public List<V> get(K key) {
+  public List<V> get(@ParametricNullness K key) {
     return (List<V>) super.get(key);
   }
 
   @Override
-  public List<V> removeAll(@Nullable Object key) {
+  public List<V> removeAll(@CheckForNull Object key) {
     return (List<V>) super.removeAll(key);
   }
 
   @Override
-  public List<V> replaceValues(K key, Iterable<? extends V> values) {
+  public List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (List<V>) super.replaceValues(key, values);
   }
 }
diff --git a/guava/src/com/google/common/collect/FilteredKeyMultimap.java b/guava/src/com/google/common/collect/FilteredKeyMultimap.java
index 12456b3..68fad75 100644
--- a/guava/src/com/google/common/collect/FilteredKeyMultimap.java
+++ b/guava/src/com/google/common/collect/FilteredKeyMultimap.java
@@ -16,6 +16,8 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndex;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptySet;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Predicate;
@@ -28,6 +30,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -36,7 +39,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-class FilteredKeyMultimap<K, V> extends AbstractMultimap<K, V> implements FilteredMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+class FilteredKeyMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMultimap<K, V> implements FilteredMultimap<K, V> {
   final Multimap<K, V> unfiltered;
   final Predicate<? super K> keyPredicate;
 
@@ -65,7 +70,7 @@
   }
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     if (unfiltered.containsKey(key)) {
       @SuppressWarnings("unchecked") // k is equal to a K, if not one itself
       K k = (K) key;
@@ -75,15 +80,15 @@
   }
 
   @Override
-  public Collection<V> removeAll(Object key) {
+  public Collection<V> removeAll(@CheckForNull Object key) {
     return containsKey(key) ? unfiltered.removeAll(key) : unmodifiableEmptyCollection();
   }
 
   Collection<V> unmodifiableEmptyCollection() {
     if (unfiltered instanceof SetMultimap) {
-      return ImmutableSet.of();
+      return emptySet();
     } else {
-      return ImmutableList.of();
+      return emptyList();
     }
   }
 
@@ -98,7 +103,7 @@
   }
 
   @Override
-  public Collection<V> get(K key) {
+  public Collection<V> get(@ParametricNullness K key) {
     if (keyPredicate.apply(key)) {
       return unfiltered.get(key);
     } else if (unfiltered instanceof SetMultimap) {
@@ -108,15 +113,16 @@
     }
   }
 
-  static class AddRejectingSet<K, V> extends ForwardingSet<V> {
-    final K key;
+  static class AddRejectingSet<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingSet<V> {
+    @ParametricNullness final K key;
 
-    AddRejectingSet(K key) {
+    AddRejectingSet(@ParametricNullness K key) {
       this.key = key;
     }
 
     @Override
-    public boolean add(V element) {
+    public boolean add(@ParametricNullness V element) {
       throw new IllegalArgumentException("Key does not satisfy predicate: " + key);
     }
 
@@ -132,21 +138,22 @@
     }
   }
 
-  static class AddRejectingList<K, V> extends ForwardingList<V> {
-    final K key;
+  static class AddRejectingList<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingList<V> {
+    @ParametricNullness final K key;
 
-    AddRejectingList(K key) {
+    AddRejectingList(@ParametricNullness K key) {
       this.key = key;
     }
 
     @Override
-    public boolean add(V v) {
+    public boolean add(@ParametricNullness V v) {
       add(0, v);
       return true;
     }
 
     @Override
-    public void add(int index, V element) {
+    public void add(int index, @ParametricNullness V element) {
       checkPositionIndex(index, 0);
       throw new IllegalArgumentException("Key does not satisfy predicate: " + key);
     }
@@ -190,7 +197,7 @@
 
     @Override
     @SuppressWarnings("unchecked")
-    public boolean remove(@Nullable Object o) {
+    public boolean remove(@CheckForNull Object o) {
       if (o instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) o;
         if (unfiltered.containsKey(entry.getKey())
diff --git a/guava/src/com/google/common/collect/FilteredKeySetMultimap.java b/guava/src/com/google/common/collect/FilteredKeySetMultimap.java
index f6fb61d..e492a5c 100644
--- a/guava/src/com/google/common/collect/FilteredKeySetMultimap.java
+++ b/guava/src/com/google/common/collect/FilteredKeySetMultimap.java
@@ -20,6 +20,7 @@
 import com.google.common.base.Predicate;
 import java.util.Map.Entry;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -28,8 +29,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-final class FilteredKeySetMultimap<K, V> extends FilteredKeyMultimap<K, V>
-    implements FilteredSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+final class FilteredKeySetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends FilteredKeyMultimap<K, V> implements FilteredSetMultimap<K, V> {
 
   FilteredKeySetMultimap(SetMultimap<K, V> unfiltered, Predicate<? super K> keyPredicate) {
     super(unfiltered, keyPredicate);
@@ -41,17 +43,17 @@
   }
 
   @Override
-  public Set<V> get(K key) {
+  public Set<V> get(@ParametricNullness K key) {
     return (Set<V>) super.get(key);
   }
 
   @Override
-  public Set<V> removeAll(Object key) {
+  public Set<V> removeAll(@CheckForNull Object key) {
     return (Set<V>) super.removeAll(key);
   }
 
   @Override
-  public Set<V> replaceValues(K key, Iterable<? extends V> values) {
+  public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return (Set<V>) super.replaceValues(key, values);
   }
 
@@ -72,7 +74,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object o) {
+    public boolean equals(@CheckForNull Object o) {
       return Sets.equalsImpl(this, o);
     }
   }
diff --git a/guava/src/com/google/common/collect/FilteredMultimap.java b/guava/src/com/google/common/collect/FilteredMultimap.java
index ef5ed4a..4e1fa06 100644
--- a/guava/src/com/google/common/collect/FilteredMultimap.java
+++ b/guava/src/com/google/common/collect/FilteredMultimap.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Predicate;
 import java.util.Map.Entry;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An interface for all filtered multimap types.
@@ -26,7 +27,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-interface FilteredMultimap<K, V> extends Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+interface FilteredMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends Multimap<K, V> {
   Multimap<K, V> unfiltered();
 
   Predicate<? super Entry<K, V>> entryPredicate();
diff --git a/guava/src/com/google/common/collect/FilteredMultimapValues.java b/guava/src/com/google/common/collect/FilteredMultimapValues.java
index 7e3d257..ecbfab2 100644
--- a/guava/src/com/google/common/collect/FilteredMultimapValues.java
+++ b/guava/src/com/google/common/collect/FilteredMultimapValues.java
@@ -25,6 +25,7 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map.Entry;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -33,7 +34,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-final class FilteredMultimapValues<K, V> extends AbstractCollection<V> {
+@ElementTypesAreNonnullByDefault
+final class FilteredMultimapValues<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractCollection<V> {
   @Weak private final FilteredMultimap<K, V> multimap;
 
   FilteredMultimapValues(FilteredMultimap<K, V> multimap) {
@@ -46,7 +49,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object o) {
+  public boolean contains(@CheckForNull Object o) {
     return multimap.containsValue(o);
   }
 
@@ -56,7 +59,7 @@
   }
 
   @Override
-  public boolean remove(@Nullable Object o) {
+  public boolean remove(@CheckForNull Object o) {
     Predicate<? super Entry<K, V>> entryPredicate = multimap.entryPredicate();
     for (Iterator<Entry<K, V>> unfilteredItr = multimap.unfiltered().entries().iterator();
         unfilteredItr.hasNext(); ) {
diff --git a/guava/src/com/google/common/collect/FilteredSetMultimap.java b/guava/src/com/google/common/collect/FilteredSetMultimap.java
index a0a149f..8e2ff7c 100644
--- a/guava/src/com/google/common/collect/FilteredSetMultimap.java
+++ b/guava/src/com/google/common/collect/FilteredSetMultimap.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A supertype for filtered {@link SetMultimap} implementations.
@@ -24,7 +25,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-interface FilteredSetMultimap<K, V> extends FilteredMultimap<K, V>, SetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+interface FilteredSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends FilteredMultimap<K, V>, SetMultimap<K, V> {
   @Override
   SetMultimap<K, V> unfiltered();
 }
diff --git a/guava/src/com/google/common/collect/FluentIterable.java b/guava/src/com/google/common/collect/FluentIterable.java
index a15bcdd..11bda3b 100644
--- a/guava/src/com/google/common/collect/FluentIterable.java
+++ b/guava/src/com/google/common/collect/FluentIterable.java
@@ -24,13 +24,16 @@
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.InlineMe;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.SortedSet;
 import java.util.stream.Stream;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -106,11 +109,12 @@
  * @since 12.0
  */
 @GwtCompatible(emulated = true)
-public abstract class FluentIterable<E> implements Iterable<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class FluentIterable<E extends @Nullable Object> implements Iterable<E> {
   // We store 'iterable' and use it instead of 'this' to allow Iterables to perform instanceof
   // checks on the _original_ iterable when FluentIterable.from is used.
   // To avoid a self retain cycle under j2objc, we store Optional.absent() instead of
-  // Optional.of(this). To access the iterator delegate, call #getDelegate(), which converts to
+  // Optional.of(this). To access the delegate iterable, call #getDelegate(), which converts to
   // absent() back to 'this'.
   private final Optional<Iterable<E>> iterableDelegate;
 
@@ -120,8 +124,7 @@
   }
 
   FluentIterable(Iterable<E> iterable) {
-    checkNotNull(iterable);
-    this.iterableDelegate = Optional.fromNullable(this != iterable ? iterable : null);
+    this.iterableDelegate = Optional.of(iterable);
   }
 
   private Iterable<E> getDelegate() {
@@ -135,7 +138,7 @@
    * <p><b>{@code Stream} equivalent:</b> {@link Collection#stream} if {@code iterable} is a {@link
    * Collection}; {@link Streams#stream(Iterable)} otherwise.
    */
-  public static <E> FluentIterable<E> from(final Iterable<E> iterable) {
+  public static <E extends @Nullable Object> FluentIterable<E> from(final Iterable<E> iterable) {
     return (iterable instanceof FluentIterable)
         ? (FluentIterable<E>) iterable
         : new FluentIterable<E>(iterable) {
@@ -157,7 +160,7 @@
    * @since 20.0 (since 18.0 as an overload of {@code of})
    */
   @Beta
-  public static <E> FluentIterable<E> from(E[] elements) {
+  public static <E extends @Nullable Object> FluentIterable<E> from(E[] elements) {
     return from(Arrays.asList(elements));
   }
 
@@ -170,7 +173,10 @@
    *     FluentIterable}
    */
   @Deprecated
-  public static <E> FluentIterable<E> from(FluentIterable<E> iterable) {
+  @InlineMe(
+      replacement = "checkNotNull(iterable)",
+      staticImports = {"com.google.common.base.Preconditions.checkNotNull"})
+  public static <E extends @Nullable Object> FluentIterable<E> from(FluentIterable<E> iterable) {
     return checkNotNull(iterable);
   }
 
@@ -187,7 +193,8 @@
    * @since 20.0
    */
   @Beta
-  public static <T> FluentIterable<T> concat(Iterable<? extends T> a, Iterable<? extends T> b) {
+  public static <T extends @Nullable Object> FluentIterable<T> concat(
+      Iterable<? extends T> a, Iterable<? extends T> b) {
     return concatNoDefensiveCopy(a, b);
   }
 
@@ -205,7 +212,7 @@
    * @since 20.0
    */
   @Beta
-  public static <T> FluentIterable<T> concat(
+  public static <T extends @Nullable Object> FluentIterable<T> concat(
       Iterable<? extends T> a, Iterable<? extends T> b, Iterable<? extends T> c) {
     return concatNoDefensiveCopy(a, b, c);
   }
@@ -225,7 +232,7 @@
    * @since 20.0
    */
   @Beta
-  public static <T> FluentIterable<T> concat(
+  public static <T extends @Nullable Object> FluentIterable<T> concat(
       Iterable<? extends T> a,
       Iterable<? extends T> b,
       Iterable<? extends T> c,
@@ -249,7 +256,8 @@
    * @since 20.0
    */
   @Beta
-  public static <T> FluentIterable<T> concat(Iterable<? extends T>... inputs) {
+  public static <T extends @Nullable Object> FluentIterable<T> concat(
+      Iterable<? extends T>... inputs) {
     return concatNoDefensiveCopy(Arrays.copyOf(inputs, inputs.length));
   }
 
@@ -268,7 +276,7 @@
    * @since 20.0
    */
   @Beta
-  public static <T> FluentIterable<T> concat(
+  public static <T extends @Nullable Object> FluentIterable<T> concat(
       final Iterable<? extends Iterable<? extends T>> inputs) {
     checkNotNull(inputs);
     return new FluentIterable<T>() {
@@ -280,7 +288,7 @@
   }
 
   /** Concatenates a varargs array of iterables without making a defensive copy of the array. */
-  private static <T> FluentIterable<T> concatNoDefensiveCopy(
+  private static <T extends @Nullable Object> FluentIterable<T> concatNoDefensiveCopy(
       final Iterable<? extends T>... inputs) {
     for (Iterable<? extends T> input : inputs) {
       checkNotNull(input);
@@ -308,8 +316,8 @@
    * @since 20.0
    */
   @Beta
-  public static <E> FluentIterable<E> of() {
-    return FluentIterable.from(ImmutableList.<E>of());
+  public static <E extends @Nullable Object> FluentIterable<E> of() {
+    return FluentIterable.from(Collections.<E>emptyList());
   }
 
   /**
@@ -321,7 +329,8 @@
    * @since 20.0
    */
   @Beta
-  public static <E> FluentIterable<E> of(@Nullable E element, E... elements) {
+  public static <E extends @Nullable Object> FluentIterable<E> of(
+      @ParametricNullness E element, E... elements) {
     return from(Lists.asList(element, elements));
   }
 
@@ -352,7 +361,7 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@code stream.anyMatch(Predicate.isEqual(target))}.
    */
-  public final boolean contains(@Nullable Object target) {
+  public final boolean contains(@CheckForNull Object target) {
     return Iterables.contains(getDelegate(), target);
   }
 
@@ -462,6 +471,7 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@code stream.filter(predicate).findFirst()}.
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final Optional<E> firstMatch(Predicate<? super E> predicate) {
     return Iterables.tryFind(getDelegate(), predicate);
   }
@@ -476,7 +486,8 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link Stream#map}.
    */
-  public final <T> FluentIterable<T> transform(Function<? super E, T> function) {
+  public final <T extends @Nullable Object> FluentIterable<T> transform(
+      Function<? super E, T> function) {
     return from(Iterables.transform(getDelegate(), function));
   }
 
@@ -493,7 +504,7 @@
    *
    * @since 13.0 (required {@code Function<E, Iterable<T>>} until 14.0)
    */
-  public <T> FluentIterable<T> transformAndConcat(
+  public <T extends @Nullable Object> FluentIterable<T> transformAndConcat(
       Function<? super E, ? extends Iterable<? extends T>> function) {
     return FluentIterable.concat(transform(function));
   }
@@ -508,6 +519,7 @@
    * @throws NullPointerException if the first element is null; if this is a possibility, use {@code
    *     iterator().next()} or {@link Iterables#getFirst} instead.
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final Optional<E> first() {
     Iterator<E> iterator = getDelegate().iterator();
     return iterator.hasNext() ? Optional.of(iterator.next()) : Optional.<E>absent();
@@ -524,6 +536,7 @@
    * @throws NullPointerException if the last element is null; if this is a possibility, use {@link
    *     Iterables#getLast} instead.
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final Optional<E> last() {
     // Iterables#getLast was inlined here so we don't have to throw/catch a NSEE
 
@@ -613,6 +626,7 @@
    * @throws NullPointerException if any element is {@code null}
    * @since 14.0 (since 12.0 as {@code toImmutableList()}).
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final ImmutableList<E> toList() {
     return ImmutableList.copyOf(getDelegate());
   }
@@ -629,6 +643,7 @@
    * @throws NullPointerException if any element of this iterable is {@code null}
    * @since 14.0 (since 13.0 as {@code toSortedImmutableList()}).
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final ImmutableList<E> toSortedList(Comparator<? super E> comparator) {
     return Ordering.from(comparator).immutableSortedCopy(getDelegate());
   }
@@ -643,6 +658,7 @@
    * @throws NullPointerException if any element is {@code null}
    * @since 14.0 (since 12.0 as {@code toImmutableSet()}).
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final ImmutableSet<E> toSet() {
     return ImmutableSet.copyOf(getDelegate());
   }
@@ -660,6 +676,7 @@
    * @throws NullPointerException if any element of this iterable is {@code null}
    * @since 14.0 (since 12.0 as {@code toImmutableSortedSet()}).
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final ImmutableSortedSet<E> toSortedSet(Comparator<? super E> comparator) {
     return ImmutableSortedSet.copyOf(comparator, getDelegate());
   }
@@ -673,6 +690,7 @@
    * @throws NullPointerException if any element is null
    * @since 19.0
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final ImmutableMultiset<E> toMultiset() {
     return ImmutableMultiset.copyOf(getDelegate());
   }
@@ -693,6 +711,7 @@
    *     valueFunction} produces {@code null} for any key
    * @since 14.0
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final <V> ImmutableMap<E, V> toMap(Function<? super E, V> valueFunction) {
     return Maps.toMap(getDelegate(), valueFunction);
   }
@@ -715,6 +734,7 @@
    *     keyFunction} produces {@code null} for any key
    * @since 14.0
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final <K> ImmutableListMultimap<K, E> index(Function<? super E, K> keyFunction) {
     return Multimaps.index(getDelegate(), keyFunction);
   }
@@ -749,6 +769,7 @@
    *     keyFunction} produces {@code null} for any key
    * @since 14.0
    */
+  @SuppressWarnings("nullness") // Unsafe, but we can't do much about it now.
   public final <K> ImmutableMap<K, E> uniqueIndex(Function<? super E, K> keyFunction) {
     return Maps.uniqueIndex(getDelegate(), keyFunction);
   }
@@ -766,7 +787,15 @@
    *     copied
    */
   @GwtIncompatible // Array.newArray(Class, int)
-  public final E[] toArray(Class<E> type) {
+  /*
+   * Both the declaration of our Class<E> parameter and its usage in a call to Iterables.toArray
+   * produce a nullness error: E may be a nullable type, and our nullness checker has Class's type
+   * parameter bounded to non-null types. To avoid that, we'd use Class<@Nonnull E> if we could.
+   * (Granted, this is only one of many nullness-checking problems that arise from letting
+   * FluentIterable support null elements, and most of the other produce outright unsoundness.)
+   */
+  @SuppressWarnings("nullness")
+  public final @Nullable E[] toArray(Class<E> type) {
     return Iterables.toArray(getDelegate(), type);
   }
 
@@ -822,7 +851,7 @@
    * @throws IndexOutOfBoundsException if {@code position} is negative or greater than or equal to
    *     the size of this fluent iterable
    */
-  // TODO(kevinb): add @Nullable?
+  @ParametricNullness
   public final E get(int position) {
     return Iterables.get(getDelegate(), position);
   }
@@ -842,7 +871,8 @@
   }
 
   /** Function that transforms {@code Iterable<E>} into a fluent iterable. */
-  private static class FromIterableFunction<E> implements Function<Iterable<E>, FluentIterable<E>> {
+  private static class FromIterableFunction<E extends @Nullable Object>
+      implements Function<Iterable<E>, FluentIterable<E>> {
     @Override
     public FluentIterable<E> apply(Iterable<E> fromObject) {
       return FluentIterable.from(fromObject);
diff --git a/guava/src/com/google/common/collect/ForwardingBlockingDeque.java b/guava/src/com/google/common/collect/ForwardingBlockingDeque.java
index 7d3895d..49d4bcf 100644
--- a/guava/src/com/google/common/collect/ForwardingBlockingDeque.java
+++ b/guava/src/com/google/common/collect/ForwardingBlockingDeque.java
@@ -20,6 +20,7 @@
 import java.util.Collection;
 import java.util.concurrent.BlockingDeque;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link BlockingDeque} which forwards all its method calls to another {@code BlockingDeque}.
@@ -46,6 +47,7 @@
  */
 @Deprecated
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingBlockingDeque<E> extends ForwardingDeque<E>
     implements BlockingDeque<E> {
 
@@ -91,11 +93,13 @@
   }
 
   @Override
+  @CheckForNull
   public E pollFirst(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().pollFirst(timeout, unit);
   }
 
   @Override
+  @CheckForNull
   public E pollLast(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().pollLast(timeout, unit);
   }
@@ -116,6 +120,7 @@
   }
 
   @Override
+  @CheckForNull
   public E poll(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().poll(timeout, unit);
   }
diff --git a/guava/src/com/google/common/collect/ForwardingCollection.java b/guava/src/com/google/common/collect/ForwardingCollection.java
index 66219c8..ca1edc1 100644
--- a/guava/src/com/google/common/collect/ForwardingCollection.java
+++ b/guava/src/com/google/common/collect/ForwardingCollection.java
@@ -21,6 +21,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Collection;
 import java.util.Iterator;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -46,7 +47,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingCollection<E> extends ForwardingObject implements Collection<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingCollection<E extends @Nullable Object> extends ForwardingObject
+    implements Collection<E> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -77,19 +80,19 @@
   }
 
   @Override
-  public boolean contains(Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return delegate().contains(object);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean add(E element) {
+  public boolean add(@ParametricNullness E element) {
     return delegate().add(element);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean remove(Object object) {
+  public boolean remove(@CheckForNull Object object) {
     return delegate().remove(object);
   }
 
@@ -116,13 +119,14 @@
   }
 
   @Override
-  public Object[] toArray() {
+  public @Nullable Object[] toArray() {
     return delegate().toArray();
   }
 
   @CanIgnoreReturnValue
   @Override
-  public <T> T[] toArray(T[] array) {
+  @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+  public <T extends @Nullable Object> T[] toArray(T[] array) {
     return delegate().toArray(array);
   }
 
@@ -133,7 +137,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardContains(@Nullable Object object) {
+  protected boolean standardContains(@CheckForNull Object object) {
     return Iterators.contains(iterator(), object);
   }
 
@@ -165,7 +169,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardRemove(@Nullable Object object) {
+  protected boolean standardRemove(@CheckForNull Object object) {
     Iterator<E> iterator = iterator();
     while (iterator.hasNext()) {
       if (Objects.equal(iterator.next(), object)) {
@@ -238,8 +242,8 @@
    *
    * @since 7.0
    */
-  protected Object[] standardToArray() {
-    Object[] newArray = new Object[size()];
+  protected @Nullable Object[] standardToArray() {
+    @Nullable Object[] newArray = new @Nullable Object[size()];
     return toArray(newArray);
   }
 
@@ -250,7 +254,7 @@
    *
    * @since 7.0
    */
-  protected <T> T[] standardToArray(T[] array) {
+  protected <T extends @Nullable Object> T[] standardToArray(T[] array) {
     return ObjectArrays.toArrayImpl(this, array);
   }
 }
diff --git a/guava/src/com/google/common/collect/ForwardingConcurrentMap.java b/guava/src/com/google/common/collect/ForwardingConcurrentMap.java
index 0910424..b662b07 100644
--- a/guava/src/com/google/common/collect/ForwardingConcurrentMap.java
+++ b/guava/src/com/google/common/collect/ForwardingConcurrentMap.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.concurrent.ConcurrentMap;
+import javax.annotation.CheckForNull;
 
 /**
  * A concurrent map which forwards all its method calls to another concurrent map. Subclasses should
@@ -36,6 +37,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingConcurrentMap<K, V> extends ForwardingMap<K, V>
     implements ConcurrentMap<K, V> {
 
@@ -47,18 +49,20 @@
 
   @CanIgnoreReturnValue
   @Override
+  @CheckForNull
   public V putIfAbsent(K key, V value) {
     return delegate().putIfAbsent(key, value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean remove(Object key, Object value) {
+  public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
     return delegate().remove(key, value);
   }
 
   @CanIgnoreReturnValue
   @Override
+  @CheckForNull
   public V replace(K key, V value) {
     return delegate().replace(key, value);
   }
diff --git a/guava/src/com/google/common/collect/ForwardingDeque.java b/guava/src/com/google/common/collect/ForwardingDeque.java
index 87ac71b..571535c 100644
--- a/guava/src/com/google/common/collect/ForwardingDeque.java
+++ b/guava/src/com/google/common/collect/ForwardingDeque.java
@@ -20,6 +20,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Deque;
 import java.util.Iterator;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A deque which forwards all its method calls to another deque. Subclasses should override one or
@@ -39,7 +41,9 @@
  * @since 12.0
  */
 @GwtIncompatible
-public abstract class ForwardingDeque<E> extends ForwardingQueue<E> implements Deque<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingDeque<E extends @Nullable Object> extends ForwardingQueue<E>
+    implements Deque<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingDeque() {}
@@ -48,12 +52,12 @@
   protected abstract Deque<E> delegate();
 
   @Override
-  public void addFirst(E e) {
+  public void addFirst(@ParametricNullness E e) {
     delegate().addFirst(e);
   }
 
   @Override
-  public void addLast(E e) {
+  public void addLast(@ParametricNullness E e) {
     delegate().addLast(e);
   }
 
@@ -63,81 +67,90 @@
   }
 
   @Override
+  @ParametricNullness
   public E getFirst() {
     return delegate().getFirst();
   }
 
   @Override
+  @ParametricNullness
   public E getLast() {
     return delegate().getLast();
   }
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
-  public boolean offerFirst(E e) {
+  public boolean offerFirst(@ParametricNullness E e) {
     return delegate().offerFirst(e);
   }
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
-  public boolean offerLast(E e) {
+  public boolean offerLast(@ParametricNullness E e) {
     return delegate().offerLast(e);
   }
 
   @Override
+  @CheckForNull
   public E peekFirst() {
     return delegate().peekFirst();
   }
 
   @Override
+  @CheckForNull
   public E peekLast() {
     return delegate().peekLast();
   }
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
+  @CheckForNull
   public E pollFirst() {
     return delegate().pollFirst();
   }
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
+  @CheckForNull
   public E pollLast() {
     return delegate().pollLast();
   }
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E pop() {
     return delegate().pop();
   }
 
   @Override
-  public void push(E e) {
+  public void push(@ParametricNullness E e) {
     delegate().push(e);
   }
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E removeFirst() {
     return delegate().removeFirst();
   }
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E removeLast() {
     return delegate().removeLast();
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean removeFirstOccurrence(Object o) {
+  public boolean removeFirstOccurrence(@CheckForNull Object o) {
     return delegate().removeFirstOccurrence(o);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean removeLastOccurrence(Object o) {
+  public boolean removeLastOccurrence(@CheckForNull Object o) {
     return delegate().removeLastOccurrence(o);
   }
 }
diff --git a/guava/src/com/google/common/collect/ForwardingImmutableCollection.java b/guava/src/com/google/common/collect/ForwardingImmutableCollection.java
index c0b9c5e..043fe58 100644
--- a/guava/src/com/google/common/collect/ForwardingImmutableCollection.java
+++ b/guava/src/com/google/common/collect/ForwardingImmutableCollection.java
@@ -24,6 +24,7 @@
  * @author Hayward Chan
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 class ForwardingImmutableCollection {
   private ForwardingImmutableCollection() {}
 }
diff --git a/guava/src/com/google/common/collect/ForwardingImmutableList.java b/guava/src/com/google/common/collect/ForwardingImmutableList.java
index 2b9092e..bd5480d 100644
--- a/guava/src/com/google/common/collect/ForwardingImmutableList.java
+++ b/guava/src/com/google/common/collect/ForwardingImmutableList.java
@@ -24,6 +24,7 @@
  * @author Chris Povirk
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingImmutableList<E> {
   private ForwardingImmutableList() {}
 }
diff --git a/guava/src/com/google/common/collect/ForwardingImmutableMap.java b/guava/src/com/google/common/collect/ForwardingImmutableMap.java
index a367157..22cc9ff 100644
--- a/guava/src/com/google/common/collect/ForwardingImmutableMap.java
+++ b/guava/src/com/google/common/collect/ForwardingImmutableMap.java
@@ -24,6 +24,7 @@
  * @author Chris Povirk
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingImmutableMap<K, V> {
   private ForwardingImmutableMap() {}
 }
diff --git a/guava/src/com/google/common/collect/ForwardingImmutableSet.java b/guava/src/com/google/common/collect/ForwardingImmutableSet.java
index c7d7bf6..047d5fd 100644
--- a/guava/src/com/google/common/collect/ForwardingImmutableSet.java
+++ b/guava/src/com/google/common/collect/ForwardingImmutableSet.java
@@ -24,6 +24,7 @@
  * @author Chris Povirk
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingImmutableSet<E> {
   private ForwardingImmutableSet() {}
 }
diff --git a/guava/src/com/google/common/collect/ForwardingIterator.java b/guava/src/com/google/common/collect/ForwardingIterator.java
index 5ecd3d2..1f5a8f1 100644
--- a/guava/src/com/google/common/collect/ForwardingIterator.java
+++ b/guava/src/com/google/common/collect/ForwardingIterator.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Iterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An iterator which forwards all its method calls to another iterator. Subclasses should override
@@ -36,7 +37,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingIterator<T> extends ForwardingObject implements Iterator<T> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingIterator<T extends @Nullable Object> extends ForwardingObject
+    implements Iterator<T> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingIterator() {}
@@ -51,6 +54,7 @@
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public T next() {
     return delegate().next();
   }
diff --git a/guava/src/com/google/common/collect/ForwardingList.java b/guava/src/com/google/common/collect/ForwardingList.java
index d2ba154..4b4551e 100644
--- a/guava/src/com/google/common/collect/ForwardingList.java
+++ b/guava/src/com/google/common/collect/ForwardingList.java
@@ -23,6 +23,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -51,7 +52,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingList<E> extends ForwardingCollection<E> implements List<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingList<E extends @Nullable Object> extends ForwardingCollection<E>
+    implements List<E> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -61,7 +64,7 @@
   protected abstract List<E> delegate();
 
   @Override
-  public void add(int index, E element) {
+  public void add(int index, @ParametricNullness E element) {
     delegate().add(index, element);
   }
 
@@ -72,17 +75,18 @@
   }
 
   @Override
+  @ParametricNullness
   public E get(int index) {
     return delegate().get(index);
   }
 
   @Override
-  public int indexOf(Object element) {
+  public int indexOf(@CheckForNull Object element) {
     return delegate().indexOf(element);
   }
 
   @Override
-  public int lastIndexOf(Object element) {
+  public int lastIndexOf(@CheckForNull Object element) {
     return delegate().lastIndexOf(element);
   }
 
@@ -98,13 +102,15 @@
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E remove(int index) {
     return delegate().remove(index);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public E set(int index, E element) {
+  @ParametricNullness
+  public E set(int index, @ParametricNullness E element) {
     return delegate().set(index, element);
   }
 
@@ -114,7 +120,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this || delegate().equals(object);
   }
 
@@ -130,7 +136,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardAdd(E element) {
+  protected boolean standardAdd(@ParametricNullness E element) {
     add(size(), element);
     return true;
   }
@@ -153,7 +159,7 @@
    *
    * @since 7.0
    */
-  protected int standardIndexOf(@Nullable Object element) {
+  protected int standardIndexOf(@CheckForNull Object element) {
     return Lists.indexOfImpl(this, element);
   }
 
@@ -164,7 +170,7 @@
    *
    * @since 7.0
    */
-  protected int standardLastIndexOf(@Nullable Object element) {
+  protected int standardLastIndexOf(@CheckForNull Object element) {
     return Lists.lastIndexOfImpl(this, element);
   }
 
@@ -222,7 +228,7 @@
    * @since 7.0
    */
   @Beta
-  protected boolean standardEquals(@Nullable Object object) {
+  protected boolean standardEquals(@CheckForNull Object object) {
     return Lists.equalsImpl(this, object);
   }
 
diff --git a/guava/src/com/google/common/collect/ForwardingListIterator.java b/guava/src/com/google/common/collect/ForwardingListIterator.java
index bc2a5ad..a2ac32b 100644
--- a/guava/src/com/google/common/collect/ForwardingListIterator.java
+++ b/guava/src/com/google/common/collect/ForwardingListIterator.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.ListIterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A list iterator which forwards all its method calls to another list iterator. Subclasses should
@@ -36,8 +37,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingListIterator<E> extends ForwardingIterator<E>
-    implements ListIterator<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingListIterator<E extends @Nullable Object>
+    extends ForwardingIterator<E> implements ListIterator<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingListIterator() {}
@@ -46,7 +48,7 @@
   protected abstract ListIterator<E> delegate();
 
   @Override
-  public void add(E element) {
+  public void add(@ParametricNullness E element) {
     delegate().add(element);
   }
 
@@ -62,6 +64,7 @@
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E previous() {
     return delegate().previous();
   }
@@ -72,7 +75,7 @@
   }
 
   @Override
-  public void set(E element) {
+  public void set(@ParametricNullness E element) {
     delegate().set(element);
   }
 }
diff --git a/guava/src/com/google/common/collect/ForwardingListMultimap.java b/guava/src/com/google/common/collect/ForwardingListMultimap.java
index c67d56c..11779c0 100644
--- a/guava/src/com/google/common/collect/ForwardingListMultimap.java
+++ b/guava/src/com/google/common/collect/ForwardingListMultimap.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.List;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -34,8 +35,9 @@
  * @since 3.0
  */
 @GwtCompatible
-public abstract class ForwardingListMultimap<K, V> extends ForwardingMultimap<K, V>
-    implements ListMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingMultimap<K, V> implements ListMultimap<K, V> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingListMultimap() {}
@@ -44,19 +46,19 @@
   protected abstract ListMultimap<K, V> delegate();
 
   @Override
-  public List<V> get(@Nullable K key) {
+  public List<V> get(@ParametricNullness K key) {
     return delegate().get(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public List<V> removeAll(@Nullable Object key) {
+  public List<V> removeAll(@CheckForNull Object key) {
     return delegate().removeAll(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public List<V> replaceValues(K key, Iterable<? extends V> values) {
+  public List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return delegate().replaceValues(key, values);
   }
 }
diff --git a/guava/src/com/google/common/collect/ForwardingMap.java b/guava/src/com/google/common/collect/ForwardingMap.java
index 3a6aa52..315a4fa 100644
--- a/guava/src/com/google/common/collect/ForwardingMap.java
+++ b/guava/src/com/google/common/collect/ForwardingMap.java
@@ -24,6 +24,7 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -55,7 +56,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingMap<K, V> extends ForwardingObject implements Map<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingObject implements Map<K, V> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -76,7 +79,8 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(Object key) {
+  @CheckForNull
+  public V remove(@CheckForNull Object key) {
     return delegate().remove(key);
   }
 
@@ -86,23 +90,25 @@
   }
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return delegate().containsKey(key);
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return delegate().containsValue(value);
   }
 
   @Override
-  public V get(@Nullable Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     return delegate().get(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public V put(K key, V value) {
+  @CheckForNull
+  public V put(@ParametricNullness K key, @ParametricNullness V value) {
     return delegate().put(key, value);
   }
 
@@ -127,7 +133,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this || delegate().equals(object);
   }
 
@@ -158,7 +164,8 @@
    * @since 7.0
    */
   @Beta
-  protected V standardRemove(@Nullable Object key) {
+  @CheckForNull
+  protected V standardRemove(@CheckForNull Object key) {
     Iterator<Entry<K, V>> entryIterator = entrySet().iterator();
     while (entryIterator.hasNext()) {
       Entry<K, V> entry = entryIterator.next();
@@ -207,7 +214,7 @@
    * @since 7.0
    */
   @Beta
-  protected boolean standardContainsKey(@Nullable Object key) {
+  protected boolean standardContainsKey(@CheckForNull Object key) {
     return Maps.containsKeyImpl(this, key);
   }
 
@@ -235,7 +242,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardContainsValue(@Nullable Object value) {
+  protected boolean standardContainsValue(@CheckForNull Object value) {
     return Maps.containsValueImpl(this, value);
   }
 
@@ -277,7 +284,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardEquals(@Nullable Object object) {
+  protected boolean standardEquals(@CheckForNull Object object) {
     return Maps.equalsImpl(this, object);
   }
 
diff --git a/guava/src/com/google/common/collect/ForwardingMapEntry.java b/guava/src/com/google/common/collect/ForwardingMapEntry.java
index c775986..6816ccb 100644
--- a/guava/src/com/google/common/collect/ForwardingMapEntry.java
+++ b/guava/src/com/google/common/collect/ForwardingMapEntry.java
@@ -21,6 +21,7 @@
 import com.google.common.base.Objects;
 import java.util.Map;
 import java.util.Map.Entry;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -47,7 +48,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingMapEntry<K, V> extends ForwardingObject implements Map.Entry<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingMapEntry<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingObject implements Map.Entry<K, V> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -57,22 +60,25 @@
   protected abstract Entry<K, V> delegate();
 
   @Override
+  @ParametricNullness
   public K getKey() {
     return delegate().getKey();
   }
 
   @Override
+  @ParametricNullness
   public V getValue() {
     return delegate().getValue();
   }
 
   @Override
-  public V setValue(V value) {
+  @ParametricNullness
+  public V setValue(@ParametricNullness V value) {
     return delegate().setValue(value);
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return delegate().equals(object);
   }
 
@@ -88,7 +94,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardEquals(@Nullable Object object) {
+  protected boolean standardEquals(@CheckForNull Object object) {
     if (object instanceof Entry) {
       Entry<?, ?> that = (Entry<?, ?>) object;
       return Objects.equal(this.getKey(), that.getKey())
diff --git a/guava/src/com/google/common/collect/ForwardingMultimap.java b/guava/src/com/google/common/collect/ForwardingMultimap.java
index bc6d902..a3db061 100644
--- a/guava/src/com/google/common/collect/ForwardingMultimap.java
+++ b/guava/src/com/google/common/collect/ForwardingMultimap.java
@@ -22,6 +22,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -37,7 +38,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingMultimap<K, V> extends ForwardingObject implements Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingObject implements Multimap<K, V> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingMultimap() {}
@@ -56,17 +59,17 @@
   }
 
   @Override
-  public boolean containsEntry(@Nullable Object key, @Nullable Object value) {
+  public boolean containsEntry(@CheckForNull Object key, @CheckForNull Object value) {
     return delegate().containsEntry(key, value);
   }
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return delegate().containsKey(key);
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return delegate().containsValue(value);
   }
 
@@ -76,7 +79,7 @@
   }
 
   @Override
-  public Collection<V> get(@Nullable K key) {
+  public Collection<V> get(@ParametricNullness K key) {
     return delegate().get(key);
   }
 
@@ -97,13 +100,13 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean put(K key, V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     return delegate().put(key, value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean putAll(K key, Iterable<? extends V> values) {
+  public boolean putAll(@ParametricNullness K key, Iterable<? extends V> values) {
     return delegate().putAll(key, values);
   }
 
@@ -115,19 +118,19 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean remove(@Nullable Object key, @Nullable Object value) {
+  public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
     return delegate().remove(key, value);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public Collection<V> removeAll(@Nullable Object key) {
+  public Collection<V> removeAll(@CheckForNull Object key) {
     return delegate().removeAll(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public Collection<V> replaceValues(K key, Iterable<? extends V> values) {
+  public Collection<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return delegate().replaceValues(key, values);
   }
 
@@ -142,7 +145,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this || delegate().equals(object);
   }
 
diff --git a/guava/src/com/google/common/collect/ForwardingMultiset.java b/guava/src/com/google/common/collect/ForwardingMultiset.java
index 6bf5c33..857b9ae 100644
--- a/guava/src/com/google/common/collect/ForwardingMultiset.java
+++ b/guava/src/com/google/common/collect/ForwardingMultiset.java
@@ -23,6 +23,7 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -48,7 +49,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingMultiset<E> extends ForwardingCollection<E> implements Multiset<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingMultiset<E extends @Nullable Object> extends ForwardingCollection<E>
+    implements Multiset<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingMultiset() {}
@@ -57,19 +60,19 @@
   protected abstract Multiset<E> delegate();
 
   @Override
-  public int count(Object element) {
+  public int count(@CheckForNull Object element) {
     return delegate().count(element);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public int add(E element, int occurrences) {
+  public int add(@ParametricNullness E element, int occurrences) {
     return delegate().add(element, occurrences);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public int remove(Object element, int occurrences) {
+  public int remove(@CheckForNull Object element, int occurrences) {
     return delegate().remove(element, occurrences);
   }
 
@@ -84,7 +87,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this || delegate().equals(object);
   }
 
@@ -95,13 +98,13 @@
 
   @CanIgnoreReturnValue
   @Override
-  public int setCount(E element, int count) {
+  public int setCount(@ParametricNullness E element, int count) {
     return delegate().setCount(element, count);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean setCount(E element, int oldCount, int newCount) {
+  public boolean setCount(@ParametricNullness E element, int oldCount, int newCount) {
     return delegate().setCount(element, oldCount, newCount);
   }
 
@@ -112,7 +115,7 @@
    * @since 7.0
    */
   @Override
-  protected boolean standardContains(@Nullable Object object) {
+  protected boolean standardContains(@CheckForNull Object object) {
     return count(object) > 0;
   }
 
@@ -136,7 +139,7 @@
    * @since 7.0
    */
   @Beta
-  protected int standardCount(@Nullable Object object) {
+  protected int standardCount(@CheckForNull Object object) {
     for (Entry<?> entry : this.entrySet()) {
       if (Objects.equal(entry.getElement(), object)) {
         return entry.getCount();
@@ -152,7 +155,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardAdd(E element) {
+  protected boolean standardAdd(@ParametricNullness E element) {
     add(element, 1);
     return true;
   }
@@ -178,7 +181,7 @@
    * @since 7.0
    */
   @Override
-  protected boolean standardRemove(Object element) {
+  protected boolean standardRemove(@CheckForNull Object element) {
     return remove(element, 1) > 0;
   }
 
@@ -214,7 +217,7 @@
    *
    * @since 7.0
    */
-  protected int standardSetCount(E element, int count) {
+  protected int standardSetCount(@ParametricNullness E element, int count) {
     return Multisets.setCountImpl(this, element, count);
   }
 
@@ -225,7 +228,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardSetCount(E element, int oldCount, int newCount) {
+  protected boolean standardSetCount(@ParametricNullness E element, int oldCount, int newCount) {
     return Multisets.setCountImpl(this, element, oldCount, newCount);
   }
 
@@ -285,7 +288,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardEquals(@Nullable Object object) {
+  protected boolean standardEquals(@CheckForNull Object object) {
     return Multisets.equalsImpl(this, object);
   }
 
diff --git a/guava/src/com/google/common/collect/ForwardingNavigableMap.java b/guava/src/com/google/common/collect/ForwardingNavigableMap.java
index 5f23d05..c32468d 100644
--- a/guava/src/com/google/common/collect/ForwardingNavigableMap.java
+++ b/guava/src/com/google/common/collect/ForwardingNavigableMap.java
@@ -16,7 +16,6 @@
 
 package com.google.common.collect;
 
-import static com.google.common.collect.CollectPreconditions.checkRemove;
 import static com.google.common.collect.Maps.keyOrNull;
 
 import com.google.common.annotations.Beta;
@@ -27,6 +26,8 @@
 import java.util.NoSuchElementException;
 import java.util.SortedMap;
 import java.util.function.BiFunction;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A navigable map which forwards all its method calls to another navigable map. Subclasses should
@@ -55,8 +56,9 @@
  * @since 12.0
  */
 @GwtIncompatible
-public abstract class ForwardingNavigableMap<K, V> extends ForwardingSortedMap<K, V>
-    implements NavigableMap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingNavigableMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingSortedMap<K, V> implements NavigableMap<K, V> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingNavigableMap() {}
@@ -65,7 +67,8 @@
   protected abstract NavigableMap<K, V> delegate();
 
   @Override
-  public Entry<K, V> lowerEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> lowerEntry(@ParametricNullness K key) {
     return delegate().lowerEntry(key);
   }
 
@@ -74,12 +77,14 @@
    * #headMap(Object, boolean)}. If you override {@code headMap}, you may wish to override {@code
    * lowerEntry} to forward to this implementation.
    */
-  protected Entry<K, V> standardLowerEntry(K key) {
+  @CheckForNull
+  protected Entry<K, V> standardLowerEntry(@ParametricNullness K key) {
     return headMap(key, false).lastEntry();
   }
 
   @Override
-  public K lowerKey(K key) {
+  @CheckForNull
+  public K lowerKey(@ParametricNullness K key) {
     return delegate().lowerKey(key);
   }
 
@@ -88,12 +93,14 @@
    * {@link #lowerEntry}, you may wish to override {@code lowerKey} to forward to this
    * implementation.
    */
-  protected K standardLowerKey(K key) {
+  @CheckForNull
+  protected K standardLowerKey(@ParametricNullness K key) {
     return keyOrNull(lowerEntry(key));
   }
 
   @Override
-  public Entry<K, V> floorEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> floorEntry(@ParametricNullness K key) {
     return delegate().floorEntry(key);
   }
 
@@ -102,12 +109,14 @@
    * #headMap(Object, boolean)}. If you override {@code headMap}, you may wish to override {@code
    * floorEntry} to forward to this implementation.
    */
-  protected Entry<K, V> standardFloorEntry(K key) {
+  @CheckForNull
+  protected Entry<K, V> standardFloorEntry(@ParametricNullness K key) {
     return headMap(key, true).lastEntry();
   }
 
   @Override
-  public K floorKey(K key) {
+  @CheckForNull
+  public K floorKey(@ParametricNullness K key) {
     return delegate().floorKey(key);
   }
 
@@ -116,12 +125,14 @@
    * {@code floorEntry}, you may wish to override {@code floorKey} to forward to this
    * implementation.
    */
-  protected K standardFloorKey(K key) {
+  @CheckForNull
+  protected K standardFloorKey(@ParametricNullness K key) {
     return keyOrNull(floorEntry(key));
   }
 
   @Override
-  public Entry<K, V> ceilingEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> ceilingEntry(@ParametricNullness K key) {
     return delegate().ceilingEntry(key);
   }
 
@@ -130,12 +141,14 @@
    * #tailMap(Object, boolean)}. If you override {@code tailMap}, you may wish to override {@code
    * ceilingEntry} to forward to this implementation.
    */
-  protected Entry<K, V> standardCeilingEntry(K key) {
+  @CheckForNull
+  protected Entry<K, V> standardCeilingEntry(@ParametricNullness K key) {
     return tailMap(key, true).firstEntry();
   }
 
   @Override
-  public K ceilingKey(K key) {
+  @CheckForNull
+  public K ceilingKey(@ParametricNullness K key) {
     return delegate().ceilingKey(key);
   }
 
@@ -144,12 +157,14 @@
    * {@code ceilingEntry}, you may wish to override {@code ceilingKey} to forward to this
    * implementation.
    */
-  protected K standardCeilingKey(K key) {
+  @CheckForNull
+  protected K standardCeilingKey(@ParametricNullness K key) {
     return keyOrNull(ceilingEntry(key));
   }
 
   @Override
-  public Entry<K, V> higherEntry(K key) {
+  @CheckForNull
+  public Entry<K, V> higherEntry(@ParametricNullness K key) {
     return delegate().higherEntry(key);
   }
 
@@ -158,12 +173,14 @@
    * #tailMap(Object, boolean)}. If you override {@code tailMap}, you may wish to override {@code
    * higherEntry} to forward to this implementation.
    */
-  protected Entry<K, V> standardHigherEntry(K key) {
+  @CheckForNull
+  protected Entry<K, V> standardHigherEntry(@ParametricNullness K key) {
     return tailMap(key, false).firstEntry();
   }
 
   @Override
-  public K higherKey(K key) {
+  @CheckForNull
+  public K higherKey(@ParametricNullness K key) {
     return delegate().higherKey(key);
   }
 
@@ -172,11 +189,13 @@
    * {@code higherEntry}, you may wish to override {@code higherKey} to forward to this
    * implementation.
    */
-  protected K standardHigherKey(K key) {
+  @CheckForNull
+  protected K standardHigherKey(@ParametricNullness K key) {
     return keyOrNull(higherEntry(key));
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> firstEntry() {
     return delegate().firstEntry();
   }
@@ -186,6 +205,7 @@
    * #entrySet}. If you override {@code entrySet}, you may wish to override {@code firstEntry} to
    * forward to this implementation.
    */
+  @CheckForNull
   protected Entry<K, V> standardFirstEntry() {
     return Iterables.getFirst(entrySet(), null);
   }
@@ -205,6 +225,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> lastEntry() {
     return delegate().lastEntry();
   }
@@ -214,6 +235,7 @@
    * #entrySet} of {@link #descendingMap}. If you override {@code descendingMap}, you may wish to
    * override {@code lastEntry} to forward to this implementation.
    */
+  @CheckForNull
   protected Entry<K, V> standardLastEntry() {
     return Iterables.getFirst(descendingMap().entrySet(), null);
   }
@@ -232,6 +254,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> pollFirstEntry() {
     return delegate().pollFirstEntry();
   }
@@ -241,11 +264,13 @@
    * entrySet}. If you override {@code entrySet}, you may wish to override {@code pollFirstEntry} to
    * forward to this implementation.
    */
+  @CheckForNull
   protected Entry<K, V> standardPollFirstEntry() {
     return Iterators.pollNext(entrySet().iterator());
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> pollLastEntry() {
     return delegate().pollLastEntry();
   }
@@ -255,6 +280,7 @@
    * entrySet} of {@code descendingMap}. If you override {@code descendingMap}, you may wish to
    * override {@code pollFirstEntry} to forward to this implementation.
    */
+  @CheckForNull
   protected Entry<K, V> standardPollLastEntry() {
     return Iterators.pollNext(descendingMap().entrySet().iterator());
   }
@@ -293,8 +319,8 @@
     @Override
     protected Iterator<Entry<K, V>> entryIterator() {
       return new Iterator<Entry<K, V>>() {
-        private Entry<K, V> toRemove = null;
-        private Entry<K, V> nextOrNull = forward().lastEntry();
+        @CheckForNull private Entry<K, V> toRemove = null;
+        @CheckForNull private Entry<K, V> nextOrNull = forward().lastEntry();
 
         @Override
         public boolean hasNext() {
@@ -303,7 +329,7 @@
 
         @Override
         public java.util.Map.Entry<K, V> next() {
-          if (!hasNext()) {
+          if (nextOrNull == null) {
             throw new NoSuchElementException();
           }
           try {
@@ -316,7 +342,9 @@
 
         @Override
         public void remove() {
-          checkRemove(toRemove != null);
+          if (toRemove == null) {
+            throw new IllegalStateException("no calls to next() since the last call to remove()");
+          }
           forward().remove(toRemove.getKey());
           toRemove = null;
         }
@@ -368,22 +396,27 @@
    * wish to override {@code subMap} to forward to this implementation.
    */
   @Override
-  protected SortedMap<K, V> standardSubMap(K fromKey, K toKey) {
+  protected SortedMap<K, V> standardSubMap(
+      @ParametricNullness K fromKey, @ParametricNullness K toKey) {
     return subMap(fromKey, true, toKey, false);
   }
 
   @Override
-  public NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+  public NavigableMap<K, V> subMap(
+      @ParametricNullness K fromKey,
+      boolean fromInclusive,
+      @ParametricNullness K toKey,
+      boolean toInclusive) {
     return delegate().subMap(fromKey, fromInclusive, toKey, toInclusive);
   }
 
   @Override
-  public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
+  public NavigableMap<K, V> headMap(@ParametricNullness K toKey, boolean inclusive) {
     return delegate().headMap(toKey, inclusive);
   }
 
   @Override
-  public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
+  public NavigableMap<K, V> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
     return delegate().tailMap(fromKey, inclusive);
   }
 
@@ -392,7 +425,7 @@
    * boolean)}. If you override {@code headMap(K, boolean)}, you may wish to override {@code
    * headMap} to forward to this implementation.
    */
-  protected SortedMap<K, V> standardHeadMap(K toKey) {
+  protected SortedMap<K, V> standardHeadMap(@ParametricNullness K toKey) {
     return headMap(toKey, false);
   }
 
@@ -401,7 +434,7 @@
    * boolean)}. If you override {@code tailMap(K, boolean)}, you may wish to override {@code
    * tailMap} to forward to this implementation.
    */
-  protected SortedMap<K, V> standardTailMap(K fromKey) {
+  protected SortedMap<K, V> standardTailMap(@ParametricNullness K fromKey) {
     return tailMap(fromKey, true);
   }
 }
diff --git a/guava/src/com/google/common/collect/ForwardingNavigableSet.java b/guava/src/com/google/common/collect/ForwardingNavigableSet.java
index 827698e..6822aa8 100644
--- a/guava/src/com/google/common/collect/ForwardingNavigableSet.java
+++ b/guava/src/com/google/common/collect/ForwardingNavigableSet.java
@@ -21,6 +21,8 @@
 import java.util.Iterator;
 import java.util.NavigableSet;
 import java.util.SortedSet;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A navigable set which forwards all its method calls to another navigable set. Subclasses should
@@ -49,8 +51,9 @@
  * @since 12.0
  */
 @GwtIncompatible
-public abstract class ForwardingNavigableSet<E> extends ForwardingSortedSet<E>
-    implements NavigableSet<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingNavigableSet<E extends @Nullable Object>
+    extends ForwardingSortedSet<E> implements NavigableSet<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingNavigableSet() {}
@@ -59,7 +62,8 @@
   protected abstract NavigableSet<E> delegate();
 
   @Override
-  public E lower(E e) {
+  @CheckForNull
+  public E lower(@ParametricNullness E e) {
     return delegate().lower(e);
   }
 
@@ -68,12 +72,14 @@
    * {@link #headSet(Object, boolean)}. If you override {@link #headSet(Object, boolean)}, you may
    * wish to override {@link #lower} to forward to this implementation.
    */
-  protected E standardLower(E e) {
+  @CheckForNull
+  protected E standardLower(@ParametricNullness E e) {
     return Iterators.getNext(headSet(e, false).descendingIterator(), null);
   }
 
   @Override
-  public E floor(E e) {
+  @CheckForNull
+  public E floor(@ParametricNullness E e) {
     return delegate().floor(e);
   }
 
@@ -82,12 +88,14 @@
    * {@link #headSet(Object, boolean)}. If you override {@link #headSet(Object, boolean)}, you may
    * wish to override {@link #floor} to forward to this implementation.
    */
-  protected E standardFloor(E e) {
+  @CheckForNull
+  protected E standardFloor(@ParametricNullness E e) {
     return Iterators.getNext(headSet(e, true).descendingIterator(), null);
   }
 
   @Override
-  public E ceiling(E e) {
+  @CheckForNull
+  public E ceiling(@ParametricNullness E e) {
     return delegate().ceiling(e);
   }
 
@@ -96,12 +104,14 @@
    * #tailSet(Object, boolean)}. If you override {@link #tailSet(Object, boolean)}, you may wish to
    * override {@link #ceiling} to forward to this implementation.
    */
-  protected E standardCeiling(E e) {
+  @CheckForNull
+  protected E standardCeiling(@ParametricNullness E e) {
     return Iterators.getNext(tailSet(e, true).iterator(), null);
   }
 
   @Override
-  public E higher(E e) {
+  @CheckForNull
+  public E higher(@ParametricNullness E e) {
     return delegate().higher(e);
   }
 
@@ -110,11 +120,13 @@
    * #tailSet(Object, boolean)}. If you override {@link #tailSet(Object, boolean)}, you may wish to
    * override {@link #higher} to forward to this implementation.
    */
-  protected E standardHigher(E e) {
+  @CheckForNull
+  protected E standardHigher(@ParametricNullness E e) {
     return Iterators.getNext(tailSet(e, false).iterator(), null);
   }
 
   @Override
+  @CheckForNull
   public E pollFirst() {
     return delegate().pollFirst();
   }
@@ -124,11 +136,13 @@
    * override {@link #iterator} you may wish to override {@link #pollFirst} to forward to this
    * implementation.
    */
+  @CheckForNull
   protected E standardPollFirst() {
     return Iterators.pollNext(iterator());
   }
 
   @Override
+  @CheckForNull
   public E pollLast() {
     return delegate().pollLast();
   }
@@ -138,14 +152,17 @@
    * If you override {@link #descendingIterator} you may wish to override {@link #pollLast} to
    * forward to this implementation.
    */
+  @CheckForNull
   protected E standardPollLast() {
     return Iterators.pollNext(descendingIterator());
   }
 
+  @ParametricNullness
   protected E standardFirst() {
     return iterator().next();
   }
 
+  @ParametricNullness
   protected E standardLast() {
     return descendingIterator().next();
   }
@@ -179,7 +196,10 @@
 
   @Override
   public NavigableSet<E> subSet(
-      E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+      @ParametricNullness E fromElement,
+      boolean fromInclusive,
+      @ParametricNullness E toElement,
+      boolean toInclusive) {
     return delegate().subSet(fromElement, fromInclusive, toElement, toInclusive);
   }
 
@@ -190,7 +210,10 @@
    */
   @Beta
   protected NavigableSet<E> standardSubSet(
-      E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+      @ParametricNullness E fromElement,
+      boolean fromInclusive,
+      @ParametricNullness E toElement,
+      boolean toInclusive) {
     return tailSet(fromElement, fromInclusive).headSet(toElement, toInclusive);
   }
 
@@ -201,12 +224,13 @@
    * implementation.
    */
   @Override
-  protected SortedSet<E> standardSubSet(E fromElement, E toElement) {
+  protected SortedSet<E> standardSubSet(
+      @ParametricNullness E fromElement, @ParametricNullness E toElement) {
     return subSet(fromElement, true, toElement, false);
   }
 
   @Override
-  public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+  public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
     return delegate().headSet(toElement, inclusive);
   }
 
@@ -215,12 +239,12 @@
    * boolean)} method. If you override {@link #headSet(Object, boolean)}, you may wish to override
    * {@link #headSet(Object)} to forward to this implementation.
    */
-  protected SortedSet<E> standardHeadSet(E toElement) {
+  protected SortedSet<E> standardHeadSet(@ParametricNullness E toElement) {
     return headSet(toElement, false);
   }
 
   @Override
-  public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+  public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
     return delegate().tailSet(fromElement, inclusive);
   }
 
@@ -229,7 +253,7 @@
    * boolean)} method. If you override {@link #tailSet(Object, boolean)}, you may wish to override
    * {@link #tailSet(Object)} to forward to this implementation.
    */
-  protected SortedSet<E> standardTailSet(E fromElement) {
+  protected SortedSet<E> standardTailSet(@ParametricNullness E fromElement) {
     return tailSet(fromElement, true);
   }
 }
diff --git a/guava/src/com/google/common/collect/ForwardingObject.java b/guava/src/com/google/common/collect/ForwardingObject.java
index 712b14f..64af908 100644
--- a/guava/src/com/google/common/collect/ForwardingObject.java
+++ b/guava/src/com/google/common/collect/ForwardingObject.java
@@ -44,6 +44,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingObject {
 
   /** Constructor for use by subclasses. */
diff --git a/guava/src/com/google/common/collect/ForwardingQueue.java b/guava/src/com/google/common/collect/ForwardingQueue.java
index f77e560..43c2eaa 100644
--- a/guava/src/com/google/common/collect/ForwardingQueue.java
+++ b/guava/src/com/google/common/collect/ForwardingQueue.java
@@ -20,6 +20,8 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.NoSuchElementException;
 import java.util.Queue;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A queue which forwards all its method calls to another queue. Subclasses should override one or
@@ -44,7 +46,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingQueue<E> extends ForwardingCollection<E> implements Queue<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingQueue<E extends @Nullable Object> extends ForwardingCollection<E>
+    implements Queue<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingQueue() {}
@@ -54,28 +58,32 @@
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
-  public boolean offer(E o) {
+  public boolean offer(@ParametricNullness E o) {
     return delegate().offer(o);
   }
 
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing this?
   @Override
+  @CheckForNull
   public E poll() {
     return delegate().poll();
   }
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public E remove() {
     return delegate().remove();
   }
 
   @Override
+  @CheckForNull
   public E peek() {
     return delegate().peek();
   }
 
   @Override
+  @ParametricNullness
   public E element() {
     return delegate().element();
   }
@@ -86,7 +94,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardOffer(E e) {
+  protected boolean standardOffer(@ParametricNullness E e) {
     try {
       return add(e);
     } catch (IllegalStateException caught) {
@@ -100,6 +108,7 @@
    *
    * @since 7.0
    */
+  @CheckForNull
   protected E standardPeek() {
     try {
       return element();
@@ -114,6 +123,7 @@
    *
    * @since 7.0
    */
+  @CheckForNull
   protected E standardPoll() {
     try {
       return remove();
diff --git a/guava/src/com/google/common/collect/ForwardingSet.java b/guava/src/com/google/common/collect/ForwardingSet.java
index ff21924..bc27272 100644
--- a/guava/src/com/google/common/collect/ForwardingSet.java
+++ b/guava/src/com/google/common/collect/ForwardingSet.java
@@ -21,6 +21,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Collection;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -46,7 +47,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingSet<E> extends ForwardingCollection<E> implements Set<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSet<E extends @Nullable Object> extends ForwardingCollection<E>
+    implements Set<E> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -56,7 +59,7 @@
   protected abstract Set<E> delegate();
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return object == this || delegate().equals(object);
   }
 
@@ -84,7 +87,7 @@
    *
    * @since 7.0
    */
-  protected boolean standardEquals(@Nullable Object object) {
+  protected boolean standardEquals(@CheckForNull Object object) {
     return Sets.equalsImpl(this, object);
   }
 
diff --git a/guava/src/com/google/common/collect/ForwardingSetMultimap.java b/guava/src/com/google/common/collect/ForwardingSetMultimap.java
index a4d6c76..5077c68 100644
--- a/guava/src/com/google/common/collect/ForwardingSetMultimap.java
+++ b/guava/src/com/google/common/collect/ForwardingSetMultimap.java
@@ -20,6 +20,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Map.Entry;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -35,8 +36,9 @@
  * @since 3.0
  */
 @GwtCompatible
-public abstract class ForwardingSetMultimap<K, V> extends ForwardingMultimap<K, V>
-    implements SetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingMultimap<K, V> implements SetMultimap<K, V> {
 
   @Override
   protected abstract SetMultimap<K, V> delegate();
@@ -47,19 +49,19 @@
   }
 
   @Override
-  public Set<V> get(@Nullable K key) {
+  public Set<V> get(@ParametricNullness K key) {
     return delegate().get(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public Set<V> removeAll(@Nullable Object key) {
+  public Set<V> removeAll(@CheckForNull Object key) {
     return delegate().removeAll(key);
   }
 
   @CanIgnoreReturnValue
   @Override
-  public Set<V> replaceValues(K key, Iterable<? extends V> values) {
+  public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return delegate().replaceValues(key, values);
   }
 }
diff --git a/guava/src/com/google/common/collect/ForwardingSortedMap.java b/guava/src/com/google/common/collect/ForwardingSortedMap.java
index 8539adf..e0882ab 100644
--- a/guava/src/com/google/common/collect/ForwardingSortedMap.java
+++ b/guava/src/com/google/common/collect/ForwardingSortedMap.java
@@ -23,6 +23,7 @@
 import java.util.Comparator;
 import java.util.NoSuchElementException;
 import java.util.SortedMap;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -51,8 +52,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingSortedMap<K, V> extends ForwardingMap<K, V>
-    implements SortedMap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSortedMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingMap<K, V> implements SortedMap<K, V> {
   // TODO(lowasser): identify places where thread safety is actually lost
 
   /** Constructor for use by subclasses. */
@@ -62,32 +64,35 @@
   protected abstract SortedMap<K, V> delegate();
 
   @Override
+  @CheckForNull
   public Comparator<? super K> comparator() {
     return delegate().comparator();
   }
 
   @Override
+  @ParametricNullness
   public K firstKey() {
     return delegate().firstKey();
   }
 
   @Override
-  public SortedMap<K, V> headMap(K toKey) {
+  public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
     return delegate().headMap(toKey);
   }
 
   @Override
+  @ParametricNullness
   public K lastKey() {
     return delegate().lastKey();
   }
 
   @Override
-  public SortedMap<K, V> subMap(K fromKey, K toKey) {
+  public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
     return delegate().subMap(fromKey, toKey);
   }
 
   @Override
-  public SortedMap<K, V> tailMap(K fromKey) {
+  public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
     return delegate().tailMap(fromKey);
   }
 
@@ -106,14 +111,14 @@
     }
   }
 
-  // unsafe, but worst case is a CCE is thrown, which callers will be expecting
-  @SuppressWarnings("unchecked")
-  private int unsafeCompare(Object k1, Object k2) {
-    Comparator<? super K> comparator = comparator();
+  // unsafe, but worst case is a CCE or NPE is thrown, which callers will be expecting
+  @SuppressWarnings({"unchecked", "nullness"})
+  static int unsafeCompare(
+      @CheckForNull Comparator<?> comparator, @CheckForNull Object o1, @CheckForNull Object o2) {
     if (comparator == null) {
-      return ((Comparable<Object>) k1).compareTo(k2);
+      return ((Comparable<@Nullable Object>) o1).compareTo(o2);
     } else {
-      return ((Comparator<Object>) comparator).compare(k1, k2);
+      return ((Comparator<@Nullable Object>) comparator).compare(o1, o2);
     }
   }
 
@@ -126,13 +131,13 @@
    */
   @Override
   @Beta
-  protected boolean standardContainsKey(@Nullable Object key) {
+  protected boolean standardContainsKey(@CheckForNull Object key) {
     try {
-      // any CCE will be caught
-      @SuppressWarnings("unchecked")
-      SortedMap<Object, V> self = (SortedMap<Object, V>) this;
+      // any CCE or NPE will be caught
+      @SuppressWarnings({"unchecked", "nullness"})
+      SortedMap<@Nullable Object, V> self = (SortedMap<@Nullable Object, V>) this;
       Object ceilingKey = self.tailMap(key).firstKey();
-      return unsafeCompare(ceilingKey, key) == 0;
+      return unsafeCompare(comparator(), ceilingKey, key) == 0;
     } catch (ClassCastException | NoSuchElementException | NullPointerException e) {
       return false;
     }
@@ -147,7 +152,7 @@
    */
   @Beta
   protected SortedMap<K, V> standardSubMap(K fromKey, K toKey) {
-    checkArgument(unsafeCompare(fromKey, toKey) <= 0, "fromKey must be <= toKey");
+    checkArgument(unsafeCompare(comparator(), fromKey, toKey) <= 0, "fromKey must be <= toKey");
     return tailMap(fromKey).headMap(toKey);
   }
 }
diff --git a/guava/src/com/google/common/collect/ForwardingSortedMultiset.java b/guava/src/com/google/common/collect/ForwardingSortedMultiset.java
index 1d34fb3..4626d31 100644
--- a/guava/src/com/google/common/collect/ForwardingSortedMultiset.java
+++ b/guava/src/com/google/common/collect/ForwardingSortedMultiset.java
@@ -19,6 +19,8 @@
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.NavigableSet;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A sorted multiset which forwards all its method calls to another sorted multiset. Subclasses
@@ -44,8 +46,9 @@
  */
 @Beta
 @GwtCompatible(emulated = true)
-public abstract class ForwardingSortedMultiset<E> extends ForwardingMultiset<E>
-    implements SortedMultiset<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSortedMultiset<E extends @Nullable Object>
+    extends ForwardingMultiset<E> implements SortedMultiset<E> {
   /** Constructor for use by subclasses. */
   protected ForwardingSortedMultiset() {}
 
@@ -110,6 +113,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     return delegate().firstEntry();
   }
@@ -120,6 +124,7 @@
    * <p>If you override {@link #entrySet()}, you may wish to override {@link #firstEntry()} to
    * forward to this implementation.
    */
+  @CheckForNull
   protected Entry<E> standardFirstEntry() {
     Iterator<Entry<E>> entryIterator = entrySet().iterator();
     if (!entryIterator.hasNext()) {
@@ -130,6 +135,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     return delegate().lastEntry();
   }
@@ -141,6 +147,7 @@
    * <p>If you override {@link #descendingMultiset} or {@link #entrySet()}, you may wish to override
    * {@link #firstEntry()} to forward to this implementation.
    */
+  @CheckForNull
   protected Entry<E> standardLastEntry() {
     Iterator<Entry<E>> entryIterator = descendingMultiset().entrySet().iterator();
     if (!entryIterator.hasNext()) {
@@ -151,6 +158,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollFirstEntry() {
     return delegate().pollFirstEntry();
   }
@@ -161,6 +169,7 @@
    * <p>If you override {@link #entrySet()}, you may wish to override {@link #pollFirstEntry()} to
    * forward to this implementation.
    */
+  @CheckForNull
   protected Entry<E> standardPollFirstEntry() {
     Iterator<Entry<E>> entryIterator = entrySet().iterator();
     if (!entryIterator.hasNext()) {
@@ -173,6 +182,7 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollLastEntry() {
     return delegate().pollLastEntry();
   }
@@ -184,6 +194,7 @@
    * <p>If you override {@link #descendingMultiset()} or {@link #entrySet()}, you may wish to
    * override {@link #pollLastEntry()} to forward to this implementation.
    */
+  @CheckForNull
   protected Entry<E> standardPollLastEntry() {
     Iterator<Entry<E>> entryIterator = descendingMultiset().entrySet().iterator();
     if (!entryIterator.hasNext()) {
@@ -196,13 +207,16 @@
   }
 
   @Override
-  public SortedMultiset<E> headMultiset(E upperBound, BoundType boundType) {
+  public SortedMultiset<E> headMultiset(@ParametricNullness E upperBound, BoundType boundType) {
     return delegate().headMultiset(upperBound, boundType);
   }
 
   @Override
   public SortedMultiset<E> subMultiset(
-      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType) {
+      @ParametricNullness E lowerBound,
+      BoundType lowerBoundType,
+      @ParametricNullness E upperBound,
+      BoundType upperBoundType) {
     return delegate().subMultiset(lowerBound, lowerBoundType, upperBound, upperBoundType);
   }
 
@@ -215,12 +229,15 @@
    * #subMultiset(Object, BoundType, Object, BoundType)} to forward to this implementation.
    */
   protected SortedMultiset<E> standardSubMultiset(
-      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType) {
+      @ParametricNullness E lowerBound,
+      BoundType lowerBoundType,
+      @ParametricNullness E upperBound,
+      BoundType upperBoundType) {
     return tailMultiset(lowerBound, lowerBoundType).headMultiset(upperBound, upperBoundType);
   }
 
   @Override
-  public SortedMultiset<E> tailMultiset(E lowerBound, BoundType boundType) {
+  public SortedMultiset<E> tailMultiset(@ParametricNullness E lowerBound, BoundType boundType) {
     return delegate().tailMultiset(lowerBound, boundType);
   }
 }
diff --git a/guava/src/com/google/common/collect/ForwardingSortedSet.java b/guava/src/com/google/common/collect/ForwardingSortedSet.java
index 4c4ddf4..32625af 100644
--- a/guava/src/com/google/common/collect/ForwardingSortedSet.java
+++ b/guava/src/com/google/common/collect/ForwardingSortedSet.java
@@ -16,12 +16,15 @@
 
 package com.google.common.collect;
 
+import static com.google.common.collect.ForwardingSortedMap.unsafeCompare;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.SortedSet;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -52,7 +55,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class ForwardingSortedSet<E> extends ForwardingSet<E> implements SortedSet<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSortedSet<E extends @Nullable Object> extends ForwardingSet<E>
+    implements SortedSet<E> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingSortedSet() {}
@@ -61,44 +66,38 @@
   protected abstract SortedSet<E> delegate();
 
   @Override
+  @CheckForNull
   public Comparator<? super E> comparator() {
     return delegate().comparator();
   }
 
   @Override
+  @ParametricNullness
   public E first() {
     return delegate().first();
   }
 
   @Override
-  public SortedSet<E> headSet(E toElement) {
+  public SortedSet<E> headSet(@ParametricNullness E toElement) {
     return delegate().headSet(toElement);
   }
 
   @Override
+  @ParametricNullness
   public E last() {
     return delegate().last();
   }
 
   @Override
-  public SortedSet<E> subSet(E fromElement, E toElement) {
+  public SortedSet<E> subSet(@ParametricNullness E fromElement, @ParametricNullness E toElement) {
     return delegate().subSet(fromElement, toElement);
   }
 
   @Override
-  public SortedSet<E> tailSet(E fromElement) {
+  public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
     return delegate().tailSet(fromElement);
   }
 
-  // unsafe, but worst case is a CCE is thrown, which callers will be expecting
-  @SuppressWarnings("unchecked")
-  private int unsafeCompare(@Nullable Object o1, @Nullable Object o2) {
-    Comparator<? super E> comparator = comparator();
-    return (comparator == null)
-        ? ((Comparable<Object>) o1).compareTo(o2)
-        : ((Comparator<Object>) comparator).compare(o1, o2);
-  }
-
   /**
    * A sensible definition of {@link #contains} in terms of the {@code first()} method of {@link
    * #tailSet}. If you override {@link #tailSet}, you may wish to override {@link #contains} to
@@ -108,13 +107,13 @@
    */
   @Override
   @Beta
-  protected boolean standardContains(@Nullable Object object) {
+  protected boolean standardContains(@CheckForNull Object object) {
     try {
-      // any ClassCastExceptions are caught
-      @SuppressWarnings("unchecked")
-      SortedSet<Object> self = (SortedSet<Object>) this;
+      // any ClassCastExceptions and NullPointerExceptions are caught
+      @SuppressWarnings({"unchecked", "nullness"})
+      SortedSet<@Nullable Object> self = (SortedSet<@Nullable Object>) this;
       Object ceiling = self.tailSet(object).first();
-      return unsafeCompare(ceiling, object) == 0;
+      return unsafeCompare(comparator(), ceiling, object) == 0;
     } catch (ClassCastException | NoSuchElementException | NullPointerException e) {
       return false;
     }
@@ -129,15 +128,15 @@
    */
   @Override
   @Beta
-  protected boolean standardRemove(@Nullable Object object) {
+  protected boolean standardRemove(@CheckForNull Object object) {
     try {
-      // any ClassCastExceptions are caught
-      @SuppressWarnings("unchecked")
-      SortedSet<Object> self = (SortedSet<Object>) this;
-      Iterator<Object> iterator = self.tailSet(object).iterator();
+      // any ClassCastExceptions and NullPointerExceptions are caught
+      @SuppressWarnings({"unchecked", "nullness"})
+      SortedSet<@Nullable Object> self = (SortedSet<@Nullable Object>) this;
+      Iterator<?> iterator = self.tailSet(object).iterator();
       if (iterator.hasNext()) {
         Object ceiling = iterator.next();
-        if (unsafeCompare(ceiling, object) == 0) {
+        if (unsafeCompare(comparator(), ceiling, object) == 0) {
           iterator.remove();
           return true;
         }
@@ -156,7 +155,8 @@
    * @since 7.0
    */
   @Beta
-  protected SortedSet<E> standardSubSet(E fromElement, E toElement) {
+  protected SortedSet<E> standardSubSet(
+      @ParametricNullness E fromElement, @ParametricNullness E toElement) {
     return tailSet(fromElement).headSet(toElement);
   }
 }
diff --git a/guava/src/com/google/common/collect/ForwardingSortedSetMultimap.java b/guava/src/com/google/common/collect/ForwardingSortedSetMultimap.java
index 546eb47..b91a68b 100644
--- a/guava/src/com/google/common/collect/ForwardingSortedSetMultimap.java
+++ b/guava/src/com/google/common/collect/ForwardingSortedSetMultimap.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.SortedSet;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -34,8 +35,10 @@
  * @since 3.0
  */
 @GwtCompatible
-public abstract class ForwardingSortedSetMultimap<K, V> extends ForwardingSetMultimap<K, V>
-    implements SortedSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingSortedSetMultimap<
+        K extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingSetMultimap<K, V> implements SortedSetMultimap<K, V> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingSortedSetMultimap() {}
@@ -44,21 +47,22 @@
   protected abstract SortedSetMultimap<K, V> delegate();
 
   @Override
-  public SortedSet<V> get(@Nullable K key) {
+  public SortedSet<V> get(@ParametricNullness K key) {
     return delegate().get(key);
   }
 
   @Override
-  public SortedSet<V> removeAll(@Nullable Object key) {
+  public SortedSet<V> removeAll(@CheckForNull Object key) {
     return delegate().removeAll(key);
   }
 
   @Override
-  public SortedSet<V> replaceValues(K key, Iterable<? extends V> values) {
+  public SortedSet<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return delegate().replaceValues(key, values);
   }
 
   @Override
+  @CheckForNull
   public Comparator<? super V> valueComparator() {
     return delegate().valueComparator();
   }
diff --git a/guava/src/com/google/common/collect/ForwardingTable.java b/guava/src/com/google/common/collect/ForwardingTable.java
index 71a54cf..4fcb858 100644
--- a/guava/src/com/google/common/collect/ForwardingTable.java
+++ b/guava/src/com/google/common/collect/ForwardingTable.java
@@ -21,6 +21,8 @@
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A table which forwards all its method calls to another table. Subclasses should override one or
@@ -31,7 +33,10 @@
  * @since 7.0
  */
 @GwtCompatible
-public abstract class ForwardingTable<R, C, V> extends ForwardingObject implements Table<R, C, V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingTable<
+        R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+    extends ForwardingObject implements Table<R, C, V> {
   /** Constructor for use by subclasses. */
   protected ForwardingTable() {}
 
@@ -49,7 +54,7 @@
   }
 
   @Override
-  public Map<R, V> column(C columnKey) {
+  public Map<R, V> column(@ParametricNullness C columnKey) {
     return delegate().column(columnKey);
   }
 
@@ -64,27 +69,28 @@
   }
 
   @Override
-  public boolean contains(Object rowKey, Object columnKey) {
+  public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return delegate().contains(rowKey, columnKey);
   }
 
   @Override
-  public boolean containsColumn(Object columnKey) {
+  public boolean containsColumn(@CheckForNull Object columnKey) {
     return delegate().containsColumn(columnKey);
   }
 
   @Override
-  public boolean containsRow(Object rowKey) {
+  public boolean containsRow(@CheckForNull Object rowKey) {
     return delegate().containsRow(rowKey);
   }
 
   @Override
-  public boolean containsValue(Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return delegate().containsValue(value);
   }
 
   @Override
-  public V get(Object rowKey, Object columnKey) {
+  @CheckForNull
+  public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return delegate().get(rowKey, columnKey);
   }
 
@@ -95,7 +101,9 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V put(R rowKey, C columnKey, V value) {
+  @CheckForNull
+  public V put(
+      @ParametricNullness R rowKey, @ParametricNullness C columnKey, @ParametricNullness V value) {
     return delegate().put(rowKey, columnKey, value);
   }
 
@@ -106,12 +114,13 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(Object rowKey, Object columnKey) {
+  @CheckForNull
+  public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return delegate().remove(rowKey, columnKey);
   }
 
   @Override
-  public Map<C, V> row(R rowKey) {
+  public Map<C, V> row(@ParametricNullness R rowKey) {
     return delegate().row(rowKey);
   }
 
@@ -136,7 +145,7 @@
   }
 
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     return (obj == this) || delegate().equals(obj);
   }
 
diff --git a/guava/src/com/google/common/collect/GeneralRange.java b/guava/src/com/google/common/collect/GeneralRange.java
index 1ce5659..20cf4fb 100644
--- a/guava/src/com/google/common/collect/GeneralRange.java
+++ b/guava/src/com/google/common/collect/GeneralRange.java
@@ -18,11 +18,13 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.BoundType.CLOSED;
 import static com.google.common.collect.BoundType.OPEN;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Objects;
 import java.io.Serializable;
 import java.util.Comparator;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -35,13 +37,14 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(serializable = true)
-final class GeneralRange<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class GeneralRange<T extends @Nullable Object> implements Serializable {
   /** Converts a Range to a GeneralRange. */
   static <T extends Comparable> GeneralRange<T> from(Range<T> range) {
-    @Nullable T lowerEndpoint = range.hasLowerBound() ? range.lowerEndpoint() : null;
+    T lowerEndpoint = range.hasLowerBound() ? range.lowerEndpoint() : null;
     BoundType lowerBoundType = range.hasLowerBound() ? range.lowerBoundType() : OPEN;
 
-    @Nullable T upperEndpoint = range.hasUpperBound() ? range.upperEndpoint() : null;
+    T upperEndpoint = range.hasUpperBound() ? range.upperEndpoint() : null;
     BoundType upperBoundType = range.hasUpperBound() ? range.upperBoundType() : OPEN;
     return new GeneralRange<T>(
         Ordering.natural(),
@@ -54,7 +57,7 @@
   }
 
   /** Returns the whole range relative to the specified comparator. */
-  static <T> GeneralRange<T> all(Comparator<? super T> comparator) {
+  static <T extends @Nullable Object> GeneralRange<T> all(Comparator<? super T> comparator) {
     return new GeneralRange<T>(comparator, false, null, OPEN, false, null, OPEN);
   }
 
@@ -62,8 +65,8 @@
    * Returns everything above the endpoint relative to the specified comparator, with the specified
    * endpoint behavior.
    */
-  static <T> GeneralRange<T> downTo(
-      Comparator<? super T> comparator, @Nullable T endpoint, BoundType boundType) {
+  static <T extends @Nullable Object> GeneralRange<T> downTo(
+      Comparator<? super T> comparator, @ParametricNullness T endpoint, BoundType boundType) {
     return new GeneralRange<T>(comparator, true, endpoint, boundType, false, null, OPEN);
   }
 
@@ -71,8 +74,8 @@
    * Returns everything below the endpoint relative to the specified comparator, with the specified
    * endpoint behavior.
    */
-  static <T> GeneralRange<T> upTo(
-      Comparator<? super T> comparator, @Nullable T endpoint, BoundType boundType) {
+  static <T extends @Nullable Object> GeneralRange<T> upTo(
+      Comparator<? super T> comparator, @ParametricNullness T endpoint, BoundType boundType) {
     return new GeneralRange<T>(comparator, false, null, OPEN, true, endpoint, boundType);
   }
 
@@ -80,30 +83,30 @@
    * Returns everything between the endpoints relative to the specified comparator, with the
    * specified endpoint behavior.
    */
-  static <T> GeneralRange<T> range(
+  static <T extends @Nullable Object> GeneralRange<T> range(
       Comparator<? super T> comparator,
-      @Nullable T lower,
+      @ParametricNullness T lower,
       BoundType lowerType,
-      @Nullable T upper,
+      @ParametricNullness T upper,
       BoundType upperType) {
     return new GeneralRange<T>(comparator, true, lower, lowerType, true, upper, upperType);
   }
 
   private final Comparator<? super T> comparator;
   private final boolean hasLowerBound;
-  private final @Nullable T lowerEndpoint;
+  @CheckForNull private final T lowerEndpoint;
   private final BoundType lowerBoundType;
   private final boolean hasUpperBound;
-  private final @Nullable T upperEndpoint;
+  @CheckForNull private final T upperEndpoint;
   private final BoundType upperBoundType;
 
   private GeneralRange(
       Comparator<? super T> comparator,
       boolean hasLowerBound,
-      @Nullable T lowerEndpoint,
+      @CheckForNull T lowerEndpoint,
       BoundType lowerBoundType,
       boolean hasUpperBound,
-      @Nullable T upperEndpoint,
+      @CheckForNull T upperEndpoint,
       BoundType upperBoundType) {
     this.comparator = checkNotNull(comparator);
     this.hasLowerBound = hasLowerBound;
@@ -113,14 +116,24 @@
     this.upperEndpoint = upperEndpoint;
     this.upperBoundType = checkNotNull(upperBoundType);
 
+    // Trigger any exception that the comparator would throw for the endpoints.
+    /*
+     * uncheckedCastNullableTToT is safe as long as the callers are careful to pass a "real" T
+     * whenever they pass `true` for the matching `has*Bound` parameter.
+     */
     if (hasLowerBound) {
-      comparator.compare(lowerEndpoint, lowerEndpoint);
+      comparator.compare(
+          uncheckedCastNullableTToT(lowerEndpoint), uncheckedCastNullableTToT(lowerEndpoint));
     }
     if (hasUpperBound) {
-      comparator.compare(upperEndpoint, upperEndpoint);
+      comparator.compare(
+          uncheckedCastNullableTToT(upperEndpoint), uncheckedCastNullableTToT(upperEndpoint));
     }
+
     if (hasLowerBound && hasUpperBound) {
-      int cmp = comparator.compare(lowerEndpoint, upperEndpoint);
+      int cmp =
+          comparator.compare(
+              uncheckedCastNullableTToT(lowerEndpoint), uncheckedCastNullableTToT(upperEndpoint));
       // be consistent with Range
       checkArgument(
           cmp <= 0, "lowerEndpoint (%s) > upperEndpoint (%s)", lowerEndpoint, upperEndpoint);
@@ -143,41 +156,45 @@
   }
 
   boolean isEmpty() {
-    return (hasUpperBound() && tooLow(getUpperEndpoint()))
-        || (hasLowerBound() && tooHigh(getLowerEndpoint()));
+    // The casts are safe because of the has*Bound() checks.
+    return (hasUpperBound() && tooLow(uncheckedCastNullableTToT(getUpperEndpoint())))
+        || (hasLowerBound() && tooHigh(uncheckedCastNullableTToT(getLowerEndpoint())));
   }
 
-  boolean tooLow(@Nullable T t) {
+  boolean tooLow(@ParametricNullness T t) {
     if (!hasLowerBound()) {
       return false;
     }
-    T lbound = getLowerEndpoint();
+    // The cast is safe because of the hasLowerBound() check.
+    T lbound = uncheckedCastNullableTToT(getLowerEndpoint());
     int cmp = comparator.compare(t, lbound);
     return cmp < 0 | (cmp == 0 & getLowerBoundType() == OPEN);
   }
 
-  boolean tooHigh(@Nullable T t) {
+  boolean tooHigh(@ParametricNullness T t) {
     if (!hasUpperBound()) {
       return false;
     }
-    T ubound = getUpperEndpoint();
+    // The cast is safe because of the hasUpperBound() check.
+    T ubound = uncheckedCastNullableTToT(getUpperEndpoint());
     int cmp = comparator.compare(t, ubound);
     return cmp > 0 | (cmp == 0 & getUpperBoundType() == OPEN);
   }
 
-  boolean contains(@Nullable T t) {
+  boolean contains(@ParametricNullness T t) {
     return !tooLow(t) && !tooHigh(t);
   }
 
   /**
    * Returns the intersection of the two ranges, or an empty range if their intersection is empty.
    */
+  @SuppressWarnings("nullness") // TODO(cpovirk): Add casts as needed. Will be noisy and annoying...
   GeneralRange<T> intersect(GeneralRange<T> other) {
     checkNotNull(other);
     checkArgument(comparator.equals(other.comparator));
 
     boolean hasLowBound = this.hasLowerBound;
-    @Nullable T lowEnd = getLowerEndpoint();
+    T lowEnd = getLowerEndpoint();
     BoundType lowType = getLowerBoundType();
     if (!hasLowerBound()) {
       hasLowBound = other.hasLowerBound;
@@ -192,7 +209,7 @@
     }
 
     boolean hasUpBound = this.hasUpperBound;
-    @Nullable T upEnd = getUpperEndpoint();
+    T upEnd = getUpperEndpoint();
     BoundType upType = getUpperBoundType();
     if (!hasUpperBound()) {
       hasUpBound = other.hasUpperBound;
@@ -220,7 +237,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj instanceof GeneralRange) {
       GeneralRange<?> r = (GeneralRange<?>) obj;
       return comparator.equals(r.comparator)
@@ -244,7 +261,7 @@
         getUpperBoundType());
   }
 
-  private transient @Nullable GeneralRange<T> reverse;
+  @CheckForNull private transient GeneralRange<T> reverse;
 
   /** Returns the same range relative to the reversed comparator. */
   GeneralRange<T> reverse() {
@@ -276,6 +293,7 @@
         + (upperBoundType == CLOSED ? ']' : ')');
   }
 
+  @CheckForNull
   T getLowerEndpoint() {
     return lowerEndpoint;
   }
@@ -284,6 +302,7 @@
     return lowerBoundType;
   }
 
+  @CheckForNull
   T getUpperEndpoint() {
     return upperEndpoint;
   }
diff --git a/guava/src/com/google/common/collect/GwtTransient.java b/guava/src/com/google/common/collect/GwtTransient.java
index 9c09c53..ce5ea48 100644
--- a/guava/src/com/google/common/collect/GwtTransient.java
+++ b/guava/src/com/google/common/collect/GwtTransient.java
@@ -33,4 +33,5 @@
 @GwtCompatible
 @Retention(RUNTIME)
 @Target(FIELD)
+@ElementTypesAreNonnullByDefault
 @interface GwtTransient {}
diff --git a/guava/src/com/google/common/collect/HashBasedTable.java b/guava/src/com/google/common/collect/HashBasedTable.java
index 8f6df57..c8ba50f 100644
--- a/guava/src/com/google/common/collect/HashBasedTable.java
+++ b/guava/src/com/google/common/collect/HashBasedTable.java
@@ -20,11 +20,9 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Supplier;
-import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.Serializable;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link Table} using linked hash tables. This guarantees predictable iteration
@@ -49,6 +47,7 @@
  * @since 7.0
  */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 public class HashBasedTable<R, C, V> extends StandardTable<R, C, V> {
   private static class Factory<C, V> implements Supplier<Map<C, V>>, Serializable {
     final int expectedSize;
@@ -103,43 +102,5 @@
     super(backingMap, factory);
   }
 
-  // Overriding so NullPointerTester test passes.
-
-  @Override
-  public boolean contains(@Nullable Object rowKey, @Nullable Object columnKey) {
-    return super.contains(rowKey, columnKey);
-  }
-
-  @Override
-  public boolean containsColumn(@Nullable Object columnKey) {
-    return super.containsColumn(columnKey);
-  }
-
-  @Override
-  public boolean containsRow(@Nullable Object rowKey) {
-    return super.containsRow(rowKey);
-  }
-
-  @Override
-  public boolean containsValue(@Nullable Object value) {
-    return super.containsValue(value);
-  }
-
-  @Override
-  public V get(@Nullable Object rowKey, @Nullable Object columnKey) {
-    return super.get(rowKey, columnKey);
-  }
-
-  @Override
-  public boolean equals(@Nullable Object obj) {
-    return super.equals(obj);
-  }
-
-  @CanIgnoreReturnValue
-  @Override
-  public V remove(@Nullable Object rowKey, @Nullable Object columnKey) {
-    return super.remove(rowKey, columnKey);
-  }
-
   private static final long serialVersionUID = 0;
 }
diff --git a/guava/src/com/google/common/collect/HashBiMap.java b/guava/src/com/google/common/collect/HashBiMap.java
index 33365ec..b6e2042 100644
--- a/guava/src/com/google/common/collect/HashBiMap.java
+++ b/guava/src/com/google/common/collect/HashBiMap.java
@@ -17,8 +17,8 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
 import static com.google.common.collect.Hashing.smearedHash;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -27,7 +27,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
-import com.google.j2objc.annotations.WeakOuter;
+import com.google.j2objc.annotations.Weak;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
@@ -40,6 +40,7 @@
 import java.util.Set;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -56,11 +57,12 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
-public final class HashBiMap<K, V> extends IteratorBasedAbstractMap<K, V>
-    implements BiMap<K, V>, Serializable {
+@ElementTypesAreNonnullByDefault
+public final class HashBiMap<K extends @Nullable Object, V extends @Nullable Object>
+    extends IteratorBasedAbstractMap<K, V> implements BiMap<K, V>, Serializable {
 
   /** Returns a new, empty {@code HashBiMap} with the default initial capacity (16). */
-  public static <K, V> HashBiMap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashBiMap<K, V> create() {
     return create(16);
   }
 
@@ -70,7 +72,8 @@
    * @param expectedSize the expected number of entries
    * @throws IllegalArgumentException if the specified expected size is negative
    */
-  public static <K, V> HashBiMap<K, V> create(int expectedSize) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashBiMap<K, V> create(
+      int expectedSize) {
     return new HashBiMap<>(expectedSize);
   }
 
@@ -78,23 +81,31 @@
    * Constructs a new bimap containing initial values from {@code map}. The bimap is created with an
    * initial capacity sufficient to hold the mappings in the specified map.
    */
-  public static <K, V> HashBiMap<K, V> create(Map<? extends K, ? extends V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashBiMap<K, V> create(
+      Map<? extends K, ? extends V> map) {
     HashBiMap<K, V> bimap = create(map.size());
     bimap.putAll(map);
     return bimap;
   }
 
-  private static final class BiEntry<K, V> extends ImmutableEntry<K, V> {
+  private static final class BiEntry<K extends @Nullable Object, V extends @Nullable Object>
+      extends ImmutableEntry<K, V> {
     final int keyHash;
     final int valueHash;
 
-    @Nullable BiEntry<K, V> nextInKToVBucket;
-    @Nullable BiEntry<K, V> nextInVToKBucket;
+    // All BiEntry instances are strongly reachable from owning HashBiMap through
+    // "HashBiMap.hashTableKToV" and "BiEntry.nextInKToVBucket" references.
+    // Under that assumption, the remaining references can be safely marked as @Weak.
+    // Using @Weak is necessary to avoid retain-cycles between BiEntry instances on iOS,
+    // which would cause memory leaks when non-empty HashBiMap with cyclic BiEntry
+    // instances is deallocated.
+    @CheckForNull BiEntry<K, V> nextInKToVBucket;
+    @Weak @CheckForNull BiEntry<K, V> nextInVToKBucket;
 
-    @Nullable BiEntry<K, V> nextInKeyInsertionOrder;
-    @Nullable BiEntry<K, V> prevInKeyInsertionOrder;
+    @Weak @CheckForNull BiEntry<K, V> nextInKeyInsertionOrder;
+    @Weak @CheckForNull BiEntry<K, V> prevInKeyInsertionOrder;
 
-    BiEntry(K key, int keyHash, V value, int valueHash) {
+    BiEntry(@ParametricNullness K key, int keyHash, @ParametricNullness V value, int valueHash) {
       super(key, value);
       this.keyHash = keyHash;
       this.valueHash = valueHash;
@@ -103,10 +114,15 @@
 
   private static final double LOAD_FACTOR = 1.0;
 
-  private transient BiEntry<K, V>[] hashTableKToV;
-  private transient BiEntry<K, V>[] hashTableVToK;
-  private transient @Nullable BiEntry<K, V> firstInKeyInsertionOrder;
-  private transient @Nullable BiEntry<K, V> lastInKeyInsertionOrder;
+  /*
+   * The following two arrays may *contain* nulls, but they are never *themselves* null: Even though
+   * they are not initialized inline in the constructor, they are initialized from init(), which the
+   * constructor calls (as does readObject()).
+   */
+  private transient @Nullable BiEntry<K, V>[] hashTableKToV;
+  private transient @Nullable BiEntry<K, V>[] hashTableVToK;
+  @Weak @CheckForNull private transient BiEntry<K, V> firstInKeyInsertionOrder;
+  @Weak @CheckForNull private transient BiEntry<K, V> lastInKeyInsertionOrder;
   private transient int size;
   private transient int mask;
   private transient int modCount;
@@ -180,7 +196,7 @@
     modCount++;
   }
 
-  private void insert(BiEntry<K, V> entry, @Nullable BiEntry<K, V> oldEntryForKey) {
+  private void insert(BiEntry<K, V> entry, @CheckForNull BiEntry<K, V> oldEntryForKey) {
     int keyBucket = entry.keyHash & mask;
     entry.nextInKToVBucket = hashTableKToV[keyBucket];
     hashTableKToV[keyBucket] = entry;
@@ -217,7 +233,8 @@
     modCount++;
   }
 
-  private BiEntry<K, V> seekByKey(@Nullable Object key, int keyHash) {
+  @CheckForNull
+  private BiEntry<K, V> seekByKey(@CheckForNull Object key, int keyHash) {
     for (BiEntry<K, V> entry = hashTableKToV[keyHash & mask];
         entry != null;
         entry = entry.nextInKToVBucket) {
@@ -228,7 +245,8 @@
     return null;
   }
 
-  private BiEntry<K, V> seekByValue(@Nullable Object value, int valueHash) {
+  @CheckForNull
+  private BiEntry<K, V> seekByValue(@CheckForNull Object value, int valueHash) {
     for (BiEntry<K, V> entry = hashTableVToK[valueHash & mask];
         entry != null;
         entry = entry.nextInVToKBucket) {
@@ -240,7 +258,7 @@
   }
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return seekByKey(key, smearedHash(key)) != null;
   }
 
@@ -255,22 +273,25 @@
    * @return true if a mapping exists from a key to the specified value
    */
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return seekByValue(value, smearedHash(value)) != null;
   }
 
   @Override
-  public @Nullable V get(@Nullable Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     return Maps.valueOrNull(seekByKey(key, smearedHash(key)));
   }
 
   @CanIgnoreReturnValue
   @Override
-  public V put(@Nullable K key, @Nullable V value) {
+  @CheckForNull
+  public V put(@ParametricNullness K key, @ParametricNullness V value) {
     return put(key, value, false);
   }
 
-  private V put(@Nullable K key, @Nullable V value, boolean force) {
+  @CheckForNull
+  private V put(@ParametricNullness K key, @ParametricNullness V value, boolean force) {
     int keyHash = smearedHash(key);
     int valueHash = smearedHash(value);
 
@@ -306,11 +327,13 @@
 
   @CanIgnoreReturnValue
   @Override
-  public @Nullable V forcePut(@Nullable K key, @Nullable V value) {
+  @CheckForNull
+  public V forcePut(@ParametricNullness K key, @ParametricNullness V value) {
     return put(key, value, true);
   }
 
-  private @Nullable K putInverse(@Nullable V value, @Nullable K key, boolean force) {
+  @CheckForNull
+  private K putInverse(@ParametricNullness V value, @ParametricNullness K key, boolean force) {
     int valueHash = smearedHash(value);
     int keyHash = smearedHash(key);
 
@@ -355,7 +378,7 @@
   }
 
   private void rehashIfNecessary() {
-    BiEntry<K, V>[] oldKToV = hashTableKToV;
+    @Nullable BiEntry<K, V>[] oldKToV = hashTableKToV;
     if (Hashing.needsResizing(size, oldKToV.length, LOAD_FACTOR)) {
       int newTableSize = oldKToV.length * 2;
 
@@ -373,14 +396,15 @@
     }
   }
 
-  @SuppressWarnings("unchecked")
-  private BiEntry<K, V>[] createTable(int length) {
-    return new BiEntry[length];
+  @SuppressWarnings({"unchecked", "rawtypes"})
+  private @Nullable BiEntry<K, V>[] createTable(int length) {
+    return new @Nullable BiEntry[length];
   }
 
   @CanIgnoreReturnValue
   @Override
-  public @Nullable V remove(@Nullable Object key) {
+  @CheckForNull
+  public V remove(@CheckForNull Object key) {
     BiEntry<K, V> entry = seekByKey(key, smearedHash(key));
     if (entry == null) {
       return null;
@@ -407,9 +431,9 @@
     return size;
   }
 
-  abstract class Itr<T> implements Iterator<T> {
-    BiEntry<K, V> next = firstInKeyInsertionOrder;
-    BiEntry<K, V> toRemove = null;
+  abstract class Itr<T extends @Nullable Object> implements Iterator<T> {
+    @CheckForNull BiEntry<K, V> next = firstInKeyInsertionOrder;
+    @CheckForNull BiEntry<K, V> toRemove = null;
     int expectedModCount = modCount;
     int remaining = size();
 
@@ -427,7 +451,8 @@
         throw new NoSuchElementException();
       }
 
-      BiEntry<K, V> entry = next;
+      // requireNonNull is safe because of the hasNext check.
+      BiEntry<K, V> entry = requireNonNull(next);
       next = entry.nextInKeyInsertionOrder;
       toRemove = entry;
       remaining--;
@@ -439,7 +464,9 @@
       if (modCount != expectedModCount) {
         throw new ConcurrentModificationException();
       }
-      checkRemove(toRemove != null);
+      if (toRemove == null) {
+        throw new IllegalStateException("no calls to next() since the last call to remove()");
+      }
       delete(toRemove);
       expectedModCount = modCount;
       toRemove = null;
@@ -453,7 +480,6 @@
     return new KeySet();
   }
 
-  @WeakOuter
   private final class KeySet extends Maps.KeySet<K, V> {
     KeySet() {
       super(HashBiMap.this);
@@ -470,7 +496,7 @@
     }
 
     @Override
-    public boolean remove(@Nullable Object o) {
+    public boolean remove(@CheckForNull Object o) {
       BiEntry<K, V> entry = seekByKey(o, smearedHash(o));
       if (entry == null) {
         return false;
@@ -557,7 +583,7 @@
     }
   }
 
-  @LazyInit @RetainedWith private transient @Nullable BiMap<V, K> inverse;
+  @LazyInit @RetainedWith @CheckForNull private transient BiMap<V, K> inverse;
 
   @Override
   public BiMap<V, K> inverse() {
@@ -582,28 +608,32 @@
     }
 
     @Override
-    public boolean containsKey(@Nullable Object value) {
+    public boolean containsKey(@CheckForNull Object value) {
       return forward().containsValue(value);
     }
 
     @Override
-    public K get(@Nullable Object value) {
+    @CheckForNull
+    public K get(@CheckForNull Object value) {
       return Maps.keyOrNull(seekByValue(value, smearedHash(value)));
     }
 
     @CanIgnoreReturnValue
     @Override
-    public @Nullable K put(@Nullable V value, @Nullable K key) {
+    @CheckForNull
+    public K put(@ParametricNullness V value, @ParametricNullness K key) {
       return putInverse(value, key, false);
     }
 
     @Override
-    public @Nullable K forcePut(@Nullable V value, @Nullable K key) {
+    @CheckForNull
+    public K forcePut(@ParametricNullness V value, @ParametricNullness K key) {
       return putInverse(value, key, true);
     }
 
     @Override
-    public @Nullable K remove(@Nullable Object value) {
+    @CheckForNull
+    public K remove(@CheckForNull Object value) {
       BiEntry<K, V> entry = seekByValue(value, smearedHash(value));
       if (entry == null) {
         return null;
@@ -625,14 +655,13 @@
       return new InverseKeySet();
     }
 
-    @WeakOuter
     private final class InverseKeySet extends Maps.KeySet<V, K> {
       InverseKeySet() {
         super(Inverse.this);
       }
 
       @Override
-      public boolean remove(@Nullable Object o) {
+      public boolean remove(@CheckForNull Object o) {
         BiEntry<K, V> entry = seekByValue(o, smearedHash(o));
         if (entry == null) {
           return false;
@@ -724,7 +753,9 @@
     }
   }
 
-  private static final class InverseSerializedForm<K, V> implements Serializable {
+  private static final class InverseSerializedForm<
+          K extends @Nullable Object, V extends @Nullable Object>
+      implements Serializable {
     private final HashBiMap<K, V> bimap;
 
     InverseSerializedForm(HashBiMap<K, V> bimap) {
diff --git a/guava/src/com/google/common/collect/HashMultimap.java b/guava/src/com/google/common/collect/HashMultimap.java
index 9297260..9e4c1c2 100644
--- a/guava/src/com/google/common/collect/HashMultimap.java
+++ b/guava/src/com/google/common/collect/HashMultimap.java
@@ -26,6 +26,7 @@
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link Multimap} using hash tables.
@@ -41,11 +42,16 @@
  * concurrent update operations, wrap your multimap with a call to {@link
  * Multimaps#synchronizedSetMultimap}.
  *
+ * <p><b>Warning:</b> Do not modify either a key <i>or a value</i> of a {@code HashMultimap} in a
+ * way that affects its {@link Object#equals} behavior. Undefined behavior and bugs will result.
+ *
  * @author Jared Levy
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public final class HashMultimap<K, V> extends HashMultimapGwtSerializationDependencies<K, V> {
+@ElementTypesAreNonnullByDefault
+public final class HashMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends HashMultimapGwtSerializationDependencies<K, V> {
   private static final int DEFAULT_VALUES_PER_KEY = 2;
 
   @VisibleForTesting transient int expectedValuesPerKey = DEFAULT_VALUES_PER_KEY;
@@ -56,7 +62,8 @@
    * <p>This method will soon be deprecated in favor of {@code
    * MultimapBuilder.hashKeys().hashSetValues().build()}.
    */
-  public static <K, V> HashMultimap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      HashMultimap<K, V> create() {
     return new HashMultimap<>();
   }
 
@@ -72,7 +79,8 @@
    * @throws IllegalArgumentException if {@code expectedKeys} or {@code expectedValuesPerKey} is
    *     negative
    */
-  public static <K, V> HashMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashMultimap<K, V> create(
+      int expectedKeys, int expectedValuesPerKey) {
     return new HashMultimap<>(expectedKeys, expectedValuesPerKey);
   }
 
@@ -86,7 +94,8 @@
    *
    * @param multimap the multimap whose contents are copied to this multimap
    */
-  public static <K, V> HashMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashMultimap<K, V> create(
+      Multimap<? extends K, ? extends V> multimap) {
     return new HashMultimap<>(multimap);
   }
 
diff --git a/guava/src/com/google/common/collect/HashMultiset.java b/guava/src/com/google/common/collect/HashMultiset.java
index d820434..b916457 100644
--- a/guava/src/com/google/common/collect/HashMultiset.java
+++ b/guava/src/com/google/common/collect/HashMultiset.java
@@ -22,6 +22,7 @@
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.util.HashMap;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Multiset implementation backed by a {@link HashMap}.
@@ -31,10 +32,11 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public final class HashMultiset<E> extends AbstractMapBasedMultiset<E> {
+@ElementTypesAreNonnullByDefault
+public final class HashMultiset<E extends @Nullable Object> extends AbstractMapBasedMultiset<E> {
 
   /** Creates a new, empty {@code HashMultiset} using the default initial capacity. */
-  public static <E> HashMultiset<E> create() {
+  public static <E extends @Nullable Object> HashMultiset<E> create() {
     return new HashMultiset<E>();
   }
 
@@ -45,7 +47,7 @@
    * @param distinctElements the expected number of distinct elements
    * @throws IllegalArgumentException if {@code distinctElements} is negative
    */
-  public static <E> HashMultiset<E> create(int distinctElements) {
+  public static <E extends @Nullable Object> HashMultiset<E> create(int distinctElements) {
     return new HashMultiset<E>(distinctElements);
   }
 
@@ -56,7 +58,8 @@
    *
    * @param elements the elements that the multiset should contain
    */
-  public static <E> HashMultiset<E> create(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> HashMultiset<E> create(
+      Iterable<? extends E> elements) {
     HashMultiset<E> multiset = create(Multisets.inferDistinctElements(elements));
     Iterables.addAll(multiset, elements);
     return multiset;
diff --git a/guava/src/com/google/common/collect/Hashing.java b/guava/src/com/google/common/collect/Hashing.java
index 8d7c874..81ef67e 100644
--- a/guava/src/com/google/common/collect/Hashing.java
+++ b/guava/src/com/google/common/collect/Hashing.java
@@ -18,7 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.primitives.Ints;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static methods for implementing hash-based collections.
@@ -28,6 +28,7 @@
  * @author Austin Appleby
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class Hashing {
   private Hashing() {}
 
@@ -50,7 +51,7 @@
     return (int) (C2 * Integer.rotateLeft((int) (hashCode * C1), 15));
   }
 
-  static int smearedHash(@Nullable Object o) {
+  static int smearedHash(@CheckForNull Object o) {
     return smear((o == null) ? 0 : o.hashCode());
   }
 
diff --git a/guava/src/com/google/common/collect/ImmutableAsList.java b/guava/src/com/google/common/collect/ImmutableAsList.java
index 528a8dc..c397479 100644
--- a/guava/src/com/google/common/collect/ImmutableAsList.java
+++ b/guava/src/com/google/common/collect/ImmutableAsList.java
@@ -21,6 +21,7 @@
 import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
+import javax.annotation.CheckForNull;
 
 /**
  * List returned by {@link ImmutableCollection#asList} that delegates {@code contains} checks to the
@@ -31,11 +32,12 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial")
+@ElementTypesAreNonnullByDefault
 abstract class ImmutableAsList<E> extends ImmutableList<E> {
   abstract ImmutableCollection<E> delegateCollection();
 
   @Override
-  public boolean contains(Object target) {
+  public boolean contains(@CheckForNull Object target) {
     // The collection's contains() is at least as fast as ImmutableList's
     // and is often faster.
     return delegateCollection().contains(target);
diff --git a/guava/src/com/google/common/collect/ImmutableBiMap.java b/guava/src/com/google/common/collect/ImmutableBiMap.java
index d7855c3..2f2e9ab 100644
--- a/guava/src/com/google/common/collect/ImmutableBiMap.java
+++ b/guava/src/com/google/common/collect/ImmutableBiMap.java
@@ -18,17 +18,21 @@
 
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collector;
 import java.util.stream.Collectors;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link BiMap} whose contents will never change, with many other important properties detailed
@@ -38,6 +42,7 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableBiMap<K, V> extends ImmutableBiMapFauxverideShim<K, V>
     implements BiMap<K, V> {
 
@@ -53,13 +58,18 @@
    *
    * @since 21.0
    */
-  public static <T, K, V> Collector<T, ?, ImmutableBiMap<K, V>> toImmutableBiMap(
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction) {
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableBiMap<K, V>> toImmutableBiMap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction) {
     return CollectCollectors.toImmutableBiMap(keyFunction, valueFunction);
   }
 
-  /** Returns the empty bimap. */
+  /**
+   * Returns the empty bimap.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   // Casting to any type is safe because the set will never hold any elements.
   @SuppressWarnings("unchecked")
   public static <K, V> ImmutableBiMap<K, V> of() {
@@ -110,7 +120,165 @@
         entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3), entryOf(k4, v4), entryOf(k5, v5));
   }
 
-  // looking for of() with > 5 entries? Use the builder instead.
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are added
+   * @since 31.0
+   */
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+    return RegularImmutableBiMap.fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6));
+  }
+
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are added
+   * @since 31.0
+   */
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+    return RegularImmutableBiMap.fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7));
+  }
+
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are added
+   * @since 31.0
+   */
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8) {
+    return RegularImmutableBiMap.fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8));
+  }
+
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are added
+   * @since 31.0
+   */
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9) {
+    return RegularImmutableBiMap.fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8),
+        entryOf(k9, v9));
+  }
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are added
+   * @since 31.0
+   */
+  public static <K, V> ImmutableBiMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9,
+      K k10,
+      V v10) {
+    return RegularImmutableBiMap.fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8),
+        entryOf(k9, v9),
+        entryOf(k10, v10));
+  }
+
+  // looking for of() with > 10 entries? Use the builder or ofEntries instead.
+
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys or values are provided
+   * @since 31.0
+   */
+  @SafeVarargs
+  public static <K, V> ImmutableBiMap<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) {
+    @SuppressWarnings("unchecked") // we will only ever read these
+    Entry<K, V>[] entries2 = (Entry<K, V>[]) entries;
+    return RegularImmutableBiMap.fromEntries(entries2);
+  }
 
   /**
    * Returns a new builder. The generated builder is equivalent to the builder created by the {@link
@@ -148,7 +316,7 @@
    *         .put("one", 1)
    *         .put("two", 2)
    *         .put("three", 3)
-   *         .build();
+   *         .buildOrThrow();
    * }</pre>
    *
    * <p>For <i>small</i> immutable bimaps, the {@code ImmutableBiMap.of()} methods are even more
@@ -161,8 +329,8 @@
    * want a different order, consider using {@link #orderEntriesByValue(Comparator)}, which changes
    * this builder to sort entries by value.
    *
-   * <p>Builder instances can be reused - it is safe to call {@link #build} multiple times to build
-   * multiple bimaps in series. Each bimap is a superset of the bimaps created before it.
+   * <p>Builder instances can be reused - it is safe to call {@link #buildOrThrow} multiple times to
+   * build multiple bimaps in series. Each bimap is a superset of the bimaps created before it.
    *
    * @since 2.0
    */
@@ -260,15 +428,35 @@
      * order in which entries were inserted into the builder, unless {@link #orderEntriesByValue}
      * was called, in which case entries are sorted by value.
      *
+     * <p>Prefer the equivalent method {@link #buildOrThrow()} to make it explicit that the method
+     * will throw an exception if there are duplicate keys or values. The {@code build()} method
+     * will soon be deprecated.
+     *
      * @throws IllegalArgumentException if duplicate keys or values were added
      */
     @Override
     public ImmutableBiMap<K, V> build() {
+      return buildOrThrow();
+    }
+
+    /**
+     * Returns a newly-created immutable bimap, or throws an exception if any key or value was added
+     * more than once. The iteration order of the returned bimap is the order in which entries were
+     * inserted into the builder, unless {@link #orderEntriesByValue} was called, in which case
+     * entries are sorted by value.
+     *
+     * @throws IllegalArgumentException if duplicate keys or values were added
+     * @since 31.0
+     */
+    @Override
+    public ImmutableBiMap<K, V> buildOrThrow() {
       switch (size) {
         case 0:
           return of();
         case 1:
-          return of(entries[0].getKey(), entries[0].getValue());
+          // requireNonNull is safe because the first `size` elements have been filled in.
+          Entry<K, V> onlyEntry = requireNonNull(entries[0]);
+          return of(onlyEntry.getKey(), onlyEntry.getValue());
         default:
           /*
            * If entries is full, or if hash flooding is detected, then this implementation may end
@@ -302,7 +490,9 @@
         case 0:
           return of();
         case 1:
-          return of(entries[0].getKey(), entries[0].getValue());
+          // requireNonNull is safe because the first `size` elements have been filled in.
+          Entry<K, V> onlyEntry = requireNonNull(entries[0]);
+          return of(onlyEntry.getKey(), onlyEntry.getValue());
         default:
           entriesUsed = true;
           return RegularImmutableBiMap.fromEntryArray(size, entries);
@@ -401,7 +591,9 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public V forcePut(K key, V value) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
+  public final V forcePut(K key, V value) {
     throw new UnsupportedOperationException();
   }
 
diff --git a/guava/src/com/google/common/collect/ImmutableBiMapFauxverideShim.java b/guava/src/com/google/common/collect/ImmutableBiMapFauxverideShim.java
index dd787d5..2f1f25c 100644
--- a/guava/src/com/google/common/collect/ImmutableBiMapFauxverideShim.java
+++ b/guava/src/com/google/common/collect/ImmutableBiMapFauxverideShim.java
@@ -17,9 +17,11 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.function.BinaryOperator;
 import java.util.function.Function;
 import java.util.stream.Collector;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * "Overrides" the {@link ImmutableMap} static methods that lack {@link ImmutableBiMap} equivalents
@@ -29,6 +31,7 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class ImmutableBiMapFauxverideShim<K, V> extends ImmutableMap<K, V> {
   /**
    * Not supported. Use {@link ImmutableBiMap#toImmutableBiMap} instead. This method exists only to
@@ -39,9 +42,11 @@
    * @deprecated Use {@link ImmutableBiMap#toImmutableBiMap}.
    */
   @Deprecated
-  public static <T, K, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction) {
+  @DoNotCall("Use toImmutableBiMap")
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction) {
     throw new UnsupportedOperationException();
   }
 
@@ -54,10 +59,12 @@
    * @deprecated
    */
   @Deprecated
-  public static <T, K, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction,
-      BinaryOperator<V> mergeFunction) {
+  @DoNotCall("Use toImmutableBiMap")
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction) {
     throw new UnsupportedOperationException();
   }
 }
diff --git a/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java b/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
index 8370f0a..aeabe5d 100644
--- a/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
+++ b/guava/src/com/google/common/collect/ImmutableClassToInstanceMap.java
@@ -21,10 +21,11 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.primitives.Primitives;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.Immutable;
 import java.io.Serializable;
 import java.util.Map;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link ClassToInstanceMap} whose contents will never change, with many other important
@@ -35,6 +36,7 @@
  */
 @Immutable(containerOf = "B")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ImmutableClassToInstanceMap<B> extends ForwardingMap<Class<? extends B>, B>
     implements ClassToInstanceMap<B>, Serializable {
 
@@ -44,6 +46,8 @@
   /**
    * Returns an empty {@code ImmutableClassToInstanceMap}.
    *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   *
    * @since 19.0
    */
   @SuppressWarnings("unchecked")
@@ -170,7 +174,8 @@
 
   @Override
   @SuppressWarnings("unchecked") // value could not get in if not a T
-  public <T extends B> @Nullable T getInstance(Class<T> type) {
+  @CheckForNull
+  public <T extends B> T getInstance(Class<T> type) {
     return (T) delegate.get(checkNotNull(type));
   }
 
@@ -183,6 +188,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public <T extends B> T putInstance(Class<T> type, T value) {
     throw new UnsupportedOperationException();
   }
diff --git a/guava/src/com/google/common/collect/ImmutableCollection.java b/guava/src/com/google/common/collect/ImmutableCollection.java
index 5a76efa..80fefb6 100644
--- a/guava/src/com/google/common/collect/ImmutableCollection.java
+++ b/guava/src/com/google/common/collect/ImmutableCollection.java
@@ -20,6 +20,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
 import java.util.AbstractCollection;
@@ -31,6 +32,7 @@
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.function.Predicate;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -161,6 +163,7 @@
 @DoNotMock("Use ImmutableList.of or another implementation")
 @GwtCompatible(emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 // TODO(kevinb): I think we should push everything down to "BaseImmutableCollection" or something,
 // just to do everything we can to emphasize the "practically an interface" nature of this class.
 public abstract class ImmutableCollection<E> extends AbstractCollection<E> implements Serializable {
@@ -192,7 +195,20 @@
 
   @CanIgnoreReturnValue
   @Override
-  public final <T> T[] toArray(T[] other) {
+  /*
+   * This suppression is here for two reasons:
+   *
+   * 1. b/192354773 in our checker affects toArray declarations.
+   *
+   * 2. `other[size] = null` is unsound. We could "fix" this by requiring callers to pass in an
+   * array with a nullable element type. But probably they usually want an array with a non-nullable
+   * type. That said, we could *accept* a `@Nullable T[]` (which, given that we treat arrays as
+   * covariant, would still permit a plain `T[]`) and return a plain `T[]`. But of course that would
+   * require its own suppression, since it is also unsound. toArray(T[]) is just a mess from a
+   * nullness perspective. The signature below at least has the virtue of being relatively simple.
+   */
+  @SuppressWarnings("nullness")
+  public final <T extends @Nullable Object> T[] toArray(T[] other) {
     checkNotNull(other);
     int size = size();
 
@@ -210,7 +226,8 @@
   }
 
   /** If this collection is backed by an array of its elements in insertion order, returns it. */
-  Object @Nullable [] internalArray() {
+  @CheckForNull
+  Object[] internalArray() {
     return null;
   }
 
@@ -231,7 +248,7 @@
   }
 
   @Override
-  public abstract boolean contains(@Nullable Object object);
+  public abstract boolean contains(@CheckForNull Object object);
 
   /**
    * Guaranteed to throw an exception and leave the collection unmodified.
@@ -242,6 +259,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean add(E e) {
     throw new UnsupportedOperationException();
   }
@@ -255,7 +273,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public final boolean remove(Object object) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final boolean remove(@CheckForNull Object object) {
     throw new UnsupportedOperationException();
   }
 
@@ -268,6 +287,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean addAll(Collection<? extends E> newElements) {
     throw new UnsupportedOperationException();
   }
@@ -281,6 +301,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean removeAll(Collection<?> oldElements) {
     throw new UnsupportedOperationException();
   }
@@ -294,6 +315,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean removeIf(Predicate<? super E> filter) {
     throw new UnsupportedOperationException();
   }
@@ -306,6 +328,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean retainAll(Collection<?> elementsToKeep) {
     throw new UnsupportedOperationException();
   }
@@ -318,6 +341,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void clear() {
     throw new UnsupportedOperationException();
   }
@@ -356,7 +380,7 @@
    * offset. Returns {@code offset + size()}.
    */
   @CanIgnoreReturnValue
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     for (E e : this) {
       dst[offset++] = e;
     }
diff --git a/guava/src/com/google/common/collect/ImmutableEntry.java b/guava/src/com/google/common/collect/ImmutableEntry.java
index 0f435e9..edc25f4 100644
--- a/guava/src/com/google/common/collect/ImmutableEntry.java
+++ b/guava/src/com/google/common/collect/ImmutableEntry.java
@@ -22,27 +22,32 @@
 
 /** @see com.google.common.collect.Maps#immutableEntry(Object, Object) */
 @GwtCompatible(serializable = true)
-class ImmutableEntry<K, V> extends AbstractMapEntry<K, V> implements Serializable {
-  final @Nullable K key;
-  final @Nullable V value;
+@ElementTypesAreNonnullByDefault
+class ImmutableEntry<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMapEntry<K, V> implements Serializable {
+  @ParametricNullness final K key;
+  @ParametricNullness final V value;
 
-  ImmutableEntry(@Nullable K key, @Nullable V value) {
+  ImmutableEntry(@ParametricNullness K key, @ParametricNullness V value) {
     this.key = key;
     this.value = value;
   }
 
   @Override
-  public final @Nullable K getKey() {
+  @ParametricNullness
+  public final K getKey() {
     return key;
   }
 
   @Override
-  public final @Nullable V getValue() {
+  @ParametricNullness
+  public final V getValue() {
     return value;
   }
 
   @Override
-  public final V setValue(V value) {
+  @ParametricNullness
+  public final V setValue(@ParametricNullness V value) {
     throw new UnsupportedOperationException();
   }
 
diff --git a/guava/src/com/google/common/collect/ImmutableEnumMap.java b/guava/src/com/google/common/collect/ImmutableEnumMap.java
index f12e1a9..d1e10f9 100644
--- a/guava/src/com/google/common/collect/ImmutableEnumMap.java
+++ b/guava/src/com/google/common/collect/ImmutableEnumMap.java
@@ -24,7 +24,7 @@
 import java.util.EnumMap;
 import java.util.Spliterator;
 import java.util.function.BiConsumer;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@link ImmutableMap} backed by a non-empty {@link java.util.EnumMap}.
@@ -33,6 +33,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 final class ImmutableEnumMap<K extends Enum<K>, V> extends IteratorBasedImmutableMap<K, V> {
   static <K extends Enum<K>, V> ImmutableMap<K, V> asImmutable(EnumMap<K, V> map) {
     switch (map.size()) {
@@ -69,17 +70,18 @@
   }
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return delegate.containsKey(key);
   }
 
   @Override
-  public V get(Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     return delegate.get(key);
   }
 
   @Override
-  public boolean equals(Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/collect/ImmutableEnumSet.java b/guava/src/com/google/common/collect/ImmutableEnumSet.java
index 5677cbe..32287bd 100644
--- a/guava/src/com/google/common/collect/ImmutableEnumSet.java
+++ b/guava/src/com/google/common/collect/ImmutableEnumSet.java
@@ -23,6 +23,7 @@
 import java.util.EnumSet;
 import java.util.Spliterator;
 import java.util.function.Consumer;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@link ImmutableSet} backed by a non-empty {@link java.util.EnumSet}.
@@ -31,6 +32,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 final class ImmutableEnumSet<E extends Enum<E>> extends ImmutableSet<E> {
   @SuppressWarnings("rawtypes") // necessary to compile against Java 8
   static ImmutableSet asImmutable(EnumSet set) {
@@ -84,7 +86,7 @@
   }
 
   @Override
-  public boolean contains(Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return delegate.contains(object);
   }
 
@@ -102,7 +104,7 @@
   }
 
   @Override
-  public boolean equals(Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/collect/ImmutableList.java b/guava/src/com/google/common/collect/ImmutableList.java
index 05e7088..115c022 100644
--- a/guava/src/com/google/common/collect/ImmutableList.java
+++ b/guava/src/com/google/common/collect/ImmutableList.java
@@ -23,11 +23,14 @@
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
 import static com.google.common.collect.ObjectArrays.checkElementsNotNull;
 import static com.google.common.collect.RegularImmutableList.EMPTY;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
+import com.google.errorprone.annotations.InlineMe;
 import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
@@ -42,6 +45,7 @@
 import java.util.function.Consumer;
 import java.util.function.UnaryOperator;
 import java.util.stream.Collector;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -58,6 +62,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableList<E> extends ImmutableCollection<E>
     implements List<E>, RandomAccess {
 
@@ -75,6 +80,8 @@
    * Returns the empty immutable list. This list behaves and performs comparably to {@link
    * Collections#emptyList}, and is preferable mainly for consistency and maintainability of your
    * code.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
    */
   // Casting to any type is safe because the list will never hold any elements.
   @SuppressWarnings("unchecked")
@@ -359,17 +366,27 @@
    * Views the array as an immutable list. Copies if the specified range does not cover the complete
    * array. Does not check for nulls.
    */
-  static <E> ImmutableList<E> asImmutableList(Object[] elements, int length) {
+  static <E> ImmutableList<E> asImmutableList(@Nullable Object[] elements, int length) {
     switch (length) {
       case 0:
         return of();
       case 1:
-        return of((E) elements[0]);
+        /*
+         * requireNonNull is safe because the callers promise to put non-null objects in the first
+         * `length` array elements.
+         */
+        @SuppressWarnings("unchecked") // our callers put only E instances into the array
+        E onlyElement = (E) requireNonNull(elements[0]);
+        return of(onlyElement);
       default:
-        if (length < elements.length) {
-          elements = Arrays.copyOf(elements, length);
-        }
-        return new RegularImmutableList<E>(elements);
+        /*
+         * The suppression is safe because the callers promise to put non-null objects in the first
+         * `length` array elements.
+         */
+        @SuppressWarnings("nullness")
+        Object[] elementsWithoutTrailingNulls =
+            length < elements.length ? Arrays.copyOf(elements, length) : elements;
+        return new RegularImmutableList<E>(elementsWithoutTrailingNulls);
     }
   }
 
@@ -407,17 +424,17 @@
   }
 
   @Override
-  public int indexOf(@Nullable Object object) {
+  public int indexOf(@CheckForNull Object object) {
     return (object == null) ? -1 : Lists.indexOfImpl(this, object);
   }
 
   @Override
-  public int lastIndexOf(@Nullable Object object) {
+  public int lastIndexOf(@CheckForNull Object object) {
     return (object == null) ? -1 : Lists.lastIndexOfImpl(this, object);
   }
 
   @Override
-  public boolean contains(@Nullable Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return indexOf(object) >= 0;
   }
 
@@ -492,6 +509,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean addAll(int index, Collection<? extends E> newElements) {
     throw new UnsupportedOperationException();
   }
@@ -505,6 +523,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final E set(int index, E element) {
     throw new UnsupportedOperationException();
   }
@@ -517,6 +536,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void add(int index, E element) {
     throw new UnsupportedOperationException();
   }
@@ -530,6 +550,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final E remove(int index) {
     throw new UnsupportedOperationException();
   }
@@ -542,6 +563,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void replaceAll(UnaryOperator<E> operator) {
     throw new UnsupportedOperationException();
   }
@@ -554,6 +576,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void sort(Comparator<? super E> c) {
     throw new UnsupportedOperationException();
   }
@@ -562,7 +585,10 @@
    * Returns this list instance.
    *
    * @since 2.0
+   * @deprecated There is no reason to use this; it always returns {@code this}.
    */
+  @InlineMe(replacement = "this")
+  @Deprecated
   @Override
   public final ImmutableList<E> asList() {
     return this;
@@ -574,7 +600,7 @@
   }
 
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     // this loop is faster for RandomAccess instances, which ImmutableLists are
     int size = size();
     for (int i = 0; i < size; i++) {
@@ -615,18 +641,18 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object object) {
+    public boolean contains(@CheckForNull Object object) {
       return forwardList.contains(object);
     }
 
     @Override
-    public int indexOf(@Nullable Object object) {
+    public int indexOf(@CheckForNull Object object) {
       int index = forwardList.lastIndexOf(object);
       return (index >= 0) ? reverseIndex(index) : -1;
     }
 
     @Override
-    public int lastIndexOf(@Nullable Object object) {
+    public int lastIndexOf(@CheckForNull Object object) {
       int index = forwardList.indexOf(object);
       return (index >= 0) ? reverseIndex(index) : -1;
     }
@@ -655,7 +681,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     return Lists.equalsImpl(this, obj);
   }
 
@@ -746,7 +772,8 @@
    * @since 2.0
    */
   public static final class Builder<E> extends ImmutableCollection.Builder<E> {
-    @VisibleForTesting Object[] contents;
+    // The first `size` elements are non-null.
+    @VisibleForTesting @Nullable Object[] contents;
     private int size;
     private boolean forceCopy;
 
@@ -759,7 +786,7 @@
     }
 
     Builder(int capacity) {
-      this.contents = new Object[capacity];
+      this.contents = new @Nullable Object[capacity];
       this.size = 0;
     }
 
@@ -804,8 +831,16 @@
       return this;
     }
 
-    private void add(Object[] elements, int n) {
+    private void add(@Nullable Object[] elements, int n) {
       getReadyToExpandTo(size + n);
+      /*
+       * The following call is not statically checked, since arraycopy accepts plain Object for its
+       * parameters. If it were statically checked, the checker would still be OK with it, since
+       * we're copying into a `contents` array whose type allows it to contain nulls. Still, it's
+       * worth noting that we promise not to put nulls into the array in the first `size` elements.
+       * We uphold that promise here because our callers promise that `elements` will not contain
+       * nulls in its first `n` elements.
+       */
       System.arraycopy(elements, 0, contents, size, n);
       size += n;
     }
diff --git a/guava/src/com/google/common/collect/ImmutableListMultimap.java b/guava/src/com/google/common/collect/ImmutableListMultimap.java
index 879c71e..f847016 100644
--- a/guava/src/com/google/common/collect/ImmutableListMultimap.java
+++ b/guava/src/com/google/common/collect/ImmutableListMultimap.java
@@ -16,13 +16,12 @@
 
 package com.google.common.collect;
 
-import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
-import com.google.common.base.Preconditions;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import java.io.IOException;
@@ -35,8 +34,8 @@
 import java.util.Map.Entry;
 import java.util.function.Function;
 import java.util.stream.Collector;
-import java.util.stream.Collectors;
 import java.util.stream.Stream;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -50,6 +49,7 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
+@ElementTypesAreNonnullByDefault
 public class ImmutableListMultimap<K, V> extends ImmutableMultimap<K, V>
     implements ListMultimap<K, V> {
   /**
@@ -80,16 +80,11 @@
    *
    * @since 21.0
    */
-  public static <T, K, V> Collector<T, ?, ImmutableListMultimap<K, V>> toImmutableListMultimap(
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction) {
-    checkNotNull(keyFunction, "keyFunction");
-    checkNotNull(valueFunction, "valueFunction");
-    return Collector.of(
-        ImmutableListMultimap::<K, V>builder,
-        (builder, t) -> builder.put(keyFunction.apply(t), valueFunction.apply(t)),
-        ImmutableListMultimap.Builder::combine,
-        ImmutableListMultimap.Builder::build);
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableListMultimap<K, V>> toImmutableListMultimap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction) {
+    return CollectCollectors.toImmutableListMultimap(keyFunction, valueFunction);
   }
 
   /**
@@ -123,21 +118,18 @@
    *
    * @since 21.0
    */
-  public static <T, K, V>
+  public static <T extends @Nullable Object, K, V>
       Collector<T, ?, ImmutableListMultimap<K, V>> flatteningToImmutableListMultimap(
           Function<? super T, ? extends K> keyFunction,
           Function<? super T, ? extends Stream<? extends V>> valuesFunction) {
-    checkNotNull(keyFunction);
-    checkNotNull(valuesFunction);
-    return Collectors.collectingAndThen(
-        Multimaps.flatteningToMultimap(
-            input -> checkNotNull(keyFunction.apply(input)),
-            input -> valuesFunction.apply(input).peek(Preconditions::checkNotNull),
-            MultimapBuilder.linkedHashKeys().arrayListValues()::<K, V>build),
-        ImmutableListMultimap::copyOf);
+    return CollectCollectors.flatteningToImmutableListMultimap(keyFunction, valuesFunction);
   }
 
-  /** Returns the empty multimap. */
+  /**
+   * Returns the empty multimap.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   // Casting is safe because the multimap will never hold any elements.
   @SuppressWarnings("unchecked")
   public static <K, V> ImmutableListMultimap<K, V> of() {
@@ -400,13 +392,13 @@
    * parameters used to build this multimap.
    */
   @Override
-  public ImmutableList<V> get(@Nullable K key) {
+  public ImmutableList<V> get(K key) {
     // This cast is safe as its type is known in constructor.
     ImmutableList<V> list = (ImmutableList<V>) map.get(key);
     return (list == null) ? ImmutableList.<V>of() : list;
   }
 
-  @LazyInit @RetainedWith private transient ImmutableListMultimap<V, K> inverse;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableListMultimap<V, K> inverse;
 
   /**
    * {@inheritDoc}
@@ -442,7 +434,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public ImmutableList<V> removeAll(Object key) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final ImmutableList<V> removeAll(@CheckForNull Object key) {
     throw new UnsupportedOperationException();
   }
 
@@ -455,7 +448,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public ImmutableList<V> replaceValues(K key, Iterable<? extends V> values) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final ImmutableList<V> replaceValues(K key, Iterable<? extends V> values) {
     throw new UnsupportedOperationException();
   }
 
diff --git a/guava/src/com/google/common/collect/ImmutableMap.java b/guava/src/com/google/common/collect/ImmutableMap.java
index 5c24df2..23335b2 100644
--- a/guava/src/com/google/common/collect/ImmutableMap.java
+++ b/guava/src/com/google/common/collect/ImmutableMap.java
@@ -20,11 +20,13 @@
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.DoNotMock;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
@@ -37,7 +39,6 @@
 import java.util.Comparator;
 import java.util.EnumMap;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.Spliterator;
@@ -47,6 +48,7 @@
 import java.util.function.Function;
 import java.util.stream.Collector;
 import java.util.stream.Collectors;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -63,6 +65,7 @@
 @DoNotMock("Use ImmutableMap.of or another implementation")
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableMap<K, V> implements Map<K, V>, Serializable {
 
   /**
@@ -77,9 +80,10 @@
    *
    * @since 21.0
    */
-  public static <T, K, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction) {
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction) {
     return CollectCollectors.toImmutableMap(keyFunction, valueFunction);
   }
 
@@ -93,22 +97,20 @@
    *
    * @since 21.0
    */
-  public static <T, K, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction,
-      BinaryOperator<V> mergeFunction) {
-    checkNotNull(keyFunction);
-    checkNotNull(valueFunction);
-    checkNotNull(mergeFunction);
-    return Collectors.collectingAndThen(
-        Collectors.toMap(keyFunction, valueFunction, mergeFunction, LinkedHashMap::new),
-        ImmutableMap::copyOf);
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction) {
+    return CollectCollectors.toImmutableMap(keyFunction, valueFunction, mergeFunction);
   }
 
   /**
    * Returns the empty map. This map behaves and performs comparably to {@link
    * Collections#emptyMap}, and is preferable mainly for consistency and maintainability of your
    * code.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
    */
   @SuppressWarnings("unchecked")
   public static <K, V> ImmutableMap<K, V> of() {
@@ -163,7 +165,166 @@
         entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3), entryOf(k4, v4), entryOf(k5, v5));
   }
 
-  // looking for of() with > 5 entries? Use the builder instead.
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+    return RegularImmutableMap.fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6));
+  }
+
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+    return RegularImmutableMap.fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7));
+  }
+
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8) {
+    return RegularImmutableMap.fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8));
+  }
+
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9) {
+    return RegularImmutableMap.fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8),
+        entryOf(k9, v9));
+  }
+
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  public static <K, V> ImmutableMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9,
+      K k10,
+      V v10) {
+    return RegularImmutableMap.fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8),
+        entryOf(k9, v9),
+        entryOf(k10, v10));
+  }
+
+  // looking for of() with > 10 entries? Use the builder or ofEntries instead.
+
+  /**
+   * Returns an immutable map containing the given entries, in order.
+   *
+   * @throws IllegalArgumentException if duplicate keys are provided
+   * @since 31.0
+   */
+  @SafeVarargs
+  public static <K, V> ImmutableMap<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) {
+    @SuppressWarnings("unchecked") // we will only ever read these
+    Entry<K, V>[] entries2 = (Entry<K, V>[]) entries;
+    return RegularImmutableMap.fromEntries(entries2);
+  }
 
   /**
    * Verifies that {@code key} and {@code value} are non-null, and returns a new immutable entry
@@ -226,7 +387,7 @@
    *         .put("one", 1)
    *         .put("two", 2)
    *         .put("three", 3)
-   *         .build();
+   *         .buildOrThrow();
    * }</pre>
    *
    * <p>For <i>small</i> immutable maps, the {@code ImmutableMap.of()} methods are even more
@@ -240,15 +401,15 @@
    * sort by keys, or call {@link #orderEntriesByValue(Comparator)}, which changes this builder to
    * sort entries by value.
    *
-   * <p>Builder instances can be reused - it is safe to call {@link #build} multiple times to build
-   * multiple maps in series. Each map is a superset of the maps created before it.
+   * <p>Builder instances can be reused - it is safe to call {@link #buildOrThrow} multiple times to
+   * build multiple maps in series. Each map is a superset of the maps created before it.
    *
    * @since 2.0
    */
   @DoNotMock
   public static class Builder<K, V> {
-    @Nullable Comparator<? super V> valueComparator;
-    Entry<K, V>[] entries;
+    @CheckForNull Comparator<? super V> valueComparator;
+    @Nullable Entry<K, V>[] entries;
     int size;
     boolean entriesUsed;
 
@@ -260,9 +421,9 @@
       this(ImmutableCollection.Builder.DEFAULT_INITIAL_CAPACITY);
     }
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings({"unchecked", "rawtypes"})
     Builder(int initialCapacity) {
-      this.entries = new Entry[initialCapacity];
+      this.entries = new @Nullable Entry[initialCapacity];
       this.size = 0;
       this.entriesUsed = false;
     }
@@ -367,9 +528,26 @@
      * in which entries were inserted into the builder, unless {@link #orderEntriesByValue} was
      * called, in which case entries are sorted by value.
      *
+     * <p>Prefer the equivalent method {@link #buildOrThrow()} to make it explicit that the method
+     * will throw an exception if there are duplicate keys. The {@code build()} method will soon be
+     * deprecated.
+     *
      * @throws IllegalArgumentException if duplicate keys were added
      */
     public ImmutableMap<K, V> build() {
+      return buildOrThrow();
+    }
+
+    /**
+     * Returns a newly-created immutable map, or throws an exception if any key was added more than
+     * once. The iteration order of the returned map is the order in which entries were inserted
+     * into the builder, unless {@link #orderEntriesByValue} was called, in which case entries are
+     * sorted by value.
+     *
+     * @throws IllegalArgumentException if duplicate keys were added
+     * @since 31.0
+     */
+    public ImmutableMap<K, V> buildOrThrow() {
       /*
        * If entries is full, or if hash flooding is detected, then this implementation may end up
        * using the entries array directly and writing over the entry objects with non-terminal
@@ -388,7 +566,9 @@
         case 0:
           return of();
         case 1:
-          return of(entries[0].getKey(), entries[0].getValue());
+          // requireNonNull is safe because the first `size` elements have been filled in.
+          Entry<K, V> onlyEntry = requireNonNull(entries[0]);
+          return of(onlyEntry.getKey(), onlyEntry.getValue());
         default:
           entriesUsed = true;
           return RegularImmutableMap.fromEntryArray(size, entries);
@@ -403,7 +583,9 @@
         case 0:
           return of();
         case 1:
-          return of(entries[0].getKey(), entries[0].getValue());
+          // requireNonNull is safe because the first `size` elements have been filled in.
+          Entry<K, V> onlyEntry = requireNonNull(entries[0]);
+          return of(onlyEntry.getKey(), onlyEntry.getValue());
         default:
           entriesUsed = true;
           return JdkBackedImmutableMap.create(size, entries);
@@ -455,7 +637,8 @@
       case 0:
         return of();
       case 1:
-        Entry<K, V> onlyEntry = entryArray[0];
+        // requireNonNull is safe because the first `size` elements have been filled in.
+        Entry<K, V> onlyEntry = requireNonNull(entryArray[0]);
         return of(onlyEntry.getKey(), onlyEntry.getValue());
       default:
         /*
@@ -469,7 +652,7 @@
   private static <K extends Enum<K>, V> ImmutableMap<K, V> copyOfEnumMap(
       EnumMap<K, ? extends V> original) {
     EnumMap<K, V> copy = new EnumMap<>(original);
-    for (Entry<?, ?> entry : copy.entrySet()) {
+    for (Entry<K, V> entry : copy.entrySet()) {
       checkEntryNotNull(entry.getKey(), entry.getValue());
     }
     return ImmutableEnumMap.asImmutable(copy);
@@ -525,6 +708,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final V put(K k, V v) {
     throw new UnsupportedOperationException();
   }
@@ -538,6 +723,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final V putIfAbsent(K key, V value) {
     throw new UnsupportedOperationException();
   }
@@ -550,6 +737,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean replace(K key, V oldValue, V newValue) {
     throw new UnsupportedOperationException();
   }
@@ -562,6 +750,8 @@
    */
   @Deprecated
   @Override
+  @CheckForNull
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final V replace(K key, V value) {
     throw new UnsupportedOperationException();
   }
@@ -574,6 +764,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
     throw new UnsupportedOperationException();
   }
@@ -586,6 +777,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final V computeIfPresent(
       K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
     throw new UnsupportedOperationException();
@@ -599,7 +791,9 @@
    */
   @Deprecated
   @Override
-  public final V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final V compute(
+      K key, BiFunction<? super K, ? super @Nullable V, ? extends V> remappingFunction) {
     throw new UnsupportedOperationException();
   }
 
@@ -611,6 +805,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final V merge(
       K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
     throw new UnsupportedOperationException();
@@ -624,6 +819,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void putAll(Map<? extends K, ? extends V> map) {
     throw new UnsupportedOperationException();
   }
@@ -636,6 +832,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
     throw new UnsupportedOperationException();
   }
@@ -648,7 +845,9 @@
    */
   @Deprecated
   @Override
-  public final V remove(Object o) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
+  public final V remove(@CheckForNull Object o) {
     throw new UnsupportedOperationException();
   }
 
@@ -660,7 +859,8 @@
    */
   @Deprecated
   @Override
-  public final boolean remove(Object key, Object value) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
     throw new UnsupportedOperationException();
   }
 
@@ -672,6 +872,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void clear() {
     throw new UnsupportedOperationException();
   }
@@ -682,18 +883,19 @@
   }
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return get(key) != null;
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return values().contains(value);
   }
 
   // Overriding to mark it Nullable
   @Override
-  public abstract V get(@Nullable Object key);
+  @CheckForNull
+  public abstract V get(@CheckForNull Object key);
 
   /**
    * @since 21.0 (but only since 23.5 in the Android <a
@@ -701,12 +903,18 @@
    *     Note, however, that Java 8 users can call this method with any version and flavor of Guava.
    */
   @Override
-  public final V getOrDefault(@Nullable Object key, @Nullable V defaultValue) {
+  @CheckForNull
+  public final V getOrDefault(@CheckForNull Object key, @CheckForNull V defaultValue) {
     V result = get(key);
-    return (result != null) ? result : defaultValue;
+    // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+    if (result != null) {
+      return result;
+    } else {
+      return defaultValue;
+    }
   }
 
-  @LazyInit @RetainedWith private transient ImmutableSet<Entry<K, V>> entrySet;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableSet<Entry<K, V>> entrySet;
 
   /**
    * Returns an immutable set of the mappings in this map. The iteration order is specified by the
@@ -720,7 +928,7 @@
 
   abstract ImmutableSet<Entry<K, V>> createEntrySet();
 
-  @LazyInit @RetainedWith private transient ImmutableSet<K> keySet;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableSet<K> keySet;
 
   /**
    * Returns an immutable set of the keys in this map, in the same order that they appear in {@link
@@ -758,7 +966,7 @@
     return CollectSpliterators.map(entrySet().spliterator(), Entry::getKey);
   }
 
-  @LazyInit @RetainedWith private transient ImmutableCollection<V> values;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableCollection<V> values;
 
   /**
    * Returns an immutable collection of the values in this map, in the same order that they appear
@@ -778,7 +986,7 @@
   abstract ImmutableCollection<V> createValues();
 
   // cached so that this.multimapView().inverse() only computes inverse once
-  @LazyInit private transient ImmutableSetMultimap<K, V> multimapView;
+  @LazyInit @CheckForNull private transient ImmutableSetMultimap<K, V> multimapView;
 
   /**
    * Returns a multimap view of the map.
@@ -811,12 +1019,13 @@
     }
 
     @Override
-    public boolean containsKey(@Nullable Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return ImmutableMap.this.containsKey(key);
     }
 
     @Override
-    public ImmutableSet<V> get(@Nullable Object key) {
+    @CheckForNull
+    public ImmutableSet<V> get(@CheckForNull Object key) {
       V outerValue = ImmutableMap.this.get(key);
       return (outerValue == null) ? null : ImmutableSet.of(outerValue);
     }
@@ -866,7 +1075,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return Maps.equalsImpl(this, object);
   }
 
@@ -907,7 +1116,8 @@
         Object[] keys = new Object[map.size()];
         Object[] values = new Object[map.size()];
         int i = 0;
-        for (Entry<?, ?> entry : map.entrySet()) {
+        // "extends Object" works around https://github.com/typetools/checker-framework/issues/3013
+        for (Entry<? extends Object, ? extends Object> entry : map.entrySet()) {
           keys[i] = entry.getKey();
           values[i] = entry.getValue();
           i++;
diff --git a/guava/src/com/google/common/collect/ImmutableMapEntry.java b/guava/src/com/google/common/collect/ImmutableMapEntry.java
index d03d4fa..ac483d8 100644
--- a/guava/src/com/google/common/collect/ImmutableMapEntry.java
+++ b/guava/src/com/google/common/collect/ImmutableMapEntry.java
@@ -19,7 +19,7 @@
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@code Entry} for {@link ImmutableMap} that adds extra methods to traverse hash
@@ -33,10 +33,16 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible // unnecessary
+@ElementTypesAreNonnullByDefault
 class ImmutableMapEntry<K, V> extends ImmutableEntry<K, V> {
   /**
    * Creates an {@code ImmutableMapEntry} array to hold parameterized entries. The result must never
    * be upcast back to ImmutableMapEntry[] (or Object[], etc.), or allowed to escape the class.
+   *
+   * <p>The returned array has all its elements set to their initial null values. However, we don't
+   * declare it as {@code @Nullable ImmutableMapEntry[]} because our checker doesn't require newly
+   * created arrays to have a {@code @Nullable} element type even when they're created directly with
+   * {@code new ImmutableMapEntry[...]}, so it seems silly to insist on that only here.
    */
   @SuppressWarnings("unchecked") // Safe as long as the javadocs are followed
   static <K, V> ImmutableMapEntry<K, V>[] createEntryArray(int size) {
@@ -53,12 +59,12 @@
     // null check would be redundant
   }
 
-  @Nullable
+  @CheckForNull
   ImmutableMapEntry<K, V> getNextInKeyBucket() {
     return null;
   }
 
-  @Nullable
+  @CheckForNull
   ImmutableMapEntry<K, V> getNextInValueBucket() {
     return null;
   }
@@ -72,15 +78,23 @@
   }
 
   static class NonTerminalImmutableMapEntry<K, V> extends ImmutableMapEntry<K, V> {
-    private final transient ImmutableMapEntry<K, V> nextInKeyBucket;
+    /*
+     * Yes, we sometimes set nextInKeyBucket to null, even for this "non-terminal" entry. We don't
+     * do that with a plain NonTerminalImmutableMapEntry, but we do do it with the BiMap-specific
+     * subclass below. That's because the Entry might be non-terminal in the key bucket but terminal
+     * in the value bucket (or vice versa).
+     */
+    @CheckForNull private final transient ImmutableMapEntry<K, V> nextInKeyBucket;
 
-    NonTerminalImmutableMapEntry(K key, V value, ImmutableMapEntry<K, V> nextInKeyBucket) {
+    NonTerminalImmutableMapEntry(
+        K key, V value, @CheckForNull ImmutableMapEntry<K, V> nextInKeyBucket) {
       super(key, value);
       this.nextInKeyBucket = nextInKeyBucket;
     }
 
     @Override
-    final @Nullable ImmutableMapEntry<K, V> getNextInKeyBucket() {
+    @CheckForNull
+    final ImmutableMapEntry<K, V> getNextInKeyBucket() {
       return nextInKeyBucket;
     }
 
@@ -92,19 +106,19 @@
 
   static final class NonTerminalImmutableBiMapEntry<K, V>
       extends NonTerminalImmutableMapEntry<K, V> {
-    private final transient ImmutableMapEntry<K, V> nextInValueBucket;
+    @CheckForNull private final transient ImmutableMapEntry<K, V> nextInValueBucket;
 
     NonTerminalImmutableBiMapEntry(
         K key,
         V value,
-        ImmutableMapEntry<K, V> nextInKeyBucket,
-        ImmutableMapEntry<K, V> nextInValueBucket) {
+        @CheckForNull ImmutableMapEntry<K, V> nextInKeyBucket,
+        @CheckForNull ImmutableMapEntry<K, V> nextInValueBucket) {
       super(key, value, nextInKeyBucket);
       this.nextInValueBucket = nextInValueBucket;
     }
 
     @Override
-    @Nullable
+    @CheckForNull
     ImmutableMapEntry<K, V> getNextInValueBucket() {
       return nextInValueBucket;
     }
diff --git a/guava/src/com/google/common/collect/ImmutableMapEntrySet.java b/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
index 8305283..6f5503a 100644
--- a/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
+++ b/guava/src/com/google/common/collect/ImmutableMapEntrySet.java
@@ -22,6 +22,7 @@
 import java.util.Map.Entry;
 import java.util.Spliterator;
 import java.util.function.Consumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -31,7 +32,8 @@
  * @author Kevin Bourrillion
  */
 @GwtCompatible(emulated = true)
-abstract class ImmutableMapEntrySet<K, V> extends ImmutableSet<Entry<K, V>> {
+@ElementTypesAreNonnullByDefault
+abstract class ImmutableMapEntrySet<K, V> extends ImmutableSet.CachingAsList<Entry<K, V>> {
   static final class RegularEntrySet<K, V> extends ImmutableMapEntrySet<K, V> {
     private final transient ImmutableMap<K, V> map;
     private final transient ImmutableList<Entry<K, V>> entries;
@@ -52,7 +54,7 @@
 
     @Override
     @GwtIncompatible("not used in GWT")
-    int copyIntoArray(Object[] dst, int offset) {
+    int copyIntoArray(@Nullable Object[] dst, int offset) {
       return entries.copyIntoArray(dst, offset);
     }
 
@@ -87,7 +89,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object object) {
+  public boolean contains(@CheckForNull Object object) {
     if (object instanceof Entry) {
       Entry<?, ?> entry = (Entry<?, ?>) object;
       V value = map().get(entry.getKey());
diff --git a/guava/src/com/google/common/collect/ImmutableMapKeySet.java b/guava/src/com/google/common/collect/ImmutableMapKeySet.java
index 0b28cc2..d10ee10 100644
--- a/guava/src/com/google/common/collect/ImmutableMapKeySet.java
+++ b/guava/src/com/google/common/collect/ImmutableMapKeySet.java
@@ -23,7 +23,7 @@
 import java.io.Serializable;
 import java.util.Spliterator;
 import java.util.function.Consumer;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * {@code keySet()} implementation for {@link ImmutableMap}.
@@ -32,6 +32,7 @@
  * @author Kevin Bourrillion
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class ImmutableMapKeySet<K, V> extends IndexedImmutableSet<K> {
   private final ImmutableMap<K, V> map;
 
@@ -55,7 +56,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return map.containsKey(object);
   }
 
diff --git a/guava/src/com/google/common/collect/ImmutableMapValues.java b/guava/src/com/google/common/collect/ImmutableMapValues.java
index 2950f90..702191c 100644
--- a/guava/src/com/google/common/collect/ImmutableMapValues.java
+++ b/guava/src/com/google/common/collect/ImmutableMapValues.java
@@ -24,7 +24,7 @@
 import java.util.Map.Entry;
 import java.util.Spliterator;
 import java.util.function.Consumer;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * {@code values()} implementation for {@link ImmutableMap}.
@@ -33,6 +33,7 @@
  * @author Kevin Bourrillion
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class ImmutableMapValues<K, V> extends ImmutableCollection<V> {
   private final ImmutableMap<K, V> map;
 
@@ -68,7 +69,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return object != null && Iterators.contains(iterator(), object);
   }
 
diff --git a/guava/src/com/google/common/collect/ImmutableMultimap.java b/guava/src/com/google/common/collect/ImmutableMultimap.java
index cf785ef..5dfbb9b 100644
--- a/guava/src/com/google/common/collect/ImmutableMultimap.java
+++ b/guava/src/com/google/common/collect/ImmutableMultimap.java
@@ -18,11 +18,14 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
+import static com.google.common.collect.Maps.immutableEntry;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.DoNotMock;
 import com.google.j2objc.annotations.Weak;
 import com.google.j2objc.annotations.WeakOuter;
@@ -37,6 +40,7 @@
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.function.BiConsumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -66,10 +70,15 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableMultimap<K, V> extends BaseImmutableMultimap<K, V>
     implements Serializable {
 
-  /** Returns an empty multimap. */
+  /**
+   * Returns an empty multimap.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   public static <K, V> ImmutableMultimap<K, V> of() {
     return ImmutableListMultimap.of();
   }
@@ -140,9 +149,9 @@
    */
   @DoNotMock
   public static class Builder<K, V> {
-    Map<K, Collection<V>> builderMap;
-    @Nullable Comparator<? super K> keyComparator;
-    @Nullable Comparator<? super V> valueComparator;
+    final Map<K, Collection<V>> builderMap;
+    @CheckForNull Comparator<? super K> keyComparator;
+    @CheckForNull Comparator<? super V> valueComparator;
 
     /**
      * Creates a new builder. The returned builder is equivalent to the builder generated by {@link
@@ -358,7 +367,11 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public ImmutableCollection<V> removeAll(Object key) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  // DoNotCall wants this to be final, but we want to override it to return more specific types.
+  // Inheritance is closed, and all subtypes are @DoNotCall, so this is safe to suppress.
+  @SuppressWarnings("DoNotCall")
+  public ImmutableCollection<V> removeAll(@CheckForNull Object key) {
     throw new UnsupportedOperationException();
   }
 
@@ -371,6 +384,10 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  // DoNotCall wants this to be final, but we want to override it to return more specific types.
+  // Inheritance is closed, and all subtypes are @DoNotCall, so this is safe to suppress.
+  @SuppressWarnings("DoNotCall")
   public ImmutableCollection<V> replaceValues(K key, Iterable<? extends V> values) {
     throw new UnsupportedOperationException();
   }
@@ -383,7 +400,8 @@
    */
   @Deprecated
   @Override
-  public void clear() {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void clear() {
     throw new UnsupportedOperationException();
   }
 
@@ -412,7 +430,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public boolean put(K key, V value) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final boolean put(K key, V value) {
     throw new UnsupportedOperationException();
   }
 
@@ -425,7 +444,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public boolean putAll(K key, Iterable<? extends V> values) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final boolean putAll(K key, Iterable<? extends V> values) {
     throw new UnsupportedOperationException();
   }
 
@@ -438,7 +458,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public boolean putAll(Multimap<? extends K, ? extends V> multimap) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final boolean putAll(Multimap<? extends K, ? extends V> multimap) {
     throw new UnsupportedOperationException();
   }
 
@@ -451,7 +472,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public boolean remove(Object key, Object value) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
     throw new UnsupportedOperationException();
   }
 
@@ -468,12 +490,12 @@
   // accessors
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return map.containsKey(key);
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return value != null && super.containsValue(value);
   }
 
@@ -547,7 +569,7 @@
     }
 
     @Override
-    public boolean contains(Object object) {
+    public boolean contains(@CheckForNull Object object) {
       if (object instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) object;
         return multimap.containsEntry(entry.getKey(), entry.getValue());
@@ -563,7 +585,7 @@
     return new UnmodifiableIterator<Entry<K, V>>() {
       final Iterator<? extends Entry<K, ? extends ImmutableCollection<V>>> asMapItr =
           map.entrySet().iterator();
-      K currentKey = null;
+      @CheckForNull K currentKey = null;
       Iterator<V> valueItr = Iterators.emptyIterator();
 
       @Override
@@ -578,7 +600,11 @@
           currentKey = entry.getKey();
           valueItr = entry.getValue().iterator();
         }
-        return Maps.immutableEntry(currentKey, valueItr.next());
+        /*
+         * requireNonNull is safe: The first call to this method always enters the !hasNext() case
+         * and populates currentKey, after which it's never cleared.
+         */
+        return immutableEntry(requireNonNull(currentKey), valueItr.next());
       }
     };
   }
@@ -624,12 +650,12 @@
   @WeakOuter
   class Keys extends ImmutableMultiset<K> {
     @Override
-    public boolean contains(@Nullable Object object) {
+    public boolean contains(@CheckForNull Object object) {
       return containsKey(object);
     }
 
     @Override
-    public int count(@Nullable Object element) {
+    public int count(@CheckForNull Object element) {
       Collection<V> values = map.get(element);
       return (values == null) ? 0 : values.size();
     }
@@ -718,7 +744,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object object) {
+    public boolean contains(@CheckForNull Object object) {
       return multimap.containsValue(object);
     }
 
@@ -729,7 +755,7 @@
 
     @GwtIncompatible // not present in emulated superclass
     @Override
-    int copyIntoArray(Object[] dst, int offset) {
+    int copyIntoArray(@Nullable Object[] dst, int offset) {
       for (ImmutableCollection<V> valueCollection : multimap.map.values()) {
         offset = valueCollection.copyIntoArray(dst, offset);
       }
diff --git a/guava/src/com/google/common/collect/ImmutableMultiset.java b/guava/src/com/google/common/collect/ImmutableMultiset.java
index 77d6cc5..f397a49 100644
--- a/guava/src/com/google/common/collect/ImmutableMultiset.java
+++ b/guava/src/com/google/common/collect/ImmutableMultiset.java
@@ -17,11 +17,13 @@
 package com.google.common.collect;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.Serializable;
@@ -33,6 +35,7 @@
 import java.util.function.Function;
 import java.util.function.ToIntFunction;
 import java.util.stream.Collector;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -52,6 +55,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableMultiset<E> extends ImmutableMultisetGwtSerializationDependencies<E>
     implements Multiset<E> {
 
@@ -63,7 +67,7 @@
    * @since 21.0
    */
   public static <E> Collector<E, ?, ImmutableMultiset<E>> toImmutableMultiset() {
-    return toImmutableMultiset(Function.identity(), e -> 1);
+    return CollectCollectors.toImmutableMultiset(Function.identity(), e -> 1);
   }
 
   /**
@@ -77,22 +81,18 @@
    *
    * @since 22.0
    */
-  public static <T, E> Collector<T, ?, ImmutableMultiset<E>> toImmutableMultiset(
-      Function<? super T, ? extends E> elementFunction, ToIntFunction<? super T> countFunction) {
-    checkNotNull(elementFunction);
-    checkNotNull(countFunction);
-    return Collector.of(
-        LinkedHashMultiset::create,
-        (multiset, t) ->
-            multiset.add(checkNotNull(elementFunction.apply(t)), countFunction.applyAsInt(t)),
-        (multiset1, multiset2) -> {
-          multiset1.addAll(multiset2);
-          return multiset1;
-        },
-        (Multiset<E> multiset) -> copyFromEntries(multiset.entrySet()));
+  public static <T extends @Nullable Object, E>
+      Collector<T, ?, ImmutableMultiset<E>> toImmutableMultiset(
+          Function<? super T, ? extends E> elementFunction,
+          ToIntFunction<? super T> countFunction) {
+    return CollectCollectors.toImmutableMultiset(elementFunction, countFunction);
   }
 
-  /** Returns the empty immutable multiset. */
+  /**
+   * Returns the empty immutable multiset.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked") // all supported methods are covariant
   public static <E> ImmutableMultiset<E> of() {
     return (ImmutableMultiset<E>) RegularImmutableMultiset.EMPTY;
@@ -104,7 +104,6 @@
    * @throws NullPointerException if {@code element} is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") // generic array created but never written
   public static <E> ImmutableMultiset<E> of(E element) {
     return copyFromElements(element);
   }
@@ -115,7 +114,6 @@
    * @throws NullPointerException if any element is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") //
   public static <E> ImmutableMultiset<E> of(E e1, E e2) {
     return copyFromElements(e1, e2);
   }
@@ -127,7 +125,6 @@
    * @throws NullPointerException if any element is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") //
   public static <E> ImmutableMultiset<E> of(E e1, E e2, E e3) {
     return copyFromElements(e1, e2, e3);
   }
@@ -139,7 +136,6 @@
    * @throws NullPointerException if any element is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") //
   public static <E> ImmutableMultiset<E> of(E e1, E e2, E e3, E e4) {
     return copyFromElements(e1, e2, e3, e4);
   }
@@ -151,7 +147,6 @@
    * @throws NullPointerException if any element is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") //
   public static <E> ImmutableMultiset<E> of(E e1, E e2, E e3, E e4, E e5) {
     return copyFromElements(e1, e2, e3, e4, e5);
   }
@@ -163,7 +158,6 @@
    * @throws NullPointerException if any element is null
    * @since 6.0 (source-compatible since 2.0)
    */
-  @SuppressWarnings("unchecked") //
   public static <E> ImmutableMultiset<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E... others) {
     return new Builder<E>().add(e1).add(e2).add(e3).add(e4).add(e5).add(e6).add(others).build();
   }
@@ -236,7 +230,7 @@
     final Iterator<Entry<E>> entryIterator = entrySet().iterator();
     return new UnmodifiableIterator<E>() {
       int remaining;
-      @Nullable E element;
+      @CheckForNull E element;
 
       @Override
       public boolean hasNext() {
@@ -251,12 +245,16 @@
           remaining = entry.getCount();
         }
         remaining--;
-        return element;
+        /*
+         * requireNonNull is safe because `remaining` starts at 0, forcing us to initialize
+         * `element` above. After that, we never clear it.
+         */
+        return requireNonNull(element);
       }
     };
   }
 
-  @LazyInit private transient ImmutableList<E> asList;
+  @LazyInit @CheckForNull private transient ImmutableList<E> asList;
 
   @Override
   public ImmutableList<E> asList() {
@@ -265,7 +263,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return count(object) > 0;
   }
 
@@ -278,6 +276,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final int add(E element, int occurrences) {
     throw new UnsupportedOperationException();
   }
@@ -291,7 +290,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public final int remove(Object element, int occurrences) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final int remove(@CheckForNull Object element, int occurrences) {
     throw new UnsupportedOperationException();
   }
 
@@ -304,6 +304,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final int setCount(E element, int count) {
     throw new UnsupportedOperationException();
   }
@@ -317,6 +318,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final boolean setCount(E element, int oldCount, int newCount) {
     throw new UnsupportedOperationException();
   }
@@ -332,7 +334,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     return Multisets.equalsImpl(this, object);
   }
 
@@ -350,7 +352,7 @@
   @Override
   public abstract ImmutableSet<E> elementSet();
 
-  @LazyInit private transient ImmutableSet<Entry<E>> entrySet;
+  @LazyInit @CheckForNull private transient ImmutableSet<Entry<E>> entrySet;
 
   @Override
   public ImmutableSet<Entry<E>> entrySet() {
@@ -382,7 +384,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Entry) {
         Entry<?> entry = (Entry<?>) o;
         if (entry.getCount() <= 0) {
@@ -597,7 +599,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object object) {
+    public boolean contains(@CheckForNull Object object) {
       return delegate.contains(object);
     }
 
@@ -616,12 +618,13 @@
     final Object[] elements;
     final int[] counts;
 
-    SerializedForm(Multiset<?> multiset) {
+    // "extends Object" works around https://github.com/typetools/checker-framework/issues/3013
+    SerializedForm(Multiset<? extends Object> multiset) {
       int distinct = multiset.entrySet().size();
       elements = new Object[distinct];
       counts = new int[distinct];
       int i = 0;
-      for (Entry<?> entry : multiset.entrySet()) {
+      for (Entry<? extends Object> entry : multiset.entrySet()) {
         elements[i] = entry.getElement();
         counts[i] = entry.getCount();
         i++;
diff --git a/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java b/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
index a8b1899..2469a18 100644
--- a/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
+++ b/guava/src/com/google/common/collect/ImmutableMultisetGwtSerializationDependencies.java
@@ -37,4 +37,5 @@
  * and make types non-final.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ImmutableMultisetGwtSerializationDependencies<E> extends ImmutableCollection<E> {}
diff --git a/guava/src/com/google/common/collect/ImmutableRangeMap.java b/guava/src/com/google/common/collect/ImmutableRangeMap.java
index f164701..e1979ab 100644
--- a/guava/src/com/google/common/collect/ImmutableRangeMap.java
+++ b/guava/src/com/google/common/collect/ImmutableRangeMap.java
@@ -23,6 +23,7 @@
 import com.google.common.collect.SortedLists.KeyAbsentBehavior;
 import com.google.common.collect.SortedLists.KeyPresentBehavior;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
 import java.util.Collections;
@@ -33,6 +34,7 @@
 import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.stream.Collector;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -44,6 +46,7 @@
  */
 @Beta
 @GwtIncompatible // NavigableMap
+@ElementTypesAreNonnullByDefault
 public class ImmutableRangeMap<K extends Comparable<?>, V> implements RangeMap<K, V>, Serializable {
 
   private static final ImmutableRangeMap<Comparable<?>, Object> EMPTY =
@@ -55,14 +58,18 @@
    *
    * @since 23.1
    */
-  public static <T, K extends Comparable<? super K>, V>
+  public static <T extends @Nullable Object, K extends Comparable<? super K>, V>
       Collector<T, ?, ImmutableRangeMap<K, V>> toImmutableRangeMap(
           Function<? super T, Range<K>> keyFunction,
           Function<? super T, ? extends V> valueFunction) {
     return CollectCollectors.toImmutableRangeMap(keyFunction, valueFunction);
   }
 
-  /** Returns an empty immutable range map. */
+  /**
+   * Returns an empty immutable range map.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked")
   public static <K extends Comparable<?>, V> ImmutableRangeMap<K, V> of() {
     return (ImmutableRangeMap<K, V>) EMPTY;
@@ -171,7 +178,8 @@
   }
 
   @Override
-  public @Nullable V get(K key) {
+  @CheckForNull
+  public V get(K key) {
     int index =
         SortedLists.binarySearch(
             ranges,
@@ -188,7 +196,8 @@
   }
 
   @Override
-  public @Nullable Entry<Range<K>, V> getEntry(K key) {
+  @CheckForNull
+  public Entry<Range<K>, V> getEntry(K key) {
     int index =
         SortedLists.binarySearch(
             ranges,
@@ -222,7 +231,8 @@
    */
   @Deprecated
   @Override
-  public void put(Range<K> range, V value) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void put(Range<K> range, V value) {
     throw new UnsupportedOperationException();
   }
 
@@ -234,7 +244,8 @@
    */
   @Deprecated
   @Override
-  public void putCoalescing(Range<K> range, V value) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void putCoalescing(Range<K> range, V value) {
     throw new UnsupportedOperationException();
   }
 
@@ -246,7 +257,8 @@
    */
   @Deprecated
   @Override
-  public void putAll(RangeMap<K, V> rangeMap) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void putAll(RangeMap<K, V> rangeMap) {
     throw new UnsupportedOperationException();
   }
 
@@ -258,7 +270,8 @@
    */
   @Deprecated
   @Override
-  public void clear() {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void clear() {
     throw new UnsupportedOperationException();
   }
 
@@ -270,7 +283,8 @@
    */
   @Deprecated
   @Override
-  public void remove(Range<K> range) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void remove(Range<K> range) {
     throw new UnsupportedOperationException();
   }
 
@@ -282,10 +296,11 @@
    */
   @Deprecated
   @Override
-  public void merge(
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void merge(
       Range<K> range,
-      @Nullable V value,
-      BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
+      @CheckForNull V value,
+      BiFunction<? super V, ? super @Nullable V, ? extends @Nullable V> remappingFunction) {
     throw new UnsupportedOperationException();
   }
 
@@ -376,7 +391,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object o) {
+  public boolean equals(@CheckForNull Object o) {
     if (o instanceof RangeMap) {
       RangeMap<?, ?> rangeMap = (RangeMap<?, ?>) o;
       return asMapOfRanges().equals(rangeMap.asMapOfRanges());
diff --git a/guava/src/com/google/common/collect/ImmutableRangeSet.java b/guava/src/com/google/common/collect/ImmutableRangeSet.java
index df063a8..f279aae 100644
--- a/guava/src/com/google/common/collect/ImmutableRangeSet.java
+++ b/guava/src/com/google/common/collect/ImmutableRangeSet.java
@@ -20,6 +20,7 @@
 import static com.google.common.collect.SortedLists.KeyAbsentBehavior.NEXT_HIGHER;
 import static com.google.common.collect.SortedLists.KeyAbsentBehavior.NEXT_LOWER;
 import static com.google.common.collect.SortedLists.KeyPresentBehavior.ANY_PRESENT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -27,6 +28,7 @@
 import com.google.common.collect.SortedLists.KeyPresentBehavior;
 import com.google.common.primitives.Ints;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.io.Serializable;
 import java.util.Collections;
@@ -35,7 +37,7 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.stream.Collector;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link RangeSet} whose contents will never change, with many other important properties
@@ -46,6 +48,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ImmutableRangeSet<C extends Comparable> extends AbstractRangeSet<C>
     implements Serializable {
 
@@ -67,7 +70,11 @@
     return CollectCollectors.toImmutableRangeSet();
   }
 
-  /** Returns an empty immutable range set. */
+  /**
+   * Returns an empty immutable range set.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked")
   public static <C extends Comparable> ImmutableRangeSet<C> of() {
     return (ImmutableRangeSet<C>) EMPTY;
@@ -181,6 +188,7 @@
   }
 
   @Override
+  @CheckForNull
   public Range<C> rangeContaining(C value) {
     int index =
         SortedLists.binarySearch(
@@ -218,6 +226,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void add(Range<C> range) {
     throw new UnsupportedOperationException();
   }
@@ -230,6 +239,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void addAll(RangeSet<C> other) {
     throw new UnsupportedOperationException();
   }
@@ -242,6 +252,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void addAll(Iterable<Range<C>> other) {
     throw new UnsupportedOperationException();
   }
@@ -254,6 +265,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void remove(Range<C> range) {
     throw new UnsupportedOperationException();
   }
@@ -266,6 +278,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void removeAll(RangeSet<C> other) {
     throw new UnsupportedOperationException();
   }
@@ -278,6 +291,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void removeAll(Iterable<Range<C>> other) {
     throw new UnsupportedOperationException();
   }
@@ -298,7 +312,7 @@
     return new RegularImmutableSortedSet<>(ranges.reverse(), Range.<C>rangeLexOrdering().reverse());
   }
 
-  @LazyInit private transient ImmutableRangeSet<C> complement;
+  @LazyInit @CheckForNull private transient ImmutableRangeSet<C> complement;
 
   private final class ComplementRanges extends ImmutableList<Range<C>> {
     // True if the "positive" range set is empty or bounded below.
@@ -540,7 +554,7 @@
       this.domain = domain;
     }
 
-    private transient @Nullable Integer size;
+    @CheckForNull private transient Integer size;
 
     @Override
     public int size() {
@@ -566,6 +580,7 @@
         Iterator<C> elemItr = Iterators.emptyIterator();
 
         @Override
+        @CheckForNull
         protected C computeNext() {
           while (!elemItr.hasNext()) {
             if (rangeItr.hasNext()) {
@@ -587,6 +602,7 @@
         Iterator<C> elemItr = Iterators.emptyIterator();
 
         @Override
+        @CheckForNull
         protected C computeNext() {
           while (!elemItr.hasNext()) {
             if (rangeItr.hasNext()) {
@@ -627,7 +643,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o == null) {
         return false;
       }
@@ -641,10 +657,10 @@
     }
 
     @Override
-    int indexOf(Object target) {
+    int indexOf(@CheckForNull Object target) {
       if (contains(target)) {
         @SuppressWarnings("unchecked") // if it's contained, it's definitely a C
-        C c = (C) target;
+        C c = (C) requireNonNull(target);
         long total = 0;
         for (Range<C> range : ranges) {
           if (range.contains(c)) {
diff --git a/guava/src/com/google/common/collect/ImmutableSet.java b/guava/src/com/google/common/collect/ImmutableSet.java
index 097b877..73d5b09 100644
--- a/guava/src/com/google/common/collect/ImmutableSet.java
+++ b/guava/src/com/google/common/collect/ImmutableSet.java
@@ -19,6 +19,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -40,6 +41,7 @@
 import java.util.Spliterator;
 import java.util.function.Consumer;
 import java.util.stream.Collector;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -50,6 +52,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableSet<E> extends ImmutableCollection<E> implements Set<E> {
   static final int SPLITERATOR_CHARACTERISTICS =
       ImmutableCollection.SPLITERATOR_CHARACTERISTICS | Spliterator.DISTINCT;
@@ -69,6 +72,8 @@
   /**
    * Returns the empty immutable set. Preferred over {@link Collections#emptySet} for code
    * consistency, and because the return type conveys the immutability guarantee.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
    */
   @SuppressWarnings({"unchecked"}) // fully variant implementation (never actually produces any Es)
   public static <E> ImmutableSet<E> of() {
@@ -307,10 +312,11 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
-    } else if (object instanceof ImmutableSet
+    }
+    if (object instanceof ImmutableSet
         && isHashCodeFast()
         && ((ImmutableSet<?>) object).isHashCodeFast()
         && hashCode() != object.hashCode()) {
@@ -329,19 +335,26 @@
   @Override
   public abstract UnmodifiableIterator<E> iterator();
 
-  @LazyInit @RetainedWith private transient @Nullable ImmutableList<E> asList;
+  @GwtCompatible
+  abstract static class CachingAsList<E> extends ImmutableSet<E> {
+    @LazyInit @RetainedWith @CheckForNull private transient ImmutableList<E> asList;
 
-  @Override
-  public ImmutableList<E> asList() {
-    ImmutableList<E> result = asList;
-    return (result == null) ? asList = createAsList() : result;
+    @Override
+    public ImmutableList<E> asList() {
+      ImmutableList<E> result = asList;
+      if (result == null) {
+        return asList = createAsList();
+      } else {
+        return result;
+      }
+    }
+
+    ImmutableList<E> createAsList() {
+      return new RegularImmutableAsList<E>(this, toArray());
+    }
   }
 
-  ImmutableList<E> createAsList() {
-    return new RegularImmutableAsList<E>(this, toArray());
-  }
-
-  abstract static class Indexed<E> extends ImmutableSet<E> {
+  abstract static class Indexed<E> extends CachingAsList<E> {
     abstract E get(int index);
 
     @Override
@@ -364,7 +377,7 @@
     }
 
     @Override
-    int copyIntoArray(Object[] dst, int offset) {
+    int copyIntoArray(@Nullable Object[] dst, int offset) {
       return asList().copyIntoArray(dst, offset);
     }
 
@@ -436,24 +449,6 @@
     return new Builder<E>(expectedSize);
   }
 
-  /** Builds a new open-addressed hash table from the first n objects in elements. */
-  static Object[] rebuildHashTable(int newTableSize, Object[] elements, int n) {
-    Object[] hashTable = new Object[newTableSize];
-    int mask = hashTable.length - 1;
-    for (int i = 0; i < n; i++) {
-      Object e = elements[i];
-      int j0 = Hashing.smear(e.hashCode());
-      for (int j = j0; ; j++) {
-        int index = j & mask;
-        if (hashTable[index] == null) {
-          hashTable[index] = e;
-          break;
-        }
-      }
-    }
-    return hashTable;
-  }
-
   /**
    * A builder for creating {@code ImmutableSet} instances. Example:
    *
@@ -473,15 +468,24 @@
    * @since 2.0
    */
   public static class Builder<E> extends ImmutableCollection.Builder<E> {
-    private SetBuilderImpl<E> impl;
+    /*
+     * `impl` is null only for instances of the subclass, ImmutableSortedSet.Builder. That subclass
+     * overrides all the methods that access it here. Thus, all the methods here can safely assume
+     * that this field is non-null.
+     */
+    @CheckForNull private SetBuilderImpl<E> impl;
     boolean forceCopy;
 
     public Builder() {
-      this(DEFAULT_INITIAL_CAPACITY);
+      this(0);
     }
 
     Builder(int capacity) {
-      impl = new RegularSetBuilderImpl<E>(capacity);
+      if (capacity > 0) {
+        impl = new RegularSetBuilderImpl<E>(capacity);
+      } else {
+        impl = EmptySetBuilderImpl.instance();
+      }
     }
 
     Builder(@SuppressWarnings("unused") boolean subclass) {
@@ -490,6 +494,7 @@
 
     @VisibleForTesting
     void forceJdk() {
+      requireNonNull(impl); // see the comment on the field
       this.impl = new JdkBackedSetBuilderImpl<E>(impl);
     }
 
@@ -501,12 +506,14 @@
     }
 
     void copy() {
+      requireNonNull(impl); // see the comment on the field
       impl = impl.copy();
     }
 
     @Override
     @CanIgnoreReturnValue
     public Builder<E> add(E element) {
+      requireNonNull(impl); // see the comment on the field
       checkNotNull(element);
       copyIfNecessary();
       impl = impl.add(element);
@@ -543,6 +550,16 @@
     }
 
     Builder<E> combine(Builder<E> other) {
+      requireNonNull(impl);
+      requireNonNull(other.impl);
+      /*
+       * For discussion of requireNonNull, see the comment on the field.
+       *
+       * (And I don't believe there's any situation in which we call x.combine(y) when x is a plain
+       * ImmutableSet.Builder but y is an ImmutableSortedSet.Builder (or vice versa). Certainly
+       * ImmutableSortedSet.Builder.combine() is written as if its argument will never be a plain
+       * ImmutableSet.Builder: It casts immediately to ImmutableSortedSet.Builder.)
+       */
       copyIfNecessary();
       this.impl = this.impl.combine(other.impl);
       return this;
@@ -550,6 +567,7 @@
 
     @Override
     public ImmutableSet<E> build() {
+      requireNonNull(impl); // see the comment on the field
       forceCopy = true;
       impl = impl.review();
       return impl.build();
@@ -558,6 +576,8 @@
 
   /** Swappable internal implementation of an ImmutableSet.Builder. */
   private abstract static class SetBuilderImpl<E> {
+    // The first `distinct` elements are non-null.
+    // Since we can never access null elements, we don't mark this nullable.
     E[] dedupedElements;
     int distinct;
 
@@ -601,7 +621,11 @@
     final SetBuilderImpl<E> combine(SetBuilderImpl<E> other) {
       SetBuilderImpl<E> result = this;
       for (int i = 0; i < other.distinct; i++) {
-        result = result.add(other.dedupedElements[i]);
+        /*
+         * requireNonNull is safe because we ensure that the first `distinct` elements have been
+         * populated.
+         */
+        result = result.add(requireNonNull(other.dedupedElements[i]));
       }
       return result;
     }
@@ -623,6 +647,34 @@
     abstract ImmutableSet<E> build();
   }
 
+  private static final class EmptySetBuilderImpl<E> extends SetBuilderImpl<E> {
+    private static final EmptySetBuilderImpl<Object> INSTANCE = new EmptySetBuilderImpl<>();
+
+    @SuppressWarnings("unchecked")
+    static <E> SetBuilderImpl<E> instance() {
+      return (SetBuilderImpl<E>) INSTANCE;
+    }
+
+    private EmptySetBuilderImpl() {
+      super(0);
+    }
+
+    @Override
+    SetBuilderImpl<E> add(E e) {
+      return new RegularSetBuilderImpl<E>(Builder.DEFAULT_INITIAL_CAPACITY).add(e);
+    }
+
+    @Override
+    SetBuilderImpl<E> copy() {
+      return this;
+    }
+
+    @Override
+    ImmutableSet<E> build() {
+      return ImmutableSet.of();
+    }
+  }
+
   // We use power-of-2 tables, and this is the highest int that's a power of 2
   static final int MAX_TABLE_SIZE = Ints.MAX_POWER_OF_TWO;
 
@@ -637,7 +689,7 @@
    * with linear probing in its implementation. The returned size is the smallest power of two that
    * can hold setSize elements with the desired load factor. Always returns at least setSize + 2.
    */
-  @VisibleForTesting
+  // TODO(cpovirk): Move to Hashing or something, since it's used elsewhere in the Android version.
   static int chooseTableSize(int setSize) {
     setSize = Math.max(setSize, 2);
     // Correct the size for open addressing to match desired load factor.
@@ -656,92 +708,6 @@
   }
 
   /**
-   * We attempt to detect deliberate hash flooding attempts, and if one is detected, fall back to a
-   * wrapper around j.u.HashSet, which has built in flooding protection. HASH_FLOODING_FPP is the
-   * maximum allowed probability of falsely detecting a hash flooding attack if the input is
-   * randomly generated.
-   *
-   * <p>MAX_RUN_MULTIPLIER was determined experimentally to match this FPP.
-   */
-  static final double HASH_FLOODING_FPP = 0.001;
-
-  // NB: yes, this is surprisingly high, but that's what the experiments said was necessary
-  // The higher it is, the worse constant factors we are willing to accept.
-  static final int MAX_RUN_MULTIPLIER = 13;
-
-  /**
-   * Checks the whole hash table for poor hash distribution. Takes O(n) in the worst case, O(n / log
-   * n) on average.
-   *
-   * <p>The online hash flooding detecting in RegularSetBuilderImpl.add can detect e.g. many exactly
-   * matching hash codes, which would cause construction to take O(n^2), but can't detect e.g. hash
-   * codes adversarially designed to go into ascending table locations, which keeps construction
-   * O(n) (as desired) but then can have O(n) queries later.
-   *
-   * <p>If this returns false, then no query can take more than O(log n).
-   *
-   * <p>Note that for a RegularImmutableSet with elements with truly random hash codes, contains
-   * operations take expected O(1) time but with high probability take O(log n) for at least some
-   * element. (https://en.wikipedia.org/wiki/Linear_probing#Analysis)
-   *
-   * <p>This method may return {@code true} up to {@link #HASH_FLOODING_FPP} of the time even on
-   * truly random input.
-   *
-   * <p>If this method returns false, there are definitely no runs of length at least {@code
-   * maxRunBeforeFallback(hashTable.length)} nonnull elements. If there are no runs of length at
-   * least {@code maxRunBeforeFallback(hashTable.length) / 2} nonnull elements, this method
-   * definitely returns false. In between those constraints, the result of this method is undefined,
-   * subject to the above {@link #HASH_FLOODING_FPP} constraint.
-   */
-  static boolean hashFloodingDetected(Object[] hashTable) {
-    int maxRunBeforeFallback = maxRunBeforeFallback(hashTable.length);
-
-    // Test for a run wrapping around the end of the table of length at least maxRunBeforeFallback.
-    int endOfStartRun;
-    for (endOfStartRun = 0; endOfStartRun < hashTable.length; ) {
-      if (hashTable[endOfStartRun] == null) {
-        break;
-      }
-      endOfStartRun++;
-      if (endOfStartRun > maxRunBeforeFallback) {
-        return true;
-      }
-    }
-    int startOfEndRun;
-    for (startOfEndRun = hashTable.length - 1; startOfEndRun > endOfStartRun; startOfEndRun--) {
-      if (hashTable[startOfEndRun] == null) {
-        break;
-      }
-      if (endOfStartRun + (hashTable.length - 1 - startOfEndRun) > maxRunBeforeFallback) {
-        return true;
-      }
-    }
-
-    // Now, break the remainder of the table into blocks of maxRunBeforeFallback/2 elements and
-    // check that each has at least one null.
-    int testBlockSize = maxRunBeforeFallback / 2;
-    blockLoop:
-    for (int i = endOfStartRun + 1; i + testBlockSize <= startOfEndRun; i += testBlockSize) {
-      for (int j = 0; j < testBlockSize; j++) {
-        if (hashTable[i + j] == null) {
-          continue blockLoop;
-        }
-      }
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * If more than this many consecutive positions are filled in a table of the specified size,
-   * report probable hash flooding. ({@link #hashFloodingDetected} may also report hash flooding if
-   * fewer consecutive positions are filled; see that method for details.)
-   */
-  private static int maxRunBeforeFallback(int tableSize) {
-    return MAX_RUN_MULTIPLIER * IntMath.log2(tableSize, RoundingMode.UNNECESSARY);
-  }
-
-  /**
    * Default implementation of the guts of ImmutableSet.Builder, creating an open-addressed hash
    * table and deduplicating elements as they come, so it only allocates O(max(distinct,
    * expectedCapacity)) rather than O(calls to add).
@@ -750,39 +716,46 @@
    * JdkBackedSetBuilderImpl.
    */
   private static final class RegularSetBuilderImpl<E> extends SetBuilderImpl<E> {
-    private Object[] hashTable;
+    // null until at least two elements are present
+    private @Nullable Object @Nullable [] hashTable;
     private int maxRunBeforeFallback;
     private int expandTableThreshold;
     private int hashCode;
 
     RegularSetBuilderImpl(int expectedCapacity) {
       super(expectedCapacity);
-      int tableSize = chooseTableSize(expectedCapacity);
-      this.hashTable = new Object[tableSize];
-      this.maxRunBeforeFallback = maxRunBeforeFallback(tableSize);
-      this.expandTableThreshold = (int) (DESIRED_LOAD_FACTOR * tableSize);
+      this.hashTable = null;
+      this.maxRunBeforeFallback = 0;
+      this.expandTableThreshold = 0;
     }
 
     RegularSetBuilderImpl(RegularSetBuilderImpl<E> toCopy) {
       super(toCopy);
-      this.hashTable = Arrays.copyOf(toCopy.hashTable, toCopy.hashTable.length);
+      this.hashTable = (toCopy.hashTable == null) ? null : toCopy.hashTable.clone();
       this.maxRunBeforeFallback = toCopy.maxRunBeforeFallback;
       this.expandTableThreshold = toCopy.expandTableThreshold;
       this.hashCode = toCopy.hashCode;
     }
 
-    void ensureTableCapacity(int minCapacity) {
-      if (minCapacity > expandTableThreshold && hashTable.length < MAX_TABLE_SIZE) {
-        int newTableSize = hashTable.length * 2;
-        hashTable = rebuildHashTable(newTableSize, dedupedElements, distinct);
-        maxRunBeforeFallback = maxRunBeforeFallback(newTableSize);
-        expandTableThreshold = (int) (DESIRED_LOAD_FACTOR * newTableSize);
-      }
-    }
-
     @Override
     SetBuilderImpl<E> add(E e) {
       checkNotNull(e);
+      if (hashTable == null) {
+        if (distinct == 0) {
+          addDedupedElement(e);
+          return this;
+        } else {
+          ensureTableCapacity(dedupedElements.length);
+          E elem = dedupedElements[0];
+          distinct--;
+          return insertInHashTable(elem).add(e);
+        }
+      }
+      return insertInHashTable(e);
+    }
+
+    private SetBuilderImpl<E> insertInHashTable(E e) {
+      requireNonNull(hashTable);
       int eHash = e.hashCode();
       int i0 = Hashing.smear(eHash);
       int mask = hashTable.length - 1;
@@ -810,6 +783,9 @@
 
     @Override
     SetBuilderImpl<E> review() {
+      if (hashTable == null) {
+        return this;
+      }
       int targetTableSize = chooseTableSize(distinct);
       if (targetTableSize * 2 < hashTable.length) {
         hashTable = rebuildHashTable(targetTableSize, dedupedElements, distinct);
@@ -825,15 +801,134 @@
         case 0:
           return of();
         case 1:
-          return of(dedupedElements[0]);
+          /*
+           * requireNonNull is safe because we ensure that the first `distinct` elements have been
+           * populated.
+           */
+          return of(requireNonNull(dedupedElements[0]));
         default:
+          /*
+           * The suppression is safe because we ensure that the first `distinct` elements have been
+           * populated.
+           */
+          @SuppressWarnings("nullness")
           Object[] elements =
               (distinct == dedupedElements.length)
                   ? dedupedElements
                   : Arrays.copyOf(dedupedElements, distinct);
-          return new RegularImmutableSet<E>(elements, hashCode, hashTable, hashTable.length - 1);
+          return new RegularImmutableSet<E>(
+              elements, hashCode, requireNonNull(hashTable), hashTable.length - 1);
       }
     }
+
+    /** Builds a new open-addressed hash table from the first n objects in elements. */
+    static @Nullable Object[] rebuildHashTable(int newTableSize, Object[] elements, int n) {
+      @Nullable Object[] hashTable = new @Nullable Object[newTableSize];
+      int mask = hashTable.length - 1;
+      for (int i = 0; i < n; i++) {
+        // requireNonNull is safe because we ensure that the first n elements have been populated.
+        Object e = requireNonNull(elements[i]);
+        int j0 = Hashing.smear(e.hashCode());
+        for (int j = j0; ; j++) {
+          int index = j & mask;
+          if (hashTable[index] == null) {
+            hashTable[index] = e;
+            break;
+          }
+        }
+      }
+      return hashTable;
+    }
+
+    void ensureTableCapacity(int minCapacity) {
+      int newTableSize;
+      if (hashTable == null) {
+        newTableSize = chooseTableSize(minCapacity);
+        hashTable = new Object[newTableSize];
+      } else if (minCapacity > expandTableThreshold && hashTable.length < MAX_TABLE_SIZE) {
+        newTableSize = hashTable.length * 2;
+        hashTable = rebuildHashTable(newTableSize, dedupedElements, distinct);
+      } else {
+        return;
+      }
+      maxRunBeforeFallback = maxRunBeforeFallback(newTableSize);
+      expandTableThreshold = (int) (DESIRED_LOAD_FACTOR * newTableSize);
+    }
+
+    /**
+     * We attempt to detect deliberate hash flooding attempts. If one is detected, we fall back to a
+     * wrapper around j.u.HashSet, which has built in flooding protection. MAX_RUN_MULTIPLIER was
+     * determined experimentally to match our desired probability of false positives.
+     */
+    // NB: yes, this is surprisingly high, but that's what the experiments said was necessary
+    // Raising this number slows the worst-case contains behavior, speeds up hashFloodingDetected,
+    // and reduces the false-positive probability.
+    static final int MAX_RUN_MULTIPLIER = 13;
+
+    /**
+     * Checks the whole hash table for poor hash distribution. Takes O(n) in the worst case, O(n /
+     * log n) on average.
+     *
+     * <p>The online hash flooding detecting in RegularSetBuilderImpl.add can detect e.g. many
+     * exactly matching hash codes, which would cause construction to take O(n^2), but can't detect
+     * e.g. hash codes adversarially designed to go into ascending table locations, which keeps
+     * construction O(n) (as desired) but then can have O(n) queries later.
+     *
+     * <p>If this returns false, then no query can take more than O(log n).
+     *
+     * <p>Note that for a RegularImmutableSet with elements with truly random hash codes, contains
+     * operations take expected O(1) time but with high probability take O(log n) for at least some
+     * element. (https://en.wikipedia.org/wiki/Linear_probing#Analysis)
+     *
+     * <p>This method may return {@code true} even on truly random input, but {@code
+     * ImmutableSetTest} tests that the probability of that is low.
+     */
+    static boolean hashFloodingDetected(@Nullable Object[] hashTable) {
+      int maxRunBeforeFallback = maxRunBeforeFallback(hashTable.length);
+      int mask = hashTable.length - 1;
+
+      // Invariant: all elements at indices in [knownRunStart, knownRunEnd) are nonnull.
+      // If knownRunStart == knownRunEnd, this is vacuously true.
+      // When knownRunEnd exceeds hashTable.length, it "wraps", detecting runs around the end
+      // of the table.
+      int knownRunStart = 0;
+      int knownRunEnd = 0;
+
+      outerLoop:
+      while (knownRunStart < hashTable.length) {
+        if (knownRunStart == knownRunEnd && hashTable[knownRunStart] == null) {
+          if (hashTable[(knownRunStart + maxRunBeforeFallback - 1) & mask] == null) {
+            // There are only maxRunBeforeFallback - 1 elements between here and there,
+            // so even if they were all nonnull, we wouldn't detect a hash flood.  Therefore,
+            // we can skip them all.
+            knownRunStart += maxRunBeforeFallback;
+          } else {
+            knownRunStart++; // the only case in which maxRunEnd doesn't increase by mRBF
+            // happens about f * (1-f) for f = DESIRED_LOAD_FACTOR, so around 21% of the time
+          }
+          knownRunEnd = knownRunStart;
+        } else {
+          for (int j = knownRunStart + maxRunBeforeFallback - 1; j >= knownRunEnd; j--) {
+            if (hashTable[j & mask] == null) {
+              knownRunEnd = knownRunStart + maxRunBeforeFallback;
+              knownRunStart = j + 1;
+              continue outerLoop;
+            }
+          }
+          return true;
+        }
+      }
+      return false;
+    }
+
+    /**
+     * If more than this many consecutive positions are filled in a table of the specified size,
+     * report probable hash flooding. ({@link #hashFloodingDetected} may also report hash flooding
+     * if fewer consecutive positions are filled; see that method for details.)
+     */
+    static int maxRunBeforeFallback(int tableSize) {
+      return MAX_RUN_MULTIPLIER * IntMath.log2(tableSize, RoundingMode.UNNECESSARY);
+    }
   }
 
   /**
@@ -846,7 +941,11 @@
       super(toCopy); // initializes dedupedElements and distinct
       delegate = Sets.newHashSetWithExpectedSize(distinct);
       for (int i = 0; i < distinct; i++) {
-        delegate.add(dedupedElements[i]);
+        /*
+         * requireNonNull is safe because we ensure that the first `distinct` elements have been
+         * populated.
+         */
+        delegate.add(requireNonNull(dedupedElements[i]));
       }
     }
 
@@ -870,7 +969,11 @@
         case 0:
           return of();
         case 1:
-          return of(dedupedElements[0]);
+          /*
+           * requireNonNull is safe because we ensure that the first `distinct` elements have been
+           * populated.
+           */
+          return of(requireNonNull(dedupedElements[0]));
         default:
           return new JdkBackedImmutableSet<E>(
               delegate, ImmutableList.asImmutableList(dedupedElements, distinct));
diff --git a/guava/src/com/google/common/collect/ImmutableSetMultimap.java b/guava/src/com/google/common/collect/ImmutableSetMultimap.java
index 9691ef5..007c16b 100644
--- a/guava/src/com/google/common/collect/ImmutableSetMultimap.java
+++ b/guava/src/com/google/common/collect/ImmutableSetMultimap.java
@@ -22,8 +22,8 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import com.google.j2objc.annotations.Weak;
@@ -38,14 +38,18 @@
 import java.util.Map.Entry;
 import java.util.function.Function;
 import java.util.stream.Collector;
-import java.util.stream.Collectors;
 import java.util.stream.Stream;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link SetMultimap} whose contents will never change, with many other important properties
  * detailed at {@link ImmutableCollection}.
  *
+ * <p><b>Warning:</b> As in all {@link SetMultimap}s, do not modify either a key <i>or a value</i>
+ * of a {@code ImmutableSetMultimap} in a way that affects its {@link Object#equals} behavior.
+ * Undefined behavior and bugs will result.
+ *
  * <p>See the Guava User Guide article on <a href=
  * "https://github.com/google/guava/wiki/ImmutableCollectionsExplained"> immutable collections</a>.
  *
@@ -53,6 +57,7 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
+@ElementTypesAreNonnullByDefault
 public class ImmutableSetMultimap<K, V> extends ImmutableMultimap<K, V>
     implements SetMultimap<K, V> {
   /**
@@ -83,16 +88,11 @@
    *
    * @since 21.0
    */
-  public static <T, K, V> Collector<T, ?, ImmutableSetMultimap<K, V>> toImmutableSetMultimap(
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction) {
-    checkNotNull(keyFunction, "keyFunction");
-    checkNotNull(valueFunction, "valueFunction");
-    return Collector.of(
-        ImmutableSetMultimap::<K, V>builder,
-        (builder, t) -> builder.put(keyFunction.apply(t), valueFunction.apply(t)),
-        ImmutableSetMultimap.Builder::combine,
-        ImmutableSetMultimap.Builder::build);
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableSetMultimap<K, V>> toImmutableSetMultimap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction) {
+    return CollectCollectors.toImmutableSetMultimap(keyFunction, valueFunction);
   }
 
   /**
@@ -135,21 +135,18 @@
    *
    * @since 21.0
    */
-  public static <T, K, V>
+  public static <T extends @Nullable Object, K, V>
       Collector<T, ?, ImmutableSetMultimap<K, V>> flatteningToImmutableSetMultimap(
           Function<? super T, ? extends K> keyFunction,
           Function<? super T, ? extends Stream<? extends V>> valuesFunction) {
-    checkNotNull(keyFunction);
-    checkNotNull(valuesFunction);
-    return Collectors.collectingAndThen(
-        Multimaps.flatteningToMultimap(
-            input -> checkNotNull(keyFunction.apply(input)),
-            input -> valuesFunction.apply(input).peek(Preconditions::checkNotNull),
-            MultimapBuilder.linkedHashKeys().linkedHashSetValues()::<K, V>build),
-        ImmutableSetMultimap::copyOf);
+    return CollectCollectors.flatteningToImmutableSetMultimap(keyFunction, valuesFunction);
   }
 
-  /** Returns the empty multimap. */
+  /**
+   * Returns the empty multimap.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   // Casting is safe because the multimap will never hold any elements.
   @SuppressWarnings("unchecked")
   public static <K, V> ImmutableSetMultimap<K, V> of() {
@@ -377,7 +374,8 @@
   }
 
   private static <K, V> ImmutableSetMultimap<K, V> copyOf(
-      Multimap<? extends K, ? extends V> multimap, Comparator<? super V> valueComparator) {
+      Multimap<? extends K, ? extends V> multimap,
+      @CheckForNull Comparator<? super V> valueComparator) {
     checkNotNull(multimap); // eager for GWT
     if (multimap.isEmpty() && valueComparator == null) {
       return of();
@@ -412,7 +410,7 @@
   /** Creates an ImmutableSetMultimap from an asMap.entrySet. */
   static <K, V> ImmutableSetMultimap<K, V> fromMapEntries(
       Collection<? extends Map.Entry<? extends K, ? extends Collection<? extends V>>> mapEntries,
-      @Nullable Comparator<? super V> valueComparator) {
+      @CheckForNull Comparator<? super V> valueComparator) {
     if (mapEntries.isEmpty()) {
       return of();
     }
@@ -442,7 +440,7 @@
   ImmutableSetMultimap(
       ImmutableMap<K, ImmutableSet<V>> map,
       int size,
-      @Nullable Comparator<? super V> valueComparator) {
+      @CheckForNull Comparator<? super V> valueComparator) {
     super(map, size);
     this.emptySet = emptySet(valueComparator);
   }
@@ -455,13 +453,13 @@
    * parameters used to build this multimap.
    */
   @Override
-  public ImmutableSet<V> get(@Nullable K key) {
+  public ImmutableSet<V> get(K key) {
     // This cast is safe as its type is known in constructor.
     ImmutableSet<V> set = (ImmutableSet<V>) map.get(key);
     return MoreObjects.firstNonNull(set, emptySet);
   }
 
-  @LazyInit @RetainedWith private transient @Nullable ImmutableSetMultimap<V, K> inverse;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableSetMultimap<V, K> inverse;
 
   /**
    * {@inheritDoc}
@@ -495,7 +493,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public ImmutableSet<V> removeAll(Object key) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final ImmutableSet<V> removeAll(@CheckForNull Object key) {
     throw new UnsupportedOperationException();
   }
 
@@ -508,11 +507,12 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public ImmutableSet<V> replaceValues(K key, Iterable<? extends V> values) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final ImmutableSet<V> replaceValues(K key, Iterable<? extends V> values) {
     throw new UnsupportedOperationException();
   }
 
-  @LazyInit @RetainedWith private transient @Nullable ImmutableSet<Entry<K, V>> entries;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableSet<Entry<K, V>> entries;
 
   /**
    * Returns an immutable collection of all key-value pairs in the multimap. Its iterator traverses
@@ -532,7 +532,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object object) {
+    public boolean contains(@CheckForNull Object object) {
       if (object instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) object;
         return multimap.containsEntry(entry.getKey(), entry.getValue());
@@ -557,20 +557,20 @@
   }
 
   private static <V> ImmutableSet<V> valueSet(
-      @Nullable Comparator<? super V> valueComparator, Collection<? extends V> values) {
+      @CheckForNull Comparator<? super V> valueComparator, Collection<? extends V> values) {
     return (valueComparator == null)
         ? ImmutableSet.copyOf(values)
         : ImmutableSortedSet.copyOf(valueComparator, values);
   }
 
-  private static <V> ImmutableSet<V> emptySet(@Nullable Comparator<? super V> valueComparator) {
+  private static <V> ImmutableSet<V> emptySet(@CheckForNull Comparator<? super V> valueComparator) {
     return (valueComparator == null)
         ? ImmutableSet.<V>of()
         : ImmutableSortedSet.<V>emptySet(valueComparator);
   }
 
   private static <V> ImmutableSet.Builder<V> valuesBuilder(
-      @Nullable Comparator<? super V> valueComparator) {
+      @CheckForNull Comparator<? super V> valueComparator) {
     return (valueComparator == null)
         ? new ImmutableSet.Builder<V>()
         : new ImmutableSortedSet.Builder<V>(valueComparator);
@@ -587,7 +587,7 @@
     Serialization.writeMultimap(this, stream);
   }
 
-  @Nullable
+  @CheckForNull
   Comparator<? super V> valueComparator() {
     return emptySet instanceof ImmutableSortedSet
         ? ((ImmutableSortedSet<V>) emptySet).comparator()
diff --git a/guava/src/com/google/common/collect/ImmutableSortedAsList.java b/guava/src/com/google/common/collect/ImmutableSortedAsList.java
index 91f700e..30f19a0 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedAsList.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedAsList.java
@@ -18,7 +18,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.util.Comparator;
 import java.util.Spliterator;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * List returned by {@code ImmutableSortedSet.asList()} when the set isn't empty.
@@ -28,6 +28,7 @@
  */
 @GwtCompatible(emulated = true)
 @SuppressWarnings("serial")
+@ElementTypesAreNonnullByDefault
 final class ImmutableSortedAsList<E> extends RegularImmutableAsList<E>
     implements SortedIterable<E> {
   ImmutableSortedAsList(ImmutableSortedSet<E> backingSet, ImmutableList<E> backingList) {
@@ -49,7 +50,7 @@
   @GwtIncompatible // ImmutableSortedSet.indexOf
   // TODO(cpovirk): consider manual binary search under GWT to preserve O(log N) lookup
   @Override
-  public int indexOf(@Nullable Object target) {
+  public int indexOf(@CheckForNull Object target) {
     int index = delegateCollection().indexOf(target);
 
     // TODO(kevinb): reconsider if it's really worth making feeble attempts at
@@ -62,12 +63,12 @@
 
   @GwtIncompatible // ImmutableSortedSet.indexOf
   @Override
-  public int lastIndexOf(@Nullable Object target) {
+  public int lastIndexOf(@CheckForNull Object target) {
     return indexOf(target);
   }
 
   @Override
-  public boolean contains(Object target) {
+  public boolean contains(@CheckForNull Object target) {
     // Necessary for ISS's with comparators inconsistent with equals.
     return indexOf(target) >= 0;
   }
diff --git a/guava/src/com/google/common/collect/ImmutableSortedMap.java b/guava/src/com/google/common/collect/ImmutableSortedMap.java
index dcda1f4..c4b59c8 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedMap.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedMap.java
@@ -20,10 +20,12 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 import static com.google.common.collect.Maps.keyOrNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.AbstractMap;
 import java.util.Arrays;
 import java.util.Comparator;
@@ -38,6 +40,7 @@
 import java.util.function.Function;
 import java.util.stream.Collector;
 import java.util.stream.Collectors;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -58,6 +61,7 @@
  * @since 2.0 (implements {@code NavigableMap} since 12.0)
  */
 @GwtCompatible(serializable = true, emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class ImmutableSortedMap<K, V> extends ImmutableSortedMapFauxverideShim<K, V>
     implements NavigableMap<K, V> {
   /**
@@ -72,10 +76,11 @@
    *
    * @since 21.0
    */
-  public static <T, K, V> Collector<T, ?, ImmutableSortedMap<K, V>> toImmutableSortedMap(
-      Comparator<? super K> comparator,
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction) {
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableSortedMap<K, V>> toImmutableSortedMap(
+          Comparator<? super K> comparator,
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction) {
     return CollectCollectors.toImmutableSortedMap(comparator, keyFunction, valueFunction);
   }
 
@@ -90,19 +95,14 @@
    *
    * @since 21.0
    */
-  public static <T, K, V> Collector<T, ?, ImmutableSortedMap<K, V>> toImmutableSortedMap(
-      Comparator<? super K> comparator,
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction,
-      BinaryOperator<V> mergeFunction) {
-    checkNotNull(comparator);
-    checkNotNull(keyFunction);
-    checkNotNull(valueFunction);
-    checkNotNull(mergeFunction);
-    return Collectors.collectingAndThen(
-        Collectors.toMap(
-            keyFunction, valueFunction, mergeFunction, () -> new TreeMap<K, V>(comparator)),
-        ImmutableSortedMap::copyOfSorted);
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableSortedMap<K, V>> toImmutableSortedMap(
+          Comparator<? super K> comparator,
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction) {
+    return CollectCollectors.toImmutableSortedMap(
+        comparator, keyFunction, valueFunction, mergeFunction);
   }
 
   /*
@@ -124,7 +124,11 @@
     }
   }
 
-  /** Returns the empty sorted map. */
+  /**
+   * Returns the empty sorted map.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked")
   // unsafe, comparator() returns a comparator on the specified type
   // TODO(kevinb): evaluate whether or not of().comparator() should return null
@@ -153,7 +157,7 @@
   @SuppressWarnings("unchecked")
   public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
       K k1, V v1, K k2, V v2) {
-    return ofEntries(entryOf(k1, v1), entryOf(k2, v2));
+    return fromEntries(entryOf(k1, v1), entryOf(k2, v2));
   }
 
   /**
@@ -165,7 +169,7 @@
   @SuppressWarnings("unchecked")
   public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
       K k1, V v1, K k2, V v2, K k3, V v3) {
-    return ofEntries(entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3));
+    return fromEntries(entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3));
   }
 
   /**
@@ -177,7 +181,7 @@
   @SuppressWarnings("unchecked")
   public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
       K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
-    return ofEntries(entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3), entryOf(k4, v4));
+    return fromEntries(entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3), entryOf(k4, v4));
   }
 
   /**
@@ -189,13 +193,164 @@
   @SuppressWarnings("unchecked")
   public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
       K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {
-    return ofEntries(
+    return fromEntries(
         entryOf(k1, v1), entryOf(k2, v2), entryOf(k3, v3), entryOf(k4, v4), entryOf(k5, v5));
   }
 
-  private static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> ofEntries(
-      Entry<K, V>... entries) {
-    return fromEntries(Ordering.natural(), false, entries, entries.length);
+  /**
+   * Returns an immutable sorted map containing the given entries, sorted by the natural ordering of
+   * their keys.
+   *
+   * @throws IllegalArgumentException if any two keys are equal according to their natural ordering
+   * @since 31.0
+   */
+  @SuppressWarnings("unchecked")
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+    return fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6));
+  }
+
+  /**
+   * Returns an immutable sorted map containing the given entries, sorted by the natural ordering of
+   * their keys.
+   *
+   * @throws IllegalArgumentException if any two keys are equal according to their natural ordering
+   * @since 31.0
+   */
+  @SuppressWarnings("unchecked")
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+    return fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7));
+  }
+
+  /**
+   * Returns an immutable sorted map containing the given entries, sorted by the natural ordering of
+   * their keys.
+   *
+   * @throws IllegalArgumentException if any two keys are equal according to their natural ordering
+   * @since 31.0
+   */
+  @SuppressWarnings("unchecked")
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8) {
+    return fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8));
+  }
+
+  /**
+   * Returns an immutable sorted map containing the given entries, sorted by the natural ordering of
+   * their keys.
+   *
+   * @throws IllegalArgumentException if any two keys are equal according to their natural ordering
+   * @since 31.0
+   */
+  @SuppressWarnings("unchecked")
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9) {
+    return fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8),
+        entryOf(k9, v9));
+  }
+
+  /**
+   * Returns an immutable sorted map containing the given entries, sorted by the natural ordering of
+   * their keys.
+   *
+   * @throws IllegalArgumentException if any two keys are equal according to their natural ordering
+   * @since 31.0
+   */
+  @SuppressWarnings("unchecked")
+  public static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9,
+      K k10,
+      V v10) {
+    return fromEntries(
+        entryOf(k1, v1),
+        entryOf(k2, v2),
+        entryOf(k3, v3),
+        entryOf(k4, v4),
+        entryOf(k5, v5),
+        entryOf(k6, v6),
+        entryOf(k7, v7),
+        entryOf(k8, v8),
+        entryOf(k9, v9),
+        entryOf(k10, v10));
   }
 
   /**
@@ -238,8 +393,8 @@
   }
 
   /**
-   * Returns an immutable map containing the given entries, with keys sorted by the provided
-   * comparator.
+   * Returns an immutable map containing the given entries, with keys sorted by their natural
+   * ordering.
    *
    * <p>This method is not type-safe, as it may be called on a map with keys that are not mutually
    * comparable.
@@ -325,6 +480,11 @@
     return fromEntries(comparator, sameComparator, map.entrySet());
   }
 
+  private static <K extends Comparable<? super K>, V> ImmutableSortedMap<K, V> fromEntries(
+      Entry<K, V>... entries) {
+    return fromEntries(Ordering.natural(), false, entries, entries.length);
+  }
+
   /**
    * Accepts a collection of possibly-null entries. If {@code sameComparator}, then it is assumed
    * that they do not need to be sorted or checked for dupes.
@@ -344,22 +504,25 @@
   private static <K, V> ImmutableSortedMap<K, V> fromEntries(
       final Comparator<? super K> comparator,
       boolean sameComparator,
-      Entry<K, V>[] entryArray,
+      @Nullable Entry<K, V>[] entryArray,
       int size) {
     switch (size) {
       case 0:
         return emptyMap(comparator);
       case 1:
-        return ImmutableSortedMap.<K, V>of(
-            comparator, entryArray[0].getKey(), entryArray[0].getValue());
+        // requireNonNull is safe because the first `size` elements have been filled in.
+        Entry<K, V> onlyEntry = requireNonNull(entryArray[0]);
+        return of(comparator, onlyEntry.getKey(), onlyEntry.getValue());
       default:
         Object[] keys = new Object[size];
         Object[] values = new Object[size];
         if (sameComparator) {
           // Need to check for nulls, but don't need to sort or validate.
           for (int i = 0; i < size; i++) {
-            Object key = entryArray[i].getKey();
-            Object value = entryArray[i].getValue();
+            // requireNonNull is safe because the first `size` elements have been filled in.
+            Entry<K, V> entry = requireNonNull(entryArray[i]);
+            Object key = entry.getKey();
+            Object value = entry.getValue();
             checkEntryNotNull(key, value);
             keys[i] = key;
             values[i] = value;
@@ -372,24 +535,31 @@
               entryArray,
               0,
               size,
-              new Comparator<Entry<K, V>>() {
+              new Comparator<@Nullable Entry<K, V>>() {
                 @Override
-                public int compare(Entry<K, V> e1, Entry<K, V> e2) {
+                public int compare(@CheckForNull Entry<K, V> e1, @CheckForNull Entry<K, V> e2) {
+                  // requireNonNull is safe because the first `size` elements have been filled in.
+                  requireNonNull(e1);
+                  requireNonNull(e2);
                   return comparator.compare(e1.getKey(), e2.getKey());
                 }
               });
-          K prevKey = entryArray[0].getKey();
+          // requireNonNull is safe because the first `size` elements have been filled in.
+          Entry<K, V> firstEntry = requireNonNull(entryArray[0]);
+          K prevKey = firstEntry.getKey();
           keys[0] = prevKey;
-          values[0] = entryArray[0].getValue();
+          values[0] = firstEntry.getValue();
           checkEntryNotNull(keys[0], values[0]);
           for (int i = 1; i < size; i++) {
-            K key = entryArray[i].getKey();
-            V value = entryArray[i].getValue();
+            // requireNonNull is safe because the first `size` elements have been filled in.
+            Entry<K, V> prevEntry = requireNonNull(entryArray[i - 1]);
+            Entry<K, V> entry = requireNonNull(entryArray[i]);
+            K key = entry.getKey();
+            V value = entry.getValue();
             checkEntryNotNull(key, value);
             keys[i] = key;
             values[i] = value;
-            checkNoConflict(
-                comparator.compare(prevKey, key) != 0, "key", entryArray[i - 1], entryArray[i]);
+            checkNoConflict(comparator.compare(prevKey, key) != 0, "key", prevEntry, entry);
             prevKey = key;
           }
         }
@@ -437,14 +607,14 @@
    *         .put(1, "one")
    *         .put(2, "two")
    *         .put(3, "three")
-   *         .build();
+   *         .buildOrThrow();
    * }</pre>
    *
    * <p>For <i>small</i> immutable sorted maps, the {@code ImmutableSortedMap.of()} methods are even
    * more convenient.
    *
-   * <p>Builder instances can be reused - it is safe to call {@link #build} multiple times to build
-   * multiple maps in series. Each map is a superset of the maps created before it.
+   * <p>Builder instances can be reused - it is safe to call {@link #buildOrThrow} multiple times to
+   * build multiple maps in series. Each map is a superset of the maps created before it.
    *
    * @since 2.0
    */
@@ -526,7 +696,8 @@
     @Beta
     @Override
     @Deprecated
-    public Builder<K, V> orderEntriesByValue(Comparator<? super V> valueComparator) {
+    @DoNotCall("Always throws UnsupportedOperationException")
+    public final Builder<K, V> orderEntriesByValue(Comparator<? super V> valueComparator) {
       throw new UnsupportedOperationException("Not available on ImmutableSortedMap.Builder");
     }
 
@@ -539,16 +710,35 @@
     /**
      * Returns a newly-created immutable sorted map.
      *
+     * <p>Prefer the equivalent method {@link #buildOrThrow()} to make it explicit that the method
+     * will throw an exception if there are duplicate keys. The {@code build()} method will soon be
+     * deprecated.
+     *
      * @throws IllegalArgumentException if any two keys are equal according to the comparator (which
      *     might be the keys' natural order)
      */
     @Override
     public ImmutableSortedMap<K, V> build() {
+      return buildOrThrow();
+    }
+
+    /**
+     * Returns a newly-created immutable sorted map, or throws an exception if any two keys are
+     * equal.
+     *
+     * @throws IllegalArgumentException if any two keys are equal according to the comparator (which
+     *     might be the keys' natural order)
+     * @since 31.0
+     */
+    @Override
+    public ImmutableSortedMap<K, V> buildOrThrow() {
       switch (size) {
         case 0:
           return emptyMap(comparator);
         case 1:
-          return of(comparator, entries[0].getKey(), entries[0].getValue());
+          // requireNonNull is safe because the first `size` elements have been filled in.
+          Entry<K, V> onlyEntry = requireNonNull(entries[0]);
+          return of(comparator, onlyEntry.getKey(), onlyEntry.getValue());
         default:
           return fromEntries(comparator, false, entries, size);
       }
@@ -557,7 +747,7 @@
 
   private final transient RegularImmutableSortedSet<K> keySet;
   private final transient ImmutableList<V> valueList;
-  private transient ImmutableSortedMap<K, V> descendingMap;
+  @CheckForNull private transient ImmutableSortedMap<K, V> descendingMap;
 
   ImmutableSortedMap(RegularImmutableSortedSet<K> keySet, ImmutableList<V> valueList) {
     this(keySet, valueList, null);
@@ -566,7 +756,7 @@
   ImmutableSortedMap(
       RegularImmutableSortedSet<K> keySet,
       ImmutableList<V> valueList,
-      ImmutableSortedMap<K, V> descendingMap) {
+      @CheckForNull ImmutableSortedMap<K, V> descendingMap) {
     this.keySet = keySet;
     this.valueList = valueList;
     this.descendingMap = descendingMap;
@@ -587,7 +777,8 @@
   }
 
   @Override
-  public V get(@Nullable Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     int index = keySet.indexOf(key);
     return (index == -1) ? null : valueList.get(index);
   }
@@ -809,51 +1000,61 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> lowerEntry(K key) {
     return headMap(key, false).lastEntry();
   }
 
   @Override
+  @CheckForNull
   public K lowerKey(K key) {
     return keyOrNull(lowerEntry(key));
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> floorEntry(K key) {
     return headMap(key, true).lastEntry();
   }
 
   @Override
+  @CheckForNull
   public K floorKey(K key) {
     return keyOrNull(floorEntry(key));
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> ceilingEntry(K key) {
     return tailMap(key, true).firstEntry();
   }
 
   @Override
+  @CheckForNull
   public K ceilingKey(K key) {
     return keyOrNull(ceilingEntry(key));
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> higherEntry(K key) {
     return tailMap(key, false).firstEntry();
   }
 
   @Override
+  @CheckForNull
   public K higherKey(K key) {
     return keyOrNull(higherEntry(key));
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> firstEntry() {
     return isEmpty() ? null : entrySet().asList().get(0);
   }
 
   @Override
+  @CheckForNull
   public Entry<K, V> lastEntry() {
     return isEmpty() ? null : entrySet().asList().get(size() - 1);
   }
@@ -867,6 +1068,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final Entry<K, V> pollFirstEntry() {
     throw new UnsupportedOperationException();
   }
@@ -880,6 +1083,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final Entry<K, V> pollLastEntry() {
     throw new UnsupportedOperationException();
   }
diff --git a/guava/src/com/google/common/collect/ImmutableSortedMapFauxverideShim.java b/guava/src/com/google/common/collect/ImmutableSortedMapFauxverideShim.java
index 87b8351..7b2e4d7 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedMapFauxverideShim.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedMapFauxverideShim.java
@@ -17,9 +17,11 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.function.BinaryOperator;
 import java.util.function.Function;
 import java.util.stream.Collector;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * "Overrides" the {@link ImmutableMap} static methods that lack {@link ImmutableSortedMap}
@@ -29,6 +31,7 @@
  * @author Chris Povirk
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class ImmutableSortedMapFauxverideShim<K, V> extends ImmutableMap<K, V> {
   /**
    * Not supported. Use {@link ImmutableSortedMap#toImmutableSortedMap}, which offers better
@@ -38,10 +41,12 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link ImmutableSortedMap#toImmutableSortedMap}.
    */
+  @DoNotCall("Use toImmutableSortedMap")
   @Deprecated
-  public static <T, K, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction) {
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction) {
     throw new UnsupportedOperationException();
   }
 
@@ -53,11 +58,13 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link ImmutableSortedMap#toImmutableSortedMap}.
    */
+  @DoNotCall("Use toImmutableSortedMap")
   @Deprecated
-  public static <T, K, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
-      Function<? super T, ? extends K> keyFunction,
-      Function<? super T, ? extends V> valueFunction,
-      BinaryOperator<V> mergeFunction) {
+  public static <T extends @Nullable Object, K, V>
+      Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(
+          Function<? super T, ? extends K> keyFunction,
+          Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction) {
     throw new UnsupportedOperationException();
   }
 
@@ -69,6 +76,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link ImmutableSortedMap#naturalOrder}, which offers better type-safety.
    */
+  @DoNotCall("Use naturalOrder")
   @Deprecated
   public static <K, V> ImmutableSortedMap.Builder<K, V> builder() {
     throw new UnsupportedOperationException();
@@ -80,6 +88,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Not supported for ImmutableSortedMap.
    */
+  @DoNotCall("Use naturalOrder (which does not accept an expected size)")
   @Deprecated
   public static <K, V> ImmutableSortedMap.Builder<K, V> builderWithExpectedSize(int expectedSize) {
     throw new UnsupportedOperationException();
@@ -94,6 +103,7 @@
    * @deprecated <b>Pass a key of type {@code Comparable} to use {@link
    *     ImmutableSortedMap#of(Comparable, Object)}.</b>
    */
+  @DoNotCall("Pass a key of type Comparable")
   @Deprecated
   public static <K, V> ImmutableSortedMap<K, V> of(K k1, V v1) {
     throw new UnsupportedOperationException();
@@ -108,6 +118,7 @@
    * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
    *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object)}.</b>
    */
+  @DoNotCall("Pass keys of type Comparable")
   @Deprecated
   public static <K, V> ImmutableSortedMap<K, V> of(K k1, V v1, K k2, V v2) {
     throw new UnsupportedOperationException();
@@ -122,6 +133,7 @@
    * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
    *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object)}.</b>
    */
+  @DoNotCall("Pass keys of type Comparable")
   @Deprecated
   public static <K, V> ImmutableSortedMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3) {
     throw new UnsupportedOperationException();
@@ -137,6 +149,7 @@
    *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
    *     Comparable, Object)}.</b>
    */
+  @DoNotCall("Pass keys of type Comparable")
   @Deprecated
   public static <K, V> ImmutableSortedMap<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
     throw new UnsupportedOperationException();
@@ -152,11 +165,160 @@
    *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
    *     Comparable, Object, Comparable, Object)}.</b>
    */
+  @DoNotCall("Pass keys of type Comparable")
   @Deprecated
   public static <K, V> ImmutableSortedMap<K, V> of(
       K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {
     throw new UnsupportedOperationException();
   }
 
+  /**
+   * Not supported. <b>You are attempting to create a map that may contain non-{@code Comparable}
+   * keys.</b> Proper calls will resolve to the version in {@code ImmutableSortedMap}, not this
+   * dummy version.
+   *
+   * @throws UnsupportedOperationException always
+   * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
+   *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
+   *     Comparable, Object, Comparable, Object)}.</b>
+   */
+  @DoNotCall("Pass keys of type Comparable")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Not supported. <b>You are attempting to create a map that may contain non-{@code Comparable}
+   * keys.</b> Proper calls will resolve to the version in {@code ImmutableSortedMap}, not this
+   * dummy version.
+   *
+   * @throws UnsupportedOperationException always
+   * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
+   *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
+   *     Comparable, Object, Comparable, Object)}.</b>
+   */
+  @DoNotCall("Pass keys of type Comparable")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> of(
+      K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Not supported. <b>You are attempting to create a map that may contain non-{@code Comparable}
+   * keys.</b> Proper calls will resolve to the version in {@code ImmutableSortedMap}, not this
+   * dummy version.
+   *
+   * @throws UnsupportedOperationException always
+   * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
+   *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
+   *     Comparable, Object, Comparable, Object)}.</b>
+   */
+  @DoNotCall("Pass keys of type Comparable")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Not supported. <b>You are attempting to create a map that may contain non-{@code Comparable}
+   * keys.</b> Proper calls will resolve to the version in {@code ImmutableSortedMap}, not this
+   * dummy version.
+   *
+   * @throws UnsupportedOperationException always
+   * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
+   *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
+   *     Comparable, Object, Comparable, Object)}.</b>
+   */
+  @DoNotCall("Pass keys of type Comparable")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Not supported. <b>You are attempting to create a map that may contain non-{@code Comparable}
+   * keys.</b> Proper calls will resolve to the version in {@code ImmutableSortedMap}, not this
+   * dummy version.
+   *
+   * @throws UnsupportedOperationException always
+   * @deprecated <b>Pass keys of type {@code Comparable} to use {@link
+   *     ImmutableSortedMap#of(Comparable, Object, Comparable, Object, Comparable, Object,
+   *     Comparable, Object, Comparable, Object)}.</b>
+   */
+  @DoNotCall("Pass keys of type Comparable")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> of(
+      K k1,
+      V v1,
+      K k2,
+      V v2,
+      K k3,
+      V v3,
+      K k4,
+      V v4,
+      K k5,
+      V v5,
+      K k6,
+      V v6,
+      K k7,
+      V v7,
+      K k8,
+      V v8,
+      K k9,
+      V v9,
+      K k10,
+      V v10) {
+    throw new UnsupportedOperationException();
+  }
+
+  /**
+   * Not supported. Use {@code ImmutableSortedMap.copyOf(ImmutableMap.ofEntries(...))}.
+   *
+   * @deprecated Use {@code ImmutableSortedMap.copyOf(ImmutableMap.ofEntries(...))}.
+   */
+  @DoNotCall("ImmutableSortedMap.ofEntries not currently available; use ImmutableSortedMap.copyOf")
+  @Deprecated
+  public static <K, V> ImmutableSortedMap<K, V> ofEntries(
+      Entry<? extends K, ? extends V>... entries) {
+    throw new UnsupportedOperationException();
+  }
+
   // No copyOf() fauxveride; see ImmutableSortedSetFauxverideShim.
 }
diff --git a/guava/src/com/google/common/collect/ImmutableSortedMultiset.java b/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
index ec02063..bf5a2f4 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedMultiset.java
@@ -19,6 +19,7 @@
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.io.Serializable;
 import java.util.Arrays;
@@ -30,6 +31,8 @@
 import java.util.function.Function;
 import java.util.function.ToIntFunction;
 import java.util.stream.Collector;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link SortedMultiset} whose contents will never change, with many other important properties
@@ -48,6 +51,7 @@
  * @since 12.0
  */
 @GwtIncompatible // hasn't been tested yet
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableSortedMultiset<E> extends ImmutableSortedMultisetFauxverideShim<E>
     implements SortedMultiset<E> {
   // TODO(lowasser): GWT compatibility
@@ -77,10 +81,11 @@
    *
    * @since 22.0
    */
-  public static <T, E> Collector<T, ?, ImmutableSortedMultiset<E>> toImmutableSortedMultiset(
-      Comparator<? super E> comparator,
-      Function<? super T, ? extends E> elementFunction,
-      ToIntFunction<? super T> countFunction) {
+  public static <T extends @Nullable Object, E>
+      Collector<T, ?, ImmutableSortedMultiset<E>> toImmutableSortedMultiset(
+          Comparator<? super E> comparator,
+          Function<? super T, ? extends E> elementFunction,
+          ToIntFunction<? super T> countFunction) {
     checkNotNull(comparator);
     checkNotNull(elementFunction);
     checkNotNull(countFunction);
@@ -95,7 +100,11 @@
         (Multiset<E> multiset) -> copyOfSortedEntries(comparator, multiset.entrySet()));
   }
 
-  /** Returns the empty immutable sorted multiset. */
+  /**
+   * Returns the empty immutable sorted multiset.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked")
   public static <E> ImmutableSortedMultiset<E> of() {
     return (ImmutableSortedMultiset) RegularImmutableSortedMultiset.NATURAL_EMPTY_MULTISET;
@@ -115,7 +124,6 @@
    *
    * @throws NullPointerException if any element is null
    */
-  @SuppressWarnings("unchecked")
   public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(E e1, E e2) {
     return copyOf(Ordering.natural(), Arrays.asList(e1, e2));
   }
@@ -126,7 +134,6 @@
    *
    * @throws NullPointerException if any element is null
    */
-  @SuppressWarnings("unchecked")
   public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(E e1, E e2, E e3) {
     return copyOf(Ordering.natural(), Arrays.asList(e1, e2, e3));
   }
@@ -137,7 +144,6 @@
    *
    * @throws NullPointerException if any element is null
    */
-  @SuppressWarnings("unchecked")
   public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(
       E e1, E e2, E e3, E e4) {
     return copyOf(Ordering.natural(), Arrays.asList(e1, e2, e3, e4));
@@ -149,7 +155,6 @@
    *
    * @throws NullPointerException if any element is null
    */
-  @SuppressWarnings("unchecked")
   public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(
       E e1, E e2, E e3, E e4, E e5) {
     return copyOf(Ordering.natural(), Arrays.asList(e1, e2, e3, e4, e5));
@@ -161,7 +166,6 @@
    *
    * @throws NullPointerException if any element is null
    */
-  @SuppressWarnings("unchecked")
   public static <E extends Comparable<? super E>> ImmutableSortedMultiset<E> of(
       E e1, E e2, E e3, E e4, E e5, E e6, E... remaining) {
     int size = remaining.length + 6;
@@ -327,7 +331,7 @@
   @Override
   public abstract ImmutableSortedSet<E> elementSet();
 
-  @LazyInit transient ImmutableSortedMultiset<E> descendingMultiset;
+  @LazyInit @CheckForNull transient ImmutableSortedMultiset<E> descendingMultiset;
 
   @Override
   public ImmutableSortedMultiset<E> descendingMultiset() {
@@ -352,6 +356,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final Entry<E> pollFirstEntry() {
     throw new UnsupportedOperationException();
   }
@@ -367,6 +373,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final Entry<E> pollLastEntry() {
     throw new UnsupportedOperationException();
   }
diff --git a/guava/src/com/google/common/collect/ImmutableSortedMultisetFauxverideShim.java b/guava/src/com/google/common/collect/ImmutableSortedMultisetFauxverideShim.java
index e3f45f7..94a2f56 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedMultisetFauxverideShim.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedMultisetFauxverideShim.java
@@ -15,9 +15,11 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.function.Function;
 import java.util.function.ToIntFunction;
 import java.util.stream.Collector;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * "Overrides" the {@link ImmutableMultiset} static methods that lack {@link
@@ -37,6 +39,7 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class ImmutableSortedMultisetFauxverideShim<E> extends ImmutableMultiset<E> {
   /**
    * Not supported. Use {@link ImmutableSortedMultiset#toImmutableSortedMultiset} instead. This
@@ -47,6 +50,7 @@
    * @deprecated Use {@link ImmutableSortedMultiset#toImmutableSortedMultiset}.
    * @since 21.0
    */
+  @DoNotCall("Use toImmutableSortedMultiset.")
   @Deprecated
   public static <E> Collector<E, ?, ImmutableMultiset<E>> toImmutableMultiset() {
     throw new UnsupportedOperationException();
@@ -61,9 +65,12 @@
    * @deprecated Use {@link ImmutableSortedMultiset#toImmutableSortedMultiset}.
    * @since 22.0
    */
+  @DoNotCall("Use toImmutableSortedMultiset.")
   @Deprecated
-  public static <T, E> Collector<T, ?, ImmutableMultiset<E>> toImmutableMultiset(
-      Function<? super T, ? extends E> elementFunction, ToIntFunction<? super T> countFunction) {
+  public static <T extends @Nullable Object, E>
+      Collector<T, ?, ImmutableMultiset<E>> toImmutableMultiset(
+          Function<? super T, ? extends E> elementFunction,
+          ToIntFunction<? super T> countFunction) {
     throw new UnsupportedOperationException();
   }
 
@@ -75,6 +82,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link ImmutableSortedMultiset#naturalOrder}, which offers better type-safety.
    */
+  @DoNotCall("Use naturalOrder.")
   @Deprecated
   public static <E> ImmutableSortedMultiset.Builder<E> builder() {
     throw new UnsupportedOperationException();
@@ -89,6 +97,7 @@
    * @deprecated <b>Pass a parameter of type {@code Comparable} to use {@link
    *     ImmutableSortedMultiset#of(Comparable)}.</b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(E element) {
     throw new UnsupportedOperationException();
@@ -103,6 +112,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedMultiset#of(Comparable, Comparable)}.</b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(E e1, E e2) {
     throw new UnsupportedOperationException();
@@ -117,6 +127,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedMultiset#of(Comparable, Comparable, Comparable)}.</b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(E e1, E e2, E e3) {
     throw new UnsupportedOperationException();
@@ -131,6 +142,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedMultiset#of(Comparable, Comparable, Comparable, Comparable)}. </b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(E e1, E e2, E e3, E e4) {
     throw new UnsupportedOperationException();
@@ -146,6 +158,7 @@
    *     ImmutableSortedMultiset#of(Comparable, Comparable, Comparable, Comparable, Comparable)} .
    *     </b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(E e1, E e2, E e3, E e4, E e5) {
     throw new UnsupportedOperationException();
@@ -161,6 +174,7 @@
    *     ImmutableSortedMultiset#of(Comparable, Comparable, Comparable, Comparable, Comparable,
    *     Comparable, Comparable...)} . </b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> of(
       E e1, E e2, E e3, E e4, E e5, E e6, E... remaining) {
@@ -176,6 +190,7 @@
    * @deprecated <b>Pass parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedMultiset#copyOf(Comparable[])}.</b>
    */
+  @DoNotCall("Elements must be Comparable. (Or, pass a Comparator to orderedBy or copyOf.)")
   @Deprecated
   public static <E> ImmutableSortedMultiset<E> copyOf(E[] elements) {
     throw new UnsupportedOperationException();
diff --git a/guava/src/com/google/common/collect/ImmutableSortedSet.java b/guava/src/com/google/common/collect/ImmutableSortedSet.java
index 9a3409c..8a7aec1 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedSet.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedSet.java
@@ -23,6 +23,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
@@ -38,6 +39,7 @@
 import java.util.Spliterators;
 import java.util.function.Consumer;
 import java.util.stream.Collector;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -60,6 +62,7 @@
 // TODO(benyu): benchmark and optimize all creation paths, which are a mess now
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // we're overriding default serialization
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableSortedSet<E> extends ImmutableSortedSetFauxverideShim<E>
     implements NavigableSet<E>, SortedIterable<E> {
   static final int SPLITERATOR_CHARACTERISTICS =
@@ -87,7 +90,11 @@
     }
   }
 
-  /** Returns the empty immutable sorted set. */
+  /**
+   * Returns the empty immutable sorted set.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   public static <E> ImmutableSortedSet<E> of() {
     return (ImmutableSortedSet<E>) RegularImmutableSortedSet.NATURAL_EMPTY_SET;
   }
@@ -570,16 +577,16 @@
     }
   }
 
-  int unsafeCompare(Object a, Object b) {
+  int unsafeCompare(Object a, @CheckForNull Object b) {
     return unsafeCompare(comparator, a, b);
   }
 
-  static int unsafeCompare(Comparator<?> comparator, Object a, Object b) {
+  static int unsafeCompare(Comparator<?> comparator, Object a, @CheckForNull Object b) {
     // Pretend the comparator can compare anything. If it turns out it can't
-    // compare a and b, we should get a CCE on the subsequent line. Only methods
-    // that are spec'd to throw CCE should call this.
-    @SuppressWarnings("unchecked")
-    Comparator<Object> unsafeComparator = (Comparator<Object>) comparator;
+    // compare a and b, we should get a CCE or NPE on the subsequent line. Only methods
+    // that are spec'd to throw CCE and NPE should call this.
+    @SuppressWarnings({"unchecked", "nullness"})
+    Comparator<@Nullable Object> unsafeComparator = (Comparator<@Nullable Object>) comparator;
     return unsafeComparator.compare(a, b);
   }
 
@@ -686,18 +693,21 @@
   /** @since 12.0 */
   @GwtIncompatible // NavigableSet
   @Override
+  @CheckForNull
   public E lower(E e) {
     return Iterators.getNext(headSet(e, false).descendingIterator(), null);
   }
 
   /** @since 12.0 */
   @Override
+  @CheckForNull
   public E floor(E e) {
     return Iterators.getNext(headSet(e, true).descendingIterator(), null);
   }
 
   /** @since 12.0 */
   @Override
+  @CheckForNull
   public E ceiling(E e) {
     return Iterables.getFirst(tailSet(e, true), null);
   }
@@ -705,6 +715,7 @@
   /** @since 12.0 */
   @GwtIncompatible // NavigableSet
   @Override
+  @CheckForNull
   public E higher(E e) {
     return Iterables.getFirst(tailSet(e, false), null);
   }
@@ -730,6 +741,8 @@
   @Deprecated
   @GwtIncompatible // NavigableSet
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final E pollFirst() {
     throw new UnsupportedOperationException();
   }
@@ -745,12 +758,15 @@
   @Deprecated
   @GwtIncompatible // NavigableSet
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final E pollLast() {
     throw new UnsupportedOperationException();
   }
 
   @GwtIncompatible // NavigableSet
   @LazyInit
+  @CheckForNull
   transient ImmutableSortedSet<E> descendingSet;
 
   /** @since 12.0 */
@@ -801,7 +817,7 @@
   public abstract UnmodifiableIterator<E> descendingIterator();
 
   /** Returns the position of an element within the set, or -1 if not present. */
-  abstract int indexOf(@Nullable Object target);
+  abstract int indexOf(@CheckForNull Object target);
 
   /*
    * This class is used to serialize all ImmutableSortedSet instances,
diff --git a/guava/src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java b/guava/src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java
index 9a49fcb..ff3ac12 100644
--- a/guava/src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java
+++ b/guava/src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.stream.Collector;
 
 /**
@@ -37,7 +38,8 @@
  * @author Chris Povirk
  */
 @GwtIncompatible
-abstract class ImmutableSortedSetFauxverideShim<E> extends ImmutableSet<E> {
+@ElementTypesAreNonnullByDefault
+abstract class ImmutableSortedSetFauxverideShim<E> extends ImmutableSet.CachingAsList<E> {
   /**
    * Not supported. Use {@link ImmutableSortedSet#toImmutableSortedSet} instead. This method exists
    * only to hide {@link ImmutableSet#toImmutableSet} from consumers of {@code ImmutableSortedSet}.
@@ -46,6 +48,7 @@
    * @deprecated Use {@link ImmutableSortedSet#toImmutableSortedSet}.
    * @since 21.0
    */
+  @DoNotCall("Use toImmutableSortedSet")
   @Deprecated
   public static <E> Collector<E, ?, ImmutableSet<E>> toImmutableSet() {
     throw new UnsupportedOperationException();
@@ -59,6 +62,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Use {@link ImmutableSortedSet#naturalOrder}, which offers better type-safety.
    */
+  @DoNotCall("Use naturalOrder")
   @Deprecated
   public static <E> ImmutableSortedSet.Builder<E> builder() {
     throw new UnsupportedOperationException();
@@ -71,6 +75,7 @@
    * @throws UnsupportedOperationException always
    * @deprecated Not supported by ImmutableSortedSet.
    */
+  @DoNotCall("Use naturalOrder (which does not accept an expected size)")
   @Deprecated
   public static <E> ImmutableSortedSet.Builder<E> builderWithExpectedSize(int expectedSize) {
     throw new UnsupportedOperationException();
@@ -85,6 +90,7 @@
    * @deprecated <b>Pass a parameter of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#of(Comparable)}.</b>
    */
+  @DoNotCall("Pass a parameter of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E element) {
     throw new UnsupportedOperationException();
@@ -99,6 +105,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#of(Comparable, Comparable)}.</b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E e1, E e2) {
     throw new UnsupportedOperationException();
@@ -113,6 +120,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#of(Comparable, Comparable, Comparable)}.</b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E e1, E e2, E e3) {
     throw new UnsupportedOperationException();
@@ -127,6 +135,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#of(Comparable, Comparable, Comparable, Comparable)}. </b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E e1, E e2, E e3, E e4) {
     throw new UnsupportedOperationException();
@@ -141,6 +150,7 @@
    * @deprecated <b>Pass the parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#of( Comparable, Comparable, Comparable, Comparable, Comparable)}. </b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E e1, E e2, E e3, E e4, E e5) {
     throw new UnsupportedOperationException();
@@ -156,6 +166,7 @@
    *     ImmutableSortedSet#of(Comparable, Comparable, Comparable, Comparable, Comparable,
    *     Comparable, Comparable...)}. </b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E... remaining) {
     throw new UnsupportedOperationException();
@@ -170,6 +181,7 @@
    * @deprecated <b>Pass parameters of type {@code Comparable} to use {@link
    *     ImmutableSortedSet#copyOf(Comparable[])}.</b>
    */
+  @DoNotCall("Pass parameters of type Comparable")
   @Deprecated
   public static <E> ImmutableSortedSet<E> copyOf(E[] elements) {
     throw new UnsupportedOperationException();
diff --git a/guava/src/com/google/common/collect/ImmutableTable.java b/guava/src/com/google/common/collect/ImmutableTable.java
index bdaddc3..6d15938 100644
--- a/guava/src/com/google/common/collect/ImmutableTable.java
+++ b/guava/src/com/google/common/collect/ImmutableTable.java
@@ -20,11 +20,10 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.MoreObjects;
-import com.google.common.collect.Tables.AbstractCell;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
@@ -32,8 +31,8 @@
 import java.util.Spliterator;
 import java.util.function.BinaryOperator;
 import java.util.function.Function;
-import java.util.function.Supplier;
 import java.util.stream.Collector;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -47,6 +46,7 @@
  * @since 11.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ImmutableTable<R, C, V> extends AbstractTable<R, C, V>
     implements Serializable {
 
@@ -60,19 +60,12 @@
    *
    * @since 21.0
    */
-  public static <T, R, C, V> Collector<T, ?, ImmutableTable<R, C, V>> toImmutableTable(
-      Function<? super T, ? extends R> rowFunction,
-      Function<? super T, ? extends C> columnFunction,
-      Function<? super T, ? extends V> valueFunction) {
-    checkNotNull(rowFunction, "rowFunction");
-    checkNotNull(columnFunction, "columnFunction");
-    checkNotNull(valueFunction, "valueFunction");
-    return Collector.of(
-        (Supplier<Builder<R, C, V>>) Builder::new,
-        (builder, t) ->
-            builder.put(rowFunction.apply(t), columnFunction.apply(t), valueFunction.apply(t)),
-        Builder::combine,
-        Builder::build);
+  public static <T extends @Nullable Object, R, C, V>
+      Collector<T, ?, ImmutableTable<R, C, V>> toImmutableTable(
+          Function<? super T, ? extends R> rowFunction,
+          Function<? super T, ? extends C> columnFunction,
+          Function<? super T, ? extends V> valueFunction) {
+    return TableCollectors.toImmutableTable(rowFunction, columnFunction, valueFunction);
   }
 
   /**
@@ -86,96 +79,21 @@
    *
    * @since 21.0
    */
-  public static <T, R, C, V> Collector<T, ?, ImmutableTable<R, C, V>> toImmutableTable(
-      Function<? super T, ? extends R> rowFunction,
-      Function<? super T, ? extends C> columnFunction,
-      Function<? super T, ? extends V> valueFunction,
-      BinaryOperator<V> mergeFunction) {
-
-    checkNotNull(rowFunction, "rowFunction");
-    checkNotNull(columnFunction, "columnFunction");
-    checkNotNull(valueFunction, "valueFunction");
-    checkNotNull(mergeFunction, "mergeFunction");
-
-    /*
-     * No mutable Table exactly matches the insertion order behavior of ImmutableTable.Builder, but
-     * the Builder can't efficiently support merging of duplicate values.  Getting around this
-     * requires some work.
-     */
-
-    return Collector.of(
-        () -> new CollectorState<R, C, V>()
-        /* GWT isn't currently playing nicely with constructor references? */ ,
-        (state, input) ->
-            state.put(
-                rowFunction.apply(input),
-                columnFunction.apply(input),
-                valueFunction.apply(input),
-                mergeFunction),
-        (s1, s2) -> s1.combine(s2, mergeFunction),
-        state -> state.toTable());
+  public static <T extends @Nullable Object, R, C, V>
+      Collector<T, ?, ImmutableTable<R, C, V>> toImmutableTable(
+          Function<? super T, ? extends R> rowFunction,
+          Function<? super T, ? extends C> columnFunction,
+          Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction) {
+    return TableCollectors.toImmutableTable(
+        rowFunction, columnFunction, valueFunction, mergeFunction);
   }
 
-  private static final class CollectorState<R, C, V> {
-    final List<MutableCell<R, C, V>> insertionOrder = new ArrayList<>();
-    final Table<R, C, MutableCell<R, C, V>> table = HashBasedTable.create();
-
-    void put(R row, C column, V value, BinaryOperator<V> merger) {
-      MutableCell<R, C, V> oldCell = table.get(row, column);
-      if (oldCell == null) {
-        MutableCell<R, C, V> cell = new MutableCell<>(row, column, value);
-        insertionOrder.add(cell);
-        table.put(row, column, cell);
-      } else {
-        oldCell.merge(value, merger);
-      }
-    }
-
-    CollectorState<R, C, V> combine(CollectorState<R, C, V> other, BinaryOperator<V> merger) {
-      for (MutableCell<R, C, V> cell : other.insertionOrder) {
-        put(cell.getRowKey(), cell.getColumnKey(), cell.getValue(), merger);
-      }
-      return this;
-    }
-
-    ImmutableTable<R, C, V> toTable() {
-      return copyOf(insertionOrder);
-    }
-  }
-
-  private static final class MutableCell<R, C, V> extends AbstractCell<R, C, V> {
-    private final R row;
-    private final C column;
-    private V value;
-
-    MutableCell(R row, C column, V value) {
-      this.row = checkNotNull(row, "row");
-      this.column = checkNotNull(column, "column");
-      this.value = checkNotNull(value, "value");
-    }
-
-    @Override
-    public R getRowKey() {
-      return row;
-    }
-
-    @Override
-    public C getColumnKey() {
-      return column;
-    }
-
-    @Override
-    public V getValue() {
-      return value;
-    }
-
-    void merge(V value, BinaryOperator<V> mergeFunction) {
-      checkNotNull(value, "value");
-      this.value = checkNotNull(mergeFunction.apply(this.value, value), "mergeFunction.apply");
-    }
-  }
-
-  /** Returns an empty immutable table. */
+  /**
+   * Returns an empty immutable table.
+   *
+   * <p><b>Performance note:</b> the instance returned is a singleton.
+   */
   @SuppressWarnings("unchecked")
   public static <R, C, V> ImmutableTable<R, C, V> of() {
     return (ImmutableTable<R, C, V>) SparseImmutableTable.EMPTY;
@@ -210,7 +128,7 @@
     }
   }
 
-  private static <R, C, V> ImmutableTable<R, C, V> copyOf(
+  static <R, C, V> ImmutableTable<R, C, V> copyOf(
       Iterable<? extends Cell<? extends R, ? extends C, ? extends V>> cells) {
     ImmutableTable.Builder<R, C, V> builder = ImmutableTable.builder();
     for (Cell<? extends R, ? extends C, ? extends V> cell : cells) {
@@ -248,7 +166,7 @@
    *         .put(1, 'A', "foo")
    *         .put(1, 'B', "bar")
    *         .put(2, 'A', "baz")
-   *         .build();
+   *         .buildOrThrow();
    * }</pre>
    *
    * <p>By default, the order in which cells are added to the builder determines the iteration
@@ -259,16 +177,16 @@
    * <p>For empty or single-cell immutable tables, {@link #of()} and {@link #of(Object, Object,
    * Object)} are even more convenient.
    *
-   * <p>Builder instances can be reused - it is safe to call {@link #build} multiple times to build
-   * multiple tables in series. Each table is a superset of the tables created before it.
+   * <p>Builder instances can be reused - it is safe to call {@link #buildOrThrow} multiple times to
+   * build multiple tables in series. Each table is a superset of the tables created before it.
    *
    * @since 11.0
    */
   @DoNotMock
   public static final class Builder<R, C, V> {
     private final List<Cell<R, C, V>> cells = Lists.newArrayList();
-    private @Nullable Comparator<? super R> rowComparator;
-    private @Nullable Comparator<? super C> columnComparator;
+    @CheckForNull private Comparator<? super R> rowComparator;
+    @CheckForNull private Comparator<? super C> columnComparator;
 
     /**
      * Creates a new builder. The returned builder is equivalent to the builder generated by {@link
@@ -333,6 +251,7 @@
       return this;
     }
 
+    @CanIgnoreReturnValue
     Builder<R, C, V> combine(Builder<R, C, V> other) {
       this.cells.addAll(other.cells);
       return this;
@@ -341,9 +260,24 @@
     /**
      * Returns a newly-created immutable table.
      *
+     * <p>Prefer the equivalent method {@link #buildOrThrow()} to make it explicit that the method
+     * will throw an exception if there are duplicate key pairs. The {@code build()} method will
+     * soon be deprecated.
+     *
      * @throws IllegalArgumentException if duplicate key pairs were added
      */
     public ImmutableTable<R, C, V> build() {
+      return buildOrThrow();
+    }
+
+    /**
+     * Returns a newly-created immutable table, or throws an exception if duplicate key pairs were
+     * added.
+     *
+     * @throws IllegalArgumentException if duplicate key pairs were added
+     * @since 31.0
+     */
+    public ImmutableTable<R, C, V> buildOrThrow() {
       int size = cells.size();
       switch (size) {
         case 0:
@@ -442,12 +376,12 @@
   public abstract ImmutableMap<R, Map<C, V>> rowMap();
 
   @Override
-  public boolean contains(@Nullable Object rowKey, @Nullable Object columnKey) {
+  public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return get(rowKey, columnKey) != null;
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return values().contains(value);
   }
 
@@ -459,6 +393,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void clear() {
     throw new UnsupportedOperationException();
   }
@@ -472,6 +407,8 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
   public final V put(R rowKey, C columnKey, V value) {
     throw new UnsupportedOperationException();
   }
@@ -484,6 +421,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void putAll(Table<? extends R, ? extends C, ? extends V> table) {
     throw new UnsupportedOperationException();
   }
@@ -497,7 +435,9 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
-  public final V remove(Object rowKey, Object columnKey) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  @CheckForNull
+  public final V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     throw new UnsupportedOperationException();
   }
 
diff --git a/guava/src/com/google/common/collect/IndexedImmutableSet.java b/guava/src/com/google/common/collect/IndexedImmutableSet.java
index 0168913..20dfacb 100644
--- a/guava/src/com/google/common/collect/IndexedImmutableSet.java
+++ b/guava/src/com/google/common/collect/IndexedImmutableSet.java
@@ -22,9 +22,11 @@
 import com.google.common.annotations.GwtIncompatible;
 import java.util.Spliterator;
 import java.util.function.Consumer;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 @GwtCompatible(emulated = true)
-abstract class IndexedImmutableSet<E> extends ImmutableSet<E> {
+@ElementTypesAreNonnullByDefault
+abstract class IndexedImmutableSet<E> extends ImmutableSet.CachingAsList<E> {
   abstract E get(int index);
 
   @Override
@@ -48,7 +50,7 @@
 
   @Override
   @GwtIncompatible
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     return asList().copyIntoArray(dst, offset);
   }
 
diff --git a/guava/src/com/google/common/collect/Interner.java b/guava/src/com/google/common/collect/Interner.java
index 310bfca..bfc2035 100644
--- a/guava/src/com/google/common/collect/Interner.java
+++ b/guava/src/com/google/common/collect/Interner.java
@@ -16,7 +16,6 @@
 
 package com.google.common.collect;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.DoNotMock;
@@ -32,9 +31,9 @@
  * @author Kevin Bourrillion
  * @since 3.0
  */
-@Beta
 @DoNotMock("Use Interners.new*Interner")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface Interner<E> {
   /**
    * Chooses and returns the representative instance for any of a collection of instances that are
diff --git a/guava/src/com/google/common/collect/Interners.java b/guava/src/com/google/common/collect/Interners.java
index 061a1cf..a3ae374 100644
--- a/guava/src/com/google/common/collect/Interners.java
+++ b/guava/src/com/google/common/collect/Interners.java
@@ -16,13 +16,13 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Equivalence;
 import com.google.common.base.Function;
 import com.google.common.collect.MapMaker.Dummy;
 import com.google.common.collect.MapMakerInternalMap.InternalEntry;
+import javax.annotation.CheckForNull;
 
 /**
  * Contains static methods pertaining to instances of {@link Interner}.
@@ -30,8 +30,8 @@
  * @author Kevin Bourrillion
  * @since 3.0
  */
-@Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Interners {
   private Interners() {}
 
@@ -124,11 +124,15 @@
     public E intern(E sample) {
       while (true) {
         // trying to read the canonical...
-        InternalEntry<E, Dummy, ?> entry = map.getEntry(sample);
+        @SuppressWarnings("rawtypes") // using raw types to avoid a bug in our nullness checker :(
+        InternalEntry entry = map.getEntry(sample);
         if (entry != null) {
-          E canonical = entry.getKey();
+          Object canonical = entry.getKey();
           if (canonical != null) { // only matters if weak/soft keys are used
-            return canonical;
+            // The compiler would know this is safe if not for our use of raw types (see above).
+            @SuppressWarnings("unchecked")
+            E result = (E) canonical;
+            return result;
           }
         }
 
@@ -176,7 +180,7 @@
     }
 
     @Override
-    public boolean equals(Object other) {
+    public boolean equals(@CheckForNull Object other) {
       if (other instanceof InternerFunction) {
         InternerFunction<?> that = (InternerFunction<?>) other;
         return interner.equals(that.interner);
diff --git a/guava/src/com/google/common/collect/Iterables.java b/guava/src/com/google/common/collect/Iterables.java
index 4aa02e1..fb2b543 100644
--- a/guava/src/com/google/common/collect/Iterables.java
+++ b/guava/src/com/google/common/collect/Iterables.java
@@ -39,6 +39,7 @@
 import java.util.Spliterator;
 import java.util.function.Consumer;
 import java.util.stream.Stream;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -64,11 +65,13 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Iterables {
   private Iterables() {}
 
   /** Returns an unmodifiable view of {@code iterable}. */
-  public static <T> Iterable<T> unmodifiableIterable(final Iterable<? extends T> iterable) {
+  public static <T extends @Nullable Object> Iterable<T> unmodifiableIterable(
+      final Iterable<? extends T> iterable) {
     checkNotNull(iterable);
     if (iterable instanceof UnmodifiableIterable || iterable instanceof ImmutableCollection) {
       @SuppressWarnings("unchecked") // Since it's unmodifiable, the covariant cast is safe
@@ -89,7 +92,8 @@
     return checkNotNull(iterable);
   }
 
-  private static final class UnmodifiableIterable<T> extends FluentIterable<T> {
+  private static final class UnmodifiableIterable<T extends @Nullable Object>
+      extends FluentIterable<T> {
     private final Iterable<? extends T> iterable;
 
     private UnmodifiableIterable(Iterable<? extends T> iterable) {
@@ -132,7 +136,9 @@
    * cases where {@link Collection#contains} might throw {@link NullPointerException} or {@link
    * ClassCastException}.
    */
-  public static boolean contains(Iterable<?> iterable, @Nullable Object element) {
+  // <? extends @Nullable Object> instead of <?> because of Kotlin b/189937072, discussed in Joiner.
+  public static boolean contains(
+      Iterable<? extends @Nullable Object> iterable, @CheckForNull Object element) {
     if (iterable instanceof Collection) {
       Collection<?> collection = (Collection<?>) iterable;
       return Collections2.safeContains(collection, element);
@@ -191,7 +197,8 @@
    * @since 2.0
    */
   @CanIgnoreReturnValue
-  public static <T> boolean removeIf(Iterable<T> removeFrom, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean removeIf(
+      Iterable<T> removeFrom, Predicate<? super T> predicate) {
     if (removeFrom instanceof Collection) {
       return ((Collection<T>) removeFrom).removeIf(predicate);
     }
@@ -199,7 +206,8 @@
   }
 
   /** Removes and returns the first matching element, or returns {@code null} if there is none. */
-  static <T> @Nullable T removeFirstMatching(
+  @CheckForNull
+  static <T extends @Nullable Object> T removeFirstMatching(
       Iterable<T> removeFrom, Predicate<? super T> predicate) {
     checkNotNull(predicate);
     Iterator<T> iterator = removeFrom.iterator();
@@ -250,7 +258,8 @@
    * @throws NoSuchElementException if the iterable is empty
    * @throws IllegalArgumentException if the iterable contains multiple elements
    */
-  public static <T> T getOnlyElement(Iterable<T> iterable) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getOnlyElement(Iterable<T> iterable) {
     return Iterators.getOnlyElement(iterable.iterator());
   }
 
@@ -263,8 +272,9 @@
    *
    * @throws IllegalArgumentException if the iterator contains multiple elements
    */
-  public static <T> @Nullable T getOnlyElement(
-      Iterable<? extends T> iterable, @Nullable T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getOnlyElement(
+      Iterable<? extends T> iterable, @ParametricNullness T defaultValue) {
     return Iterators.getOnlyElement(iterable.iterator(), defaultValue);
   }
 
@@ -276,11 +286,16 @@
    * @return a newly-allocated array into which all the elements of the iterable have been copied
    */
   @GwtIncompatible // Array.newInstance(Class, int)
-  public static <T> T[] toArray(Iterable<? extends T> iterable, Class<T> type) {
+  /*
+   * If we could express Class<@Nonnull T>, we could generalize the type parameter to <T extends
+   * @Nullable Object>, and then we could accept an Iterable<? extends T> and return a plain T[]
+   * instead of a @Nullable T[].
+   */
+  public static <T> @Nullable T[] toArray(Iterable<? extends @Nullable T> iterable, Class<T> type) {
     return toArray(iterable, ObjectArrays.newArray(type, 0));
   }
 
-  static <T> T[] toArray(Iterable<? extends T> iterable, T[] array) {
+  static <T extends @Nullable Object> T[] toArray(Iterable<? extends T> iterable, T[] array) {
     Collection<? extends T> collection = castOrCopyToCollection(iterable);
     return collection.toArray(array);
   }
@@ -291,7 +306,7 @@
    * @param iterable the iterable to copy
    * @return a newly-allocated array into which all the elements of the iterable have been copied
    */
-  static Object[] toArray(Iterable<?> iterable) {
+  static @Nullable Object[] toArray(Iterable<?> iterable) {
     return castOrCopyToCollection(iterable).toArray();
   }
 
@@ -300,7 +315,8 @@
    * returned. Otherwise, an {@link java.util.ArrayList} is created with the contents of the
    * iterable in the same iteration order.
    */
-  private static <E> Collection<E> castOrCopyToCollection(Iterable<E> iterable) {
+  private static <E extends @Nullable Object> Collection<E> castOrCopyToCollection(
+      Iterable<E> iterable) {
     return (iterable instanceof Collection)
         ? (Collection<E>) iterable
         : Lists.newArrayList(iterable.iterator());
@@ -312,7 +328,8 @@
    * @return {@code true} if {@code collection} was modified as a result of this operation.
    */
   @CanIgnoreReturnValue
-  public static <T> boolean addAll(Collection<T> addTo, Iterable<? extends T> elementsToAdd) {
+  public static <T extends @Nullable Object> boolean addAll(
+      Collection<T> addTo, Iterable<? extends T> elementsToAdd) {
     if (elementsToAdd instanceof Collection) {
       Collection<? extends T> c = (Collection<? extends T>) elementsToAdd;
       return addTo.addAll(c);
@@ -331,7 +348,7 @@
    * @see java.util.Collections#frequency(Collection, Object) Collections.frequency(Collection,
    *     Object)
    */
-  public static int frequency(Iterable<?> iterable, @Nullable Object element) {
+  public static int frequency(Iterable<?> iterable, @CheckForNull Object element) {
     if ((iterable instanceof Multiset)) {
       return ((Multiset<?>) iterable).count(element);
     } else if ((iterable instanceof Set)) {
@@ -358,7 +375,7 @@
    * <p><b>Java 8 users:</b> The {@code Stream} equivalent of this method is {@code
    * Stream.generate(() -> iterable).flatMap(Streams::stream)}.
    */
-  public static <T> Iterable<T> cycle(final Iterable<T> iterable) {
+  public static <T extends @Nullable Object> Iterable<T> cycle(final Iterable<T> iterable) {
     checkNotNull(iterable);
     return new FluentIterable<T>() {
       @Override
@@ -368,7 +385,7 @@
 
       @Override
       public Spliterator<T> spliterator() {
-        return Stream.generate(() -> iterable).flatMap(Streams::stream).spliterator();
+        return Stream.generate(() -> iterable).<T>flatMap(Streams::stream).spliterator();
       }
 
       @Override
@@ -399,7 +416,7 @@
    * and use {@code Stream.generate(() -> collection).flatMap(Collection::stream)}.
    */
   @SafeVarargs
-  public static <T> Iterable<T> cycle(T... elements) {
+  public static <T extends @Nullable Object> Iterable<T> cycle(T... elements) {
     return cycle(Lists.newArrayList(elements));
   }
 
@@ -414,7 +431,8 @@
    * <p><b>Java 8 users:</b> The {@code Stream} equivalent of this method is {@code Stream.concat(a,
    * b)}.
    */
-  public static <T> Iterable<T> concat(Iterable<? extends T> a, Iterable<? extends T> b) {
+  public static <T extends @Nullable Object> Iterable<T> concat(
+      Iterable<? extends T> a, Iterable<? extends T> b) {
     return FluentIterable.concat(a, b);
   }
 
@@ -429,7 +447,7 @@
    * <p><b>Java 8 users:</b> The {@code Stream} equivalent of this method is {@code
    * Streams.concat(a, b, c)}.
    */
-  public static <T> Iterable<T> concat(
+  public static <T extends @Nullable Object> Iterable<T> concat(
       Iterable<? extends T> a, Iterable<? extends T> b, Iterable<? extends T> c) {
     return FluentIterable.concat(a, b, c);
   }
@@ -446,7 +464,7 @@
    * <p><b>Java 8 users:</b> The {@code Stream} equivalent of this method is {@code
    * Streams.concat(a, b, c, d)}.
    */
-  public static <T> Iterable<T> concat(
+  public static <T extends @Nullable Object> Iterable<T> concat(
       Iterable<? extends T> a,
       Iterable<? extends T> b,
       Iterable<? extends T> c,
@@ -468,7 +486,7 @@
    * @throws NullPointerException if any of the provided iterables is null
    */
   @SafeVarargs
-  public static <T> Iterable<T> concat(Iterable<? extends T>... inputs) {
+  public static <T extends @Nullable Object> Iterable<T> concat(Iterable<? extends T>... inputs) {
     return FluentIterable.concat(inputs);
   }
 
@@ -484,7 +502,8 @@
    * <p><b>Java 8 users:</b> The {@code Stream} equivalent of this method is {@code
    * streamOfStreams.flatMap(s -> s)}.
    */
-  public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs) {
+  public static <T extends @Nullable Object> Iterable<T> concat(
+      Iterable<? extends Iterable<? extends T>> inputs) {
     return FluentIterable.concat(inputs);
   }
 
@@ -506,7 +525,8 @@
    *     into partitions
    * @throws IllegalArgumentException if {@code size} is nonpositive
    */
-  public static <T> Iterable<List<T>> partition(final Iterable<T> iterable, final int size) {
+  public static <T extends @Nullable Object> Iterable<List<T>> partition(
+      final Iterable<T> iterable, final int size) {
     checkNotNull(iterable);
     checkArgument(size > 0);
     return new FluentIterable<List<T>>() {
@@ -532,12 +552,13 @@
    *     into partitions (the final iterable may have trailing null elements)
    * @throws IllegalArgumentException if {@code size} is nonpositive
    */
-  public static <T> Iterable<List<T>> paddedPartition(final Iterable<T> iterable, final int size) {
+  public static <T extends @Nullable Object> Iterable<List<@Nullable T>> paddedPartition(
+      final Iterable<T> iterable, final int size) {
     checkNotNull(iterable);
     checkArgument(size > 0);
-    return new FluentIterable<List<T>>() {
+    return new FluentIterable<List<@Nullable T>>() {
       @Override
-      public Iterator<List<T>> iterator() {
+      public Iterator<List<@Nullable T>> iterator() {
         return Iterators.paddedPartition(iterable.iterator(), size);
       }
     };
@@ -549,7 +570,7 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link Stream#filter}.
    */
-  public static <T> Iterable<T> filter(
+  public static <T extends @Nullable Object> Iterable<T> filter(
       final Iterable<T> unfiltered, final Predicate<? super T> retainIfTrue) {
     checkNotNull(unfiltered);
     checkNotNull(retainIfTrue);
@@ -563,7 +584,7 @@
       public void forEach(Consumer<? super T> action) {
         checkNotNull(action);
         unfiltered.forEach(
-            (T a) -> {
+            (@ParametricNullness T a) -> {
               if (retainIfTrue.test(a)) {
                 action.accept(a);
               }
@@ -604,7 +625,8 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link Stream#anyMatch}.
    */
-  public static <T> boolean any(Iterable<T> iterable, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean any(
+      Iterable<T> iterable, Predicate<? super T> predicate) {
     return Iterators.any(iterable.iterator(), predicate);
   }
 
@@ -614,7 +636,8 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link Stream#allMatch}.
    */
-  public static <T> boolean all(Iterable<T> iterable, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean all(
+      Iterable<T> iterable, Predicate<? super T> predicate) {
     return Iterators.all(iterable.iterator(), predicate);
   }
 
@@ -627,7 +650,9 @@
    *
    * @throws NoSuchElementException if no element in {@code iterable} matches the given predicate
    */
-  public static <T> T find(Iterable<T> iterable, Predicate<? super T> predicate) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T find(
+      Iterable<T> iterable, Predicate<? super T> predicate) {
     return Iterators.find(iterable.iterator(), predicate);
   }
 
@@ -641,8 +666,26 @@
    *
    * @since 7.0
    */
-  public static <T> @Nullable T find(
-      Iterable<? extends T> iterable, Predicate<? super T> predicate, @Nullable T defaultValue) {
+  // The signature we really want here is...
+  //
+  // <T extends @Nullable Object> @JointlyNullable T find(
+  //     Iterable<? extends T> iterable,
+  //     Predicate<? super T> predicate,
+  //     @JointlyNullable T defaultValue);
+  //
+  // ...where "@JointlyNullable" is similar to @PolyNull but slightly different:
+  //
+  // - @PolyNull means "@Nullable or @Nonnull"
+  //   (That would be unsound for an input Iterable<@Nullable Foo>. So, if we wanted to use
+  //   @PolyNull, we would have to restrict this method to non-null <T>. But it has users who pass
+  //   iterables with null elements.)
+  //
+  // - @JointlyNullable means "@Nullable or no annotation"
+  @CheckForNull
+  public static <T extends @Nullable Object> T find(
+      Iterable<? extends T> iterable,
+      Predicate<? super T> predicate,
+      @CheckForNull T defaultValue) {
     return Iterators.find(iterable.iterator(), predicate, defaultValue);
   }
 
@@ -671,7 +714,8 @@
    *
    * @since 2.0
    */
-  public static <T> int indexOf(Iterable<T> iterable, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> int indexOf(
+      Iterable<T> iterable, Predicate<? super T> predicate) {
     return Iterators.indexOf(iterable.iterator(), predicate);
   }
 
@@ -688,7 +732,7 @@
    *
    * <p><b>{@code Stream} equivalent:</b> {@link Stream#map}
    */
-  public static <F, T> Iterable<T> transform(
+  public static <F extends @Nullable Object, T extends @Nullable Object> Iterable<T> transform(
       final Iterable<F> fromIterable, final Function<? super F, ? extends T> function) {
     checkNotNull(fromIterable);
     checkNotNull(function);
@@ -722,7 +766,8 @@
    * @throws IndexOutOfBoundsException if {@code position} is negative or greater than or equal to
    *     the size of {@code iterable}
    */
-  public static <T> T get(Iterable<T> iterable, int position) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T get(Iterable<T> iterable, int position) {
     checkNotNull(iterable);
     return (iterable instanceof List)
         ? ((List<T>) iterable).get(position)
@@ -744,8 +789,9 @@
    * @throws IndexOutOfBoundsException if {@code position} is negative
    * @since 4.0
    */
-  public static <T> @Nullable T get(
-      Iterable<? extends T> iterable, int position, @Nullable T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T get(
+      Iterable<? extends T> iterable, int position, @ParametricNullness T defaultValue) {
     checkNotNull(iterable);
     Iterators.checkNonnegative(position);
     if (iterable instanceof List) {
@@ -775,7 +821,9 @@
    * @return the first element of {@code iterable} or the default value
    * @since 7.0
    */
-  public static <T> @Nullable T getFirst(Iterable<? extends T> iterable, @Nullable T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getFirst(
+      Iterable<? extends T> iterable, @ParametricNullness T defaultValue) {
     return Iterators.getNext(iterable.iterator(), defaultValue);
   }
 
@@ -788,7 +836,8 @@
    * @return the last element of {@code iterable}
    * @throws NoSuchElementException if the iterable is empty
    */
-  public static <T> T getLast(Iterable<T> iterable) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getLast(Iterable<T> iterable) {
     // TODO(kevinb): Support a concurrently modified collection?
     if (iterable instanceof List) {
       List<T> list = (List<T>) iterable;
@@ -812,7 +861,9 @@
    * @return the last element of {@code iterable} or the default value
    * @since 3.0
    */
-  public static <T> @Nullable T getLast(Iterable<? extends T> iterable, @Nullable T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getLast(
+      Iterable<? extends T> iterable, @ParametricNullness T defaultValue) {
     if (iterable instanceof Collection) {
       Collection<? extends T> c = (Collection<? extends T>) iterable;
       if (c.isEmpty()) {
@@ -825,7 +876,8 @@
     return Iterators.getLast(iterable.iterator(), defaultValue);
   }
 
-  private static <T> T getLastInNonemptyList(List<T> list) {
+  @ParametricNullness
+  private static <T extends @Nullable Object> T getLastInNonemptyList(List<T> list) {
     return list.get(list.size() - 1);
   }
 
@@ -848,7 +900,8 @@
    *
    * @since 3.0
    */
-  public static <T> Iterable<T> skip(final Iterable<T> iterable, final int numberToSkip) {
+  public static <T extends @Nullable Object> Iterable<T> skip(
+      final Iterable<T> iterable, final int numberToSkip) {
     checkNotNull(iterable);
     checkArgument(numberToSkip >= 0, "number to skip cannot be negative");
 
@@ -878,6 +931,7 @@
           }
 
           @Override
+          @ParametricNullness
           public T next() {
             T result = iterator.next();
             atStart = false; // not called if next() fails
@@ -918,7 +972,8 @@
    * @throws IllegalArgumentException if {@code limitSize} is negative
    * @since 3.0
    */
-  public static <T> Iterable<T> limit(final Iterable<T> iterable, final int limitSize) {
+  public static <T extends @Nullable Object> Iterable<T> limit(
+      final Iterable<T> iterable, final int limitSize) {
     checkNotNull(iterable);
     checkArgument(limitSize >= 0, "limit is negative");
     return new FluentIterable<T>() {
@@ -950,7 +1005,8 @@
    * @see Iterators#consumingIterator(Iterator)
    * @since 2.0
    */
-  public static <T> Iterable<T> consumingIterable(final Iterable<T> iterable) {
+  public static <T extends @Nullable Object> Iterable<T> consumingIterable(
+      final Iterable<T> iterable) {
     checkNotNull(iterable);
 
     return new FluentIterable<T>() {
@@ -1001,7 +1057,7 @@
    * @since 11.0
    */
   @Beta
-  public static <T> Iterable<T> mergeSorted(
+  public static <T extends @Nullable Object> Iterable<T> mergeSorted(
       final Iterable<? extends Iterable<? extends T>> iterables,
       final Comparator<? super T> comparator) {
     checkNotNull(iterables, "iterables");
@@ -1019,7 +1075,8 @@
 
   // TODO(user): Is this the best place for this? Move to fluent functions?
   // Useful as a public method?
-  static <T> Function<Iterable<? extends T>, Iterator<? extends T>> toIterator() {
+  static <T extends @Nullable Object>
+      Function<Iterable<? extends T>, Iterator<? extends T>> toIterator() {
     return new Function<Iterable<? extends T>, Iterator<? extends T>>() {
       @Override
       public Iterator<? extends T> apply(Iterable<? extends T> iterable) {
diff --git a/guava/src/com/google/common/collect/Iterators.java b/guava/src/com/google/common/collect/Iterators.java
index f655c27..5ea2da9 100644
--- a/guava/src/com/google/common/collect/Iterators.java
+++ b/guava/src/com/google/common/collect/Iterators.java
@@ -21,6 +21,8 @@
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.base.Predicates.instanceOf;
 import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -45,6 +47,7 @@
 import java.util.NoSuchElementException;
 import java.util.PriorityQueue;
 import java.util.Queue;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -65,6 +68,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Iterators {
   private Iterators() {}
 
@@ -73,7 +77,7 @@
    *
    * <p>The {@link Iterable} equivalent of this method is {@link ImmutableSet#of()}.
    */
-  static <T> UnmodifiableIterator<T> emptyIterator() {
+  static <T extends @Nullable Object> UnmodifiableIterator<T> emptyIterator() {
     return emptyListIterator();
   }
 
@@ -84,7 +88,7 @@
    */
   // Casting to any type is safe since there are no actual elements.
   @SuppressWarnings("unchecked")
-  static <T> UnmodifiableListIterator<T> emptyListIterator() {
+  static <T extends @Nullable Object> UnmodifiableListIterator<T> emptyListIterator() {
     return (UnmodifiableListIterator<T>) ArrayItr.EMPTY;
   }
 
@@ -117,12 +121,12 @@
    */
   // Casting to any type is safe since there are no actual elements.
   @SuppressWarnings("unchecked")
-  static <T> Iterator<T> emptyModifiableIterator() {
+  static <T extends @Nullable Object> Iterator<T> emptyModifiableIterator() {
     return (Iterator<T>) EmptyModifiableIterator.INSTANCE;
   }
 
   /** Returns an unmodifiable view of {@code iterator}. */
-  public static <T> UnmodifiableIterator<T> unmodifiableIterator(
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> unmodifiableIterator(
       final Iterator<? extends T> iterator) {
     checkNotNull(iterator);
     if (iterator instanceof UnmodifiableIterator) {
@@ -137,6 +141,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         return iterator.next();
       }
@@ -150,7 +155,8 @@
    * @since 10.0
    */
   @Deprecated
-  public static <T> UnmodifiableIterator<T> unmodifiableIterator(UnmodifiableIterator<T> iterator) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> unmodifiableIterator(
+      UnmodifiableIterator<T> iterator) {
     return checkNotNull(iterator);
   }
 
@@ -168,7 +174,7 @@
   }
 
   /** Returns {@code true} if {@code iterator} contains {@code element}. */
-  public static boolean contains(Iterator<?> iterator, @Nullable Object element) {
+  public static boolean contains(Iterator<?> iterator, @CheckForNull Object element) {
     if (element == null) {
       while (iterator.hasNext()) {
         if (iterator.next() == null) {
@@ -216,7 +222,8 @@
    * @since 2.0
    */
   @CanIgnoreReturnValue
-  public static <T> boolean removeIf(Iterator<T> removeFrom, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean removeIf(
+      Iterator<T> removeFrom, Predicate<? super T> predicate) {
     checkNotNull(predicate);
     boolean modified = false;
     while (removeFrom.hasNext()) {
@@ -297,7 +304,8 @@
    * @throws IllegalArgumentException if the iterator contains multiple elements. The state of the
    *     iterator is unspecified.
    */
-  public static <T> T getOnlyElement(Iterator<T> iterator) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getOnlyElement(Iterator<T> iterator) {
     T first = iterator.next();
     if (!iterator.hasNext()) {
       return first;
@@ -322,8 +330,9 @@
    * @throws IllegalArgumentException if the iterator contains multiple elements. The state of the
    *     iterator is unspecified.
    */
-  public static <T> @Nullable T getOnlyElement(
-      Iterator<? extends T> iterator, @Nullable T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getOnlyElement(
+      Iterator<? extends T> iterator, @ParametricNullness T defaultValue) {
     return iterator.hasNext() ? getOnlyElement(iterator) : defaultValue;
   }
 
@@ -336,8 +345,9 @@
    * @return a newly-allocated array into which all the elements of the iterator have been copied
    */
   @GwtIncompatible // Array.newInstance(Class, int)
-  public static <T> T[] toArray(Iterator<? extends T> iterator, Class<T> type) {
-    List<T> list = Lists.newArrayList(iterator);
+  // For discussion of this signature, see the corresponding overload of *Iterables*.toArray.
+  public static <T> @Nullable T[] toArray(Iterator<? extends @Nullable T> iterator, Class<T> type) {
+    List<@Nullable T> list = Lists.newArrayList(iterator);
     return Iterables.toArray(list, type);
   }
 
@@ -348,7 +358,8 @@
    * @return {@code true} if {@code collection} was modified as a result of this operation
    */
   @CanIgnoreReturnValue
-  public static <T> boolean addAll(Collection<T> addTo, Iterator<? extends T> iterator) {
+  public static <T extends @Nullable Object> boolean addAll(
+      Collection<T> addTo, Iterator<? extends T> iterator) {
     checkNotNull(addTo);
     checkNotNull(iterator);
     boolean wasModified = false;
@@ -364,7 +375,7 @@
    *
    * @see Collections#frequency
    */
-  public static int frequency(Iterator<?> iterator, @Nullable Object element) {
+  public static int frequency(Iterator<?> iterator, @CheckForNull Object element) {
     int count = 0;
     while (contains(iterator, element)) {
       // Since it lives in the same class, we know contains gets to the element and then stops,
@@ -386,7 +397,7 @@
    * should use an explicit {@code break} or be certain that you will eventually remove all the
    * elements.
    */
-  public static <T> Iterator<T> cycle(final Iterable<T> iterable) {
+  public static <T extends @Nullable Object> Iterator<T> cycle(final Iterable<T> iterable) {
     checkNotNull(iterable);
     return new Iterator<T>() {
       Iterator<T> iterator = emptyModifiableIterator();
@@ -406,6 +417,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         if (!iterator.hasNext()) {
           iterator = iterable.iterator();
@@ -436,7 +448,7 @@
    * elements.
    */
   @SafeVarargs
-  public static <T> Iterator<T> cycle(T... elements) {
+  public static <T extends @Nullable Object> Iterator<T> cycle(T... elements) {
     return cycle(Lists.newArrayList(elements));
   }
 
@@ -444,10 +456,15 @@
    * Returns an Iterator that walks the specified array, nulling out elements behind it. This can
    * avoid memory leaks when an element is no longer necessary.
    *
+   * <p>This method accepts an array with element type {@code @Nullable T}, but callers must pass an
+   * array whose contents are initially non-null. The {@code @Nullable} annotation indicates that
+   * this method will write nulls into the array during iteration.
+   *
    * <p>This is mainly just to avoid the intermediate ArrayDeque in ConsumingQueueIterator.
    */
-  private static <T> Iterator<T> consumingForArray(final T... elements) {
-    return new UnmodifiableIterator<T>() {
+  private static <I extends Iterator<?>> Iterator<I> consumingForArray(
+      final @Nullable I... elements) {
+    return new UnmodifiableIterator<I>() {
       int index = 0;
 
       @Override
@@ -456,11 +473,15 @@
       }
 
       @Override
-      public T next() {
+      public I next() {
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
-        T result = elements[index];
+        /*
+         * requireNonNull is safe because our callers always pass non-null arguments. Each element
+         * of the array becomes null only when we iterate past it and then clear it.
+         */
+        I result = requireNonNull(elements[index]);
         elements[index] = null;
         index++;
         return result;
@@ -476,7 +497,8 @@
    * <p>The returned iterator supports {@code remove()} when the corresponding input iterator
    * supports it.
    */
-  public static <T> Iterator<T> concat(Iterator<? extends T> a, Iterator<? extends T> b) {
+  public static <T extends @Nullable Object> Iterator<T> concat(
+      Iterator<? extends T> a, Iterator<? extends T> b) {
     checkNotNull(a);
     checkNotNull(b);
     return concat(consumingForArray(a, b));
@@ -490,7 +512,7 @@
    * <p>The returned iterator supports {@code remove()} when the corresponding input iterator
    * supports it.
    */
-  public static <T> Iterator<T> concat(
+  public static <T extends @Nullable Object> Iterator<T> concat(
       Iterator<? extends T> a, Iterator<? extends T> b, Iterator<? extends T> c) {
     checkNotNull(a);
     checkNotNull(b);
@@ -507,7 +529,7 @@
    * <p>The returned iterator supports {@code remove()} when the corresponding input iterator
    * supports it.
    */
-  public static <T> Iterator<T> concat(
+  public static <T extends @Nullable Object> Iterator<T> concat(
       Iterator<? extends T> a,
       Iterator<? extends T> b,
       Iterator<? extends T> c,
@@ -529,7 +551,7 @@
    *
    * @throws NullPointerException if any of the provided iterators is null
    */
-  public static <T> Iterator<T> concat(Iterator<? extends T>... inputs) {
+  public static <T extends @Nullable Object> Iterator<T> concat(Iterator<? extends T>... inputs) {
     return concatNoDefensiveCopy(Arrays.copyOf(inputs, inputs.length));
   }
 
@@ -542,12 +564,14 @@
    * supports it. The methods of the returned iterator may throw {@code NullPointerException} if any
    * of the input iterators is null.
    */
-  public static <T> Iterator<T> concat(Iterator<? extends Iterator<? extends T>> inputs) {
+  public static <T extends @Nullable Object> Iterator<T> concat(
+      Iterator<? extends Iterator<? extends T>> inputs) {
     return new ConcatenatedIterator<T>(inputs);
   }
 
   /** Concats a varargs array of iterators without making a defensive copy of the array. */
-  static <T> Iterator<T> concatNoDefensiveCopy(Iterator<? extends T>... inputs) {
+  static <T extends @Nullable Object> Iterator<T> concatNoDefensiveCopy(
+      Iterator<? extends T>... inputs) {
     for (Iterator<? extends T> input : checkNotNull(inputs)) {
       checkNotNull(input);
     }
@@ -568,7 +592,8 @@
    *     partitions
    * @throws IllegalArgumentException if {@code size} is nonpositive
    */
-  public static <T> UnmodifiableIterator<List<T>> partition(Iterator<T> iterator, int size) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<List<T>> partition(
+      Iterator<T> iterator, int size) {
     return partitionImpl(iterator, size, false);
   }
 
@@ -586,26 +611,29 @@
    *     partitions (the final iterable may have trailing null elements)
    * @throws IllegalArgumentException if {@code size} is nonpositive
    */
-  public static <T> UnmodifiableIterator<List<T>> paddedPartition(Iterator<T> iterator, int size) {
+  public static <T extends @Nullable Object>
+      UnmodifiableIterator<List<@Nullable T>> paddedPartition(Iterator<T> iterator, int size) {
     return partitionImpl(iterator, size, true);
   }
 
-  private static <T> UnmodifiableIterator<List<T>> partitionImpl(
+  private static <T extends @Nullable Object> UnmodifiableIterator<List<@Nullable T>> partitionImpl(
       final Iterator<T> iterator, final int size, final boolean pad) {
     checkNotNull(iterator);
     checkArgument(size > 0);
-    return new UnmodifiableIterator<List<T>>() {
+    return new UnmodifiableIterator<List<@Nullable T>>() {
       @Override
       public boolean hasNext() {
         return iterator.hasNext();
       }
 
       @Override
-      public List<T> next() {
+      public List<@Nullable T> next() {
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
-        Object[] array = new Object[size];
+        @SuppressWarnings("unchecked") // we only put Ts in it
+        @Nullable
+        T[] array = (@Nullable T[]) new Object[size];
         int count = 0;
         for (; count < size && iterator.hasNext(); count++) {
           array[count] = iterator.next();
@@ -614,9 +642,13 @@
           array[i] = null; // for GWT
         }
 
-        @SuppressWarnings("unchecked") // we only put Ts in it
-        List<T> list = Collections.unmodifiableList((List<T>) Arrays.asList(array));
-        return (pad || count == size) ? list : list.subList(0, count);
+        List<@Nullable T> list = Collections.unmodifiableList(Arrays.asList(array));
+        // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+        if (pad || count == size) {
+          return list;
+        } else {
+          return list.subList(0, count);
+        }
       }
     };
   }
@@ -625,12 +657,13 @@
    * Returns a view of {@code unfiltered} containing all elements that satisfy the input predicate
    * {@code retainIfTrue}.
    */
-  public static <T> UnmodifiableIterator<T> filter(
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> filter(
       final Iterator<T> unfiltered, final Predicate<? super T> retainIfTrue) {
     checkNotNull(unfiltered);
     checkNotNull(retainIfTrue);
     return new AbstractIterator<T>() {
       @Override
+      @CheckForNull
       protected T computeNext() {
         while (unfiltered.hasNext()) {
           T element = unfiltered.next();
@@ -657,7 +690,8 @@
    * Returns {@code true} if one or more elements returned by {@code iterator} satisfy the given
    * predicate.
    */
-  public static <T> boolean any(Iterator<T> iterator, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean any(
+      Iterator<T> iterator, Predicate<? super T> predicate) {
     return indexOf(iterator, predicate) != -1;
   }
 
@@ -665,7 +699,8 @@
    * Returns {@code true} if every element returned by {@code iterator} satisfies the given
    * predicate. If {@code iterator} is empty, {@code true} is returned.
    */
-  public static <T> boolean all(Iterator<T> iterator, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> boolean all(
+      Iterator<T> iterator, Predicate<? super T> predicate) {
     checkNotNull(predicate);
     while (iterator.hasNext()) {
       T element = iterator.next();
@@ -685,7 +720,9 @@
    *
    * @throws NoSuchElementException if no element in {@code iterator} matches the given predicate
    */
-  public static <T> T find(Iterator<T> iterator, Predicate<? super T> predicate) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T find(
+      Iterator<T> iterator, Predicate<? super T> predicate) {
     checkNotNull(iterator);
     checkNotNull(predicate);
     while (iterator.hasNext()) {
@@ -705,8 +742,12 @@
    *
    * @since 7.0
    */
-  public static <T> @Nullable T find(
-      Iterator<? extends T> iterator, Predicate<? super T> predicate, @Nullable T defaultValue) {
+  // For discussion of this signature, see the corresponding overload of *Iterables*.find.
+  @CheckForNull
+  public static <T extends @Nullable Object> T find(
+      Iterator<? extends T> iterator,
+      Predicate<? super T> predicate,
+      @CheckForNull T defaultValue) {
     checkNotNull(iterator);
     checkNotNull(predicate);
     while (iterator.hasNext()) {
@@ -755,7 +796,8 @@
    *
    * @since 2.0
    */
-  public static <T> int indexOf(Iterator<T> iterator, Predicate<? super T> predicate) {
+  public static <T extends @Nullable Object> int indexOf(
+      Iterator<T> iterator, Predicate<? super T> predicate) {
     checkNotNull(predicate, "predicate");
     for (int i = 0; iterator.hasNext(); i++) {
       T current = iterator.next();
@@ -774,12 +816,13 @@
    * successful {@code remove()} call, {@code fromIterator} no longer contains the corresponding
    * element.
    */
-  public static <F, T> Iterator<T> transform(
+  public static <F extends @Nullable Object, T extends @Nullable Object> Iterator<T> transform(
       final Iterator<F> fromIterator, final Function<? super F, ? extends T> function) {
     checkNotNull(function);
     return new TransformedIterator<F, T>(fromIterator) {
+      @ParametricNullness
       @Override
-      T transform(F from) {
+      T transform(@ParametricNullness F from) {
         return function.apply(from);
       }
     };
@@ -794,7 +837,8 @@
    * @throws IndexOutOfBoundsException if {@code position} is negative or greater than or equal to
    *     the number of elements remaining in {@code iterator}
    */
-  public static <T> T get(Iterator<T> iterator, int position) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T get(Iterator<T> iterator, int position) {
     checkNonnegative(position);
     int skipped = advance(iterator, position);
     if (!iterator.hasNext()) {
@@ -820,8 +864,9 @@
    * @throws IndexOutOfBoundsException if {@code position} is negative
    * @since 4.0
    */
-  public static <T> @Nullable T get(
-      Iterator<? extends T> iterator, int position, @Nullable T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T get(
+      Iterator<? extends T> iterator, int position, @ParametricNullness T defaultValue) {
     checkNonnegative(position);
     advance(iterator, position);
     return getNext(iterator, defaultValue);
@@ -841,7 +886,9 @@
    * @return the next element of {@code iterator} or the default value
    * @since 7.0
    */
-  public static <T> @Nullable T getNext(Iterator<? extends T> iterator, @Nullable T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getNext(
+      Iterator<? extends T> iterator, @ParametricNullness T defaultValue) {
     return iterator.hasNext() ? iterator.next() : defaultValue;
   }
 
@@ -851,7 +898,8 @@
    * @return the last element of {@code iterator}
    * @throws NoSuchElementException if the iterator is empty
    */
-  public static <T> T getLast(Iterator<T> iterator) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getLast(Iterator<T> iterator) {
     while (true) {
       T current = iterator.next();
       if (!iterator.hasNext()) {
@@ -868,7 +916,9 @@
    * @return the last element of {@code iterator}
    * @since 3.0
    */
-  public static <T> @Nullable T getLast(Iterator<? extends T> iterator, @Nullable T defaultValue) {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T getLast(
+      Iterator<? extends T> iterator, @ParametricNullness T defaultValue) {
     return iterator.hasNext() ? getLast(iterator) : defaultValue;
   }
 
@@ -901,7 +951,8 @@
    * @throws IllegalArgumentException if {@code limitSize} is negative
    * @since 3.0
    */
-  public static <T> Iterator<T> limit(final Iterator<T> iterator, final int limitSize) {
+  public static <T extends @Nullable Object> Iterator<T> limit(
+      final Iterator<T> iterator, final int limitSize) {
     checkNotNull(iterator);
     checkArgument(limitSize >= 0, "limit is negative");
     return new Iterator<T>() {
@@ -913,6 +964,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         if (!hasNext()) {
           throw new NoSuchElementException();
@@ -939,7 +991,8 @@
    * @return an iterator that removes and returns elements from the supplied iterator
    * @since 2.0
    */
-  public static <T> Iterator<T> consumingIterator(final Iterator<T> iterator) {
+  public static <T extends @Nullable Object> Iterator<T> consumingIterator(
+      final Iterator<T> iterator) {
     checkNotNull(iterator);
     return new UnmodifiableIterator<T>() {
       @Override
@@ -948,6 +1001,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         T next = iterator.next();
         iterator.remove();
@@ -965,7 +1019,8 @@
    * Deletes and returns the next value from the iterator, or returns {@code null} if there is no
    * such value.
    */
-  static <T> @Nullable T pollNext(Iterator<T> iterator) {
+  @CheckForNull
+  static <T extends @Nullable Object> T pollNext(Iterator<T> iterator) {
     if (iterator.hasNext()) {
       T result = iterator.next();
       iterator.remove();
@@ -997,7 +1052,7 @@
    * {@link ImmutableList#copyOf(Object[])}}, or {@link ImmutableList#of}.
    */
   @SafeVarargs
-  public static <T> UnmodifiableIterator<T> forArray(final T... array) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> forArray(final T... array) {
     return forArray(array, 0, array.length, 0);
   }
 
@@ -1008,7 +1063,7 @@
    * <p>The {@code Iterable} equivalent of this method is {@code
    * Arrays.asList(array).subList(offset, offset + length).listIterator(index)}.
    */
-  static <T> UnmodifiableListIterator<T> forArray(
+  static <T extends @Nullable Object> UnmodifiableListIterator<T> forArray(
       final T[] array, final int offset, int length, int index) {
     checkArgument(length >= 0);
     int end = offset + length;
@@ -1022,7 +1077,8 @@
     return new ArrayItr<T>(array, offset, length, index);
   }
 
-  private static final class ArrayItr<T> extends AbstractIndexedListIterator<T> {
+  private static final class ArrayItr<T extends @Nullable Object>
+      extends AbstractIndexedListIterator<T> {
     static final UnmodifiableListIterator<Object> EMPTY = new ArrayItr<>(new Object[0], 0, 0, 0);
 
     private final T[] array;
@@ -1035,6 +1091,7 @@
     }
 
     @Override
+    @ParametricNullness
     protected T get(int index) {
       return array[offset + index];
     }
@@ -1045,7 +1102,8 @@
    *
    * <p>The {@link Iterable} equivalent of this method is {@link Collections#singleton}.
    */
-  public static <T> UnmodifiableIterator<T> singletonIterator(final @Nullable T value) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> singletonIterator(
+      @ParametricNullness final T value) {
     return new UnmodifiableIterator<T>() {
       boolean done;
 
@@ -1055,6 +1113,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         if (done) {
           throw new NoSuchElementException();
@@ -1075,7 +1134,8 @@
    * <p><b>Java 9 users:</b> use {@code enumeration.asIterator()} instead, unless it is important to
    * return an {@code UnmodifiableIterator} instead of a plain {@code Iterator}.
    */
-  public static <T> UnmodifiableIterator<T> forEnumeration(final Enumeration<T> enumeration) {
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> forEnumeration(
+      final Enumeration<T> enumeration) {
     checkNotNull(enumeration);
     return new UnmodifiableIterator<T>() {
       @Override
@@ -1084,6 +1144,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T next() {
         return enumeration.nextElement();
       }
@@ -1096,7 +1157,8 @@
    * <p>The {@code Iterable} equivalent of this method is either {@link Collections#enumeration} (if
    * you have a {@link Collection}), or {@code Iterators.asEnumeration(collection.iterator())}.
    */
-  public static <T> Enumeration<T> asEnumeration(final Iterator<T> iterator) {
+  public static <T extends @Nullable Object> Enumeration<T> asEnumeration(
+      final Iterator<T> iterator) {
     checkNotNull(iterator);
     return new Enumeration<T>() {
       @Override
@@ -1105,6 +1167,7 @@
       }
 
       @Override
+      @ParametricNullness
       public T nextElement() {
         return iterator.next();
       }
@@ -1112,11 +1175,11 @@
   }
 
   /** Implementation of PeekingIterator that avoids peeking unless necessary. */
-  private static class PeekingImpl<E> implements PeekingIterator<E> {
+  private static class PeekingImpl<E extends @Nullable Object> implements PeekingIterator<E> {
 
     private final Iterator<? extends E> iterator;
     private boolean hasPeeked;
-    private @Nullable E peekedElement;
+    @CheckForNull private E peekedElement;
 
     public PeekingImpl(Iterator<? extends E> iterator) {
       this.iterator = checkNotNull(iterator);
@@ -1128,11 +1191,13 @@
     }
 
     @Override
+    @ParametricNullness
     public E next() {
       if (!hasPeeked) {
         return iterator.next();
       }
-      E result = peekedElement;
+      // The cast is safe because of the hasPeeked check.
+      E result = uncheckedCastNullableTToT(peekedElement);
       hasPeeked = false;
       peekedElement = null;
       return result;
@@ -1145,12 +1210,14 @@
     }
 
     @Override
+    @ParametricNullness
     public E peek() {
       if (!hasPeeked) {
         peekedElement = iterator.next();
         hasPeeked = true;
       }
-      return peekedElement;
+      // The cast is safe because of the hasPeeked check.
+      return uncheckedCastNullableTToT(peekedElement);
     }
   }
 
@@ -1190,7 +1257,8 @@
    * @return a peeking iterator backed by that iterator. Apart from the additional {@link
    *     PeekingIterator#peek()} method, this iterator behaves exactly the same as {@code iterator}.
    */
-  public static <T> PeekingIterator<T> peekingIterator(Iterator<? extends T> iterator) {
+  public static <T extends @Nullable Object> PeekingIterator<T> peekingIterator(
+      Iterator<? extends T> iterator) {
     if (iterator instanceof PeekingImpl) {
       // Safe to cast <? extends T> to <T> because PeekingImpl only uses T
       // covariantly (and cannot be subclassed to add non-covariant uses).
@@ -1208,7 +1276,8 @@
    * @since 10.0
    */
   @Deprecated
-  public static <T> PeekingIterator<T> peekingIterator(PeekingIterator<T> iterator) {
+  public static <T extends @Nullable Object> PeekingIterator<T> peekingIterator(
+      PeekingIterator<T> iterator) {
     return checkNotNull(iterator);
   }
 
@@ -1225,7 +1294,7 @@
    * @since 11.0
    */
   @Beta
-  public static <T> UnmodifiableIterator<T> mergeSorted(
+  public static <T extends @Nullable Object> UnmodifiableIterator<T> mergeSorted(
       Iterable<? extends Iterator<? extends T>> iterators, Comparator<? super T> comparator) {
     checkNotNull(iterators, "iterators");
     checkNotNull(comparator, "comparator");
@@ -1242,7 +1311,7 @@
    * iterators. (Retrieving all elements takes approximately O(N*log(M)) time, where N is the total
    * number of elements.)
    */
-  private static class MergingIterator<T> extends UnmodifiableIterator<T> {
+  private static class MergingIterator<T extends @Nullable Object> extends UnmodifiableIterator<T> {
     final Queue<PeekingIterator<T>> queue;
 
     public MergingIterator(
@@ -1273,6 +1342,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T next() {
       PeekingIterator<T> nextIter = queue.remove();
       T next = nextIter.next();
@@ -1283,9 +1353,9 @@
     }
   }
 
-  private static class ConcatenatedIterator<T> implements Iterator<T> {
+  private static class ConcatenatedIterator<T extends @Nullable Object> implements Iterator<T> {
     /* The last iterator to return an element.  Calls to remove() go to this iterator. */
-    private @Nullable Iterator<? extends T> toRemove;
+    @CheckForNull private Iterator<? extends T> toRemove;
 
     /* The iterator currently returning elements. */
     private Iterator<? extends T> iterator;
@@ -1297,10 +1367,10 @@
      * operation O(1).
      */
 
-    private Iterator<? extends Iterator<? extends T>> topMetaIterator;
+    @CheckForNull private Iterator<? extends Iterator<? extends T>> topMetaIterator;
 
     // Only becomes nonnull if we encounter nested concatenations.
-    private @Nullable Deque<Iterator<? extends Iterator<? extends T>>> metaIterators;
+    @CheckForNull private Deque<Iterator<? extends Iterator<? extends T>>> metaIterators;
 
     ConcatenatedIterator(Iterator<? extends Iterator<? extends T>> metaIterator) {
       iterator = emptyIterator();
@@ -1308,7 +1378,8 @@
     }
 
     // Returns a nonempty meta-iterator or, if all meta-iterators are empty, null.
-    private @Nullable Iterator<? extends Iterator<? extends T>> getTopMetaIterator() {
+    @CheckForNull
+    private Iterator<? extends Iterator<? extends T>> getTopMetaIterator() {
       while (topMetaIterator == null || !topMetaIterator.hasNext()) {
         if (metaIterators != null && !metaIterators.isEmpty()) {
           topMetaIterator = metaIterators.removeFirst();
@@ -1358,6 +1429,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T next() {
       if (hasNext()) {
         toRemove = iterator;
@@ -1369,14 +1441,16 @@
 
     @Override
     public void remove() {
-      CollectPreconditions.checkRemove(toRemove != null);
+      if (toRemove == null) {
+        throw new IllegalStateException("no calls to next() since the last call to remove()");
+      }
       toRemove.remove();
       toRemove = null;
     }
   }
 
   /** Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557 */
-  static <T> ListIterator<T> cast(Iterator<T> iterator) {
+  static <T extends @Nullable Object> ListIterator<T> cast(Iterator<T> iterator) {
     return (ListIterator<T>) iterator;
   }
 }
diff --git a/guava/src/com/google/common/collect/JdkBackedImmutableBiMap.java b/guava/src/com/google/common/collect/JdkBackedImmutableBiMap.java
index 6fceaa9..09f3135 100644
--- a/guava/src/com/google/common/collect/JdkBackedImmutableBiMap.java
+++ b/guava/src/com/google/common/collect/JdkBackedImmutableBiMap.java
@@ -15,12 +15,15 @@
  */
 package com.google.common.collect;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import com.google.j2objc.annotations.WeakOuter;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -28,13 +31,15 @@
  * protecting against hash flooding.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class JdkBackedImmutableBiMap<K, V> extends ImmutableBiMap<K, V> {
   @VisibleForTesting
-  static <K, V> ImmutableBiMap<K, V> create(int n, Entry<K, V>[] entryArray) {
+  static <K, V> ImmutableBiMap<K, V> create(int n, @Nullable Entry<K, V>[] entryArray) {
     Map<K, V> forwardDelegate = Maps.newHashMapWithExpectedSize(n);
     Map<V, K> backwardDelegate = Maps.newHashMapWithExpectedSize(n);
     for (int i = 0; i < n; i++) {
-      Entry<K, V> e = RegularImmutableMap.makeImmutable(entryArray[i]);
+      // requireNonNull is safe because the first `n` elements have been filled in.
+      Entry<K, V> e = RegularImmutableMap.makeImmutable(requireNonNull(entryArray[i]));
       entryArray[i] = e;
       V oldValue = forwardDelegate.putIfAbsent(e.getKey(), e.getValue());
       if (oldValue != null) {
@@ -65,7 +70,7 @@
     return entries.size();
   }
 
-  @LazyInit @RetainedWith private transient JdkBackedImmutableBiMap<V, K> inverse;
+  @LazyInit @RetainedWith @CheckForNull private transient JdkBackedImmutableBiMap<V, K> inverse;
 
   @Override
   public ImmutableBiMap<V, K> inverse() {
@@ -100,7 +105,8 @@
   }
 
   @Override
-  public V get(@Nullable Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     return forwardDelegate.get(key);
   }
 
diff --git a/guava/src/com/google/common/collect/JdkBackedImmutableMap.java b/guava/src/com/google/common/collect/JdkBackedImmutableMap.java
index ffbd189..5b323b9 100644
--- a/guava/src/com/google/common/collect/JdkBackedImmutableMap.java
+++ b/guava/src/com/google/common/collect/JdkBackedImmutableMap.java
@@ -18,10 +18,12 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.RegularImmutableMap.makeImmutable;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.Map;
 import java.util.function.BiConsumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -29,16 +31,18 @@
  * hash flooding.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class JdkBackedImmutableMap<K, V> extends ImmutableMap<K, V> {
   /**
    * Creates an {@code ImmutableMap} backed by a JDK HashMap. Used when probable hash flooding is
    * detected. This implementation may replace the entries in entryArray with its own entry objects
    * (though they will have the same key/value contents), and will take ownership of entryArray.
    */
-  static <K, V> ImmutableMap<K, V> create(int n, Entry<K, V>[] entryArray) {
+  static <K, V> ImmutableMap<K, V> create(int n, @Nullable Entry<K, V>[] entryArray) {
     Map<K, V> delegateMap = Maps.newHashMapWithExpectedSize(n);
     for (int i = 0; i < n; i++) {
-      entryArray[i] = makeImmutable(entryArray[i]);
+      // requireNonNull is safe because the first `n` elements have been filled in.
+      entryArray[i] = makeImmutable(requireNonNull(entryArray[i]));
       V oldValue = delegateMap.putIfAbsent(entryArray[i].getKey(), entryArray[i].getValue());
       if (oldValue != null) {
         throw conflictException("key", entryArray[i], entryArray[i].getKey() + "=" + oldValue);
@@ -61,7 +65,8 @@
   }
 
   @Override
-  public V get(@Nullable Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     return delegateMap.get(key);
   }
 
diff --git a/guava/src/com/google/common/collect/JdkBackedImmutableMultiset.java b/guava/src/com/google/common/collect/JdkBackedImmutableMultiset.java
index f2f196b..7bdd9e8 100644
--- a/guava/src/com/google/common/collect/JdkBackedImmutableMultiset.java
+++ b/guava/src/com/google/common/collect/JdkBackedImmutableMultiset.java
@@ -20,7 +20,7 @@
 import com.google.common.primitives.Ints;
 import java.util.Collection;
 import java.util.Map;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of ImmutableMultiset backed by a JDK Map and a list of entries. Used to protect
@@ -29,6 +29,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class JdkBackedImmutableMultiset<E> extends ImmutableMultiset<E> {
   private final Map<E, Integer> delegateMap;
   private final ImmutableList<Entry<E>> entries;
@@ -61,11 +62,11 @@
   }
 
   @Override
-  public int count(@Nullable Object element) {
+  public int count(@CheckForNull Object element) {
     return delegateMap.getOrDefault(element, 0);
   }
 
-  private transient ImmutableSet<E> elementSet;
+  @CheckForNull private transient ImmutableSet<E> elementSet;
 
   @Override
   public ImmutableSet<E> elementSet() {
diff --git a/guava/src/com/google/common/collect/JdkBackedImmutableSet.java b/guava/src/com/google/common/collect/JdkBackedImmutableSet.java
index fa2c615..c001677 100644
--- a/guava/src/com/google/common/collect/JdkBackedImmutableSet.java
+++ b/guava/src/com/google/common/collect/JdkBackedImmutableSet.java
@@ -16,7 +16,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * ImmutableSet implementation backed by a JDK HashSet, used to defend against apparent hash
@@ -26,6 +26,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 final class JdkBackedImmutableSet<E> extends IndexedImmutableSet<E> {
   private final Set<?> delegate;
   private final ImmutableList<E> delegateList;
@@ -41,7 +42,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object object) {
+  public boolean contains(@CheckForNull Object object) {
     return delegate.contains(object);
   }
 
diff --git a/guava/src/com/google/common/collect/LexicographicalOrdering.java b/guava/src/com/google/common/collect/LexicographicalOrdering.java
index 5e00eb4..91fc7bf 100644
--- a/guava/src/com/google/common/collect/LexicographicalOrdering.java
+++ b/guava/src/com/google/common/collect/LexicographicalOrdering.java
@@ -20,11 +20,14 @@
 import java.io.Serializable;
 import java.util.Comparator;
 import java.util.Iterator;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering which sorts iterables by comparing corresponding elements pairwise. */
 @GwtCompatible(serializable = true)
-final class LexicographicalOrdering<T> extends Ordering<Iterable<T>> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class LexicographicalOrdering<T extends @Nullable Object> extends Ordering<Iterable<T>>
+    implements Serializable {
   final Comparator<? super T> elementOrder;
 
   LexicographicalOrdering(Comparator<? super T> elementOrder) {
@@ -51,7 +54,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/collect/LinkedHashMultimap.java b/guava/src/com/google/common/collect/LinkedHashMultimap.java
index f4a1c65..b4d2ab9 100644
--- a/guava/src/com/google/common/collect/LinkedHashMultimap.java
+++ b/guava/src/com/google/common/collect/LinkedHashMultimap.java
@@ -17,8 +17,9 @@
 package com.google.common.collect;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -40,6 +41,7 @@
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.function.Consumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -69,6 +71,10 @@
  * read operations will work correctly. To allow concurrent update operations, wrap your multimap
  * with a call to {@link Multimaps#synchronizedSetMultimap}.
  *
+ * <p><b>Warning:</b> Do not modify either a key <i>or a value</i> of a {@code LinkedHashMultimap}
+ * in a way that affects its {@link Object#equals} behavior. Undefined behavior and bugs will
+ * result.
+ *
  * <p>See the Guava User Guide article on <a href=
  * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
  * Multimap}</a>.
@@ -78,11 +84,13 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public final class LinkedHashMultimap<K, V>
+@ElementTypesAreNonnullByDefault
+public final class LinkedHashMultimap<K extends @Nullable Object, V extends @Nullable Object>
     extends LinkedHashMultimapGwtSerializationDependencies<K, V> {
 
   /** Creates a new, empty {@code LinkedHashMultimap} with the default initial capacities. */
-  public static <K, V> LinkedHashMultimap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMultimap<K, V> create() {
     return new LinkedHashMultimap<>(DEFAULT_KEY_CAPACITY, DEFAULT_VALUE_SET_CAPACITY);
   }
 
@@ -95,7 +103,8 @@
    * @throws IllegalArgumentException if {@code expectedKeys} or {@code expectedValuesPerKey} is
    *     negative
    */
-  public static <K, V> LinkedHashMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
     return new LinkedHashMultimap<>(
         Maps.capacity(expectedKeys), Maps.capacity(expectedValuesPerKey));
   }
@@ -108,14 +117,14 @@
    *
    * @param multimap the multimap whose contents are copied to this multimap
    */
-  public static <K, V> LinkedHashMultimap<K, V> create(
-      Multimap<? extends K, ? extends V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
     LinkedHashMultimap<K, V> result = create(multimap.keySet().size(), DEFAULT_VALUE_SET_CAPACITY);
     result.putAll(multimap);
     return result;
   }
 
-  private interface ValueSetLink<K, V> {
+  private interface ValueSetLink<K extends @Nullable Object, V extends @Nullable Object> {
     ValueSetLink<K, V> getPredecessorInValueSet();
 
     ValueSetLink<K, V> getSuccessorInValueSet();
@@ -125,21 +134,25 @@
     void setSuccessorInValueSet(ValueSetLink<K, V> entry);
   }
 
-  private static <K, V> void succeedsInValueSet(ValueSetLink<K, V> pred, ValueSetLink<K, V> succ) {
+  private static <K extends @Nullable Object, V extends @Nullable Object> void succeedsInValueSet(
+      ValueSetLink<K, V> pred, ValueSetLink<K, V> succ) {
     pred.setSuccessorInValueSet(succ);
     succ.setPredecessorInValueSet(pred);
   }
 
-  private static <K, V> void succeedsInMultimap(ValueEntry<K, V> pred, ValueEntry<K, V> succ) {
+  private static <K extends @Nullable Object, V extends @Nullable Object> void succeedsInMultimap(
+      ValueEntry<K, V> pred, ValueEntry<K, V> succ) {
     pred.setSuccessorInMultimap(succ);
     succ.setPredecessorInMultimap(pred);
   }
 
-  private static <K, V> void deleteFromValueSet(ValueSetLink<K, V> entry) {
+  private static <K extends @Nullable Object, V extends @Nullable Object> void deleteFromValueSet(
+      ValueSetLink<K, V> entry) {
     succeedsInValueSet(entry.getPredecessorInValueSet(), entry.getSuccessorInValueSet());
   }
 
-  private static <K, V> void deleteFromMultimap(ValueEntry<K, V> entry) {
+  private static <K extends @Nullable Object, V extends @Nullable Object> void deleteFromMultimap(
+      ValueEntry<K, V> entry) {
     succeedsInMultimap(entry.getPredecessorInMultimap(), entry.getSuccessorInMultimap());
   }
 
@@ -150,39 +163,69 @@
    * whole.
    */
   @VisibleForTesting
-  static final class ValueEntry<K, V> extends ImmutableEntry<K, V> implements ValueSetLink<K, V> {
+  static final class ValueEntry<K extends @Nullable Object, V extends @Nullable Object>
+      extends ImmutableEntry<K, V> implements ValueSetLink<K, V> {
     final int smearedValueHash;
 
-    @Nullable ValueEntry<K, V> nextInValueBucket;
+    @CheckForNull ValueEntry<K, V> nextInValueBucket;
+    /*
+     * The *InValueSet and *InMultimap fields below are null after construction, but we almost
+     * always call succeedsIn*() to initialize them immediately thereafter.
+     *
+     * The exception is the *InValueSet fields of multimapHeaderEntry, which are never set. (That
+     * works out fine as long as we continue to be careful not to try delete them or iterate past
+     * them.)
+     *
+     * We could consider "lying" and omitting @CheckNotNull from all these fields. Normally, I'm not
+     * a fan of that: What if we someday implement (presumably to be enabled during tests only)
+     * bytecode rewriting that checks for any null value that passes through an API with a
+     * known-non-null type? But that particular problem might not arise here, since we're not
+     * actually reading from the fields in any case in which they might be null (as proven by the
+     * requireNonNull checks below). Plus, we're *already* lying here, since newHeader passes a null
+     * key and value, which we pass to the superconstructor, even though the key and value type for
+     * a given entry might not include null. The right fix for the header problems is probably to
+     * define a separate MultimapLink interface with a separate "header" implementation, which
+     * hopefully could avoid implementing Entry or ValueSetLink at all. (But note that that approach
+     * requires us to define extra classes -- unfortunate under Android.) *Then* we could consider
+     * lying about the fields below on the grounds that we always initialize them just after the
+     * constructor -- an example of the kind of lying that our hypotheticaly bytecode rewriter would
+     * already have to deal with, thanks to DI frameworks that perform field and method injection,
+     * frameworks like Android that define post-construct hooks like Activity.onCreate, etc.
+     */
 
-    @Nullable ValueSetLink<K, V> predecessorInValueSet;
-    @Nullable ValueSetLink<K, V> successorInValueSet;
+    @CheckForNull ValueSetLink<K, V> predecessorInValueSet;
+    @CheckForNull ValueSetLink<K, V> successorInValueSet;
 
-    @Nullable ValueEntry<K, V> predecessorInMultimap;
-    @Nullable ValueEntry<K, V> successorInMultimap;
+    @CheckForNull ValueEntry<K, V> predecessorInMultimap;
+    @CheckForNull ValueEntry<K, V> successorInMultimap;
 
     ValueEntry(
-        @Nullable K key,
-        @Nullable V value,
+        @ParametricNullness K key,
+        @ParametricNullness V value,
         int smearedValueHash,
-        @Nullable ValueEntry<K, V> nextInValueBucket) {
+        @CheckForNull ValueEntry<K, V> nextInValueBucket) {
       super(key, value);
       this.smearedValueHash = smearedValueHash;
       this.nextInValueBucket = nextInValueBucket;
     }
 
-    boolean matchesValue(@Nullable Object v, int smearedVHash) {
+    @SuppressWarnings("nullness") // see the comment on the class fields, especially about newHeader
+    static <K extends @Nullable Object, V extends @Nullable Object> ValueEntry<K, V> newHeader() {
+      return new ValueEntry<>(null, null, 0, null);
+    }
+
+    boolean matchesValue(@CheckForNull Object v, int smearedVHash) {
       return smearedValueHash == smearedVHash && Objects.equal(getValue(), v);
     }
 
     @Override
     public ValueSetLink<K, V> getPredecessorInValueSet() {
-      return predecessorInValueSet;
+      return requireNonNull(predecessorInValueSet); // see the comment on the class fields
     }
 
     @Override
     public ValueSetLink<K, V> getSuccessorInValueSet() {
-      return successorInValueSet;
+      return requireNonNull(successorInValueSet); // see the comment on the class fields
     }
 
     @Override
@@ -196,11 +239,11 @@
     }
 
     public ValueEntry<K, V> getPredecessorInMultimap() {
-      return predecessorInMultimap;
+      return requireNonNull(predecessorInMultimap); // see the comment on the class fields
     }
 
     public ValueEntry<K, V> getSuccessorInMultimap() {
-      return successorInMultimap;
+      return requireNonNull(successorInMultimap); // see the comment on the class fields
     }
 
     public void setSuccessorInMultimap(ValueEntry<K, V> multimapSuccessor) {
@@ -224,7 +267,7 @@
     checkNonnegative(valueSetCapacity, "expectedValuesPerKey");
 
     this.valueSetCapacity = valueSetCapacity;
-    this.multimapHeaderEntry = new ValueEntry<>(null, null, 0, null);
+    this.multimapHeaderEntry = ValueEntry.newHeader();
     succeedsInMultimap(multimapHeaderEntry, multimapHeaderEntry);
   }
 
@@ -250,7 +293,7 @@
    * @return a new decorated set containing a collection of values for one key
    */
   @Override
-  Collection<V> createCollection(K key) {
+  Collection<V> createCollection(@ParametricNullness K key) {
     return new ValueSet(key, valueSetCapacity);
   }
 
@@ -263,7 +306,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public Set<V> replaceValues(@Nullable K key, Iterable<? extends V> values) {
+  public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     return super.replaceValues(key, values);
   }
 
@@ -318,8 +361,8 @@
      * consumption.
      */
 
-    private final K key;
-    @VisibleForTesting ValueEntry<K, V>[] hashTable;
+    @ParametricNullness private final K key;
+    @VisibleForTesting @Nullable ValueEntry<K, V>[] hashTable;
     private int size = 0;
     private int modCount = 0;
 
@@ -328,15 +371,16 @@
     private ValueSetLink<K, V> firstEntry;
     private ValueSetLink<K, V> lastEntry;
 
-    ValueSet(K key, int expectedValues) {
+    ValueSet(@ParametricNullness K key, int expectedValues) {
       this.key = key;
       this.firstEntry = this;
       this.lastEntry = this;
       // Round expected values up to a power of 2 to get the table size.
       int tableSize = Hashing.closedTableSize(expectedValues, VALUE_SET_LOAD_FACTOR);
 
-      @SuppressWarnings("unchecked")
-      ValueEntry<K, V>[] hashTable = new ValueEntry[tableSize];
+      @SuppressWarnings({"rawtypes", "unchecked"})
+      @Nullable
+      ValueEntry<K, V>[] hashTable = new @Nullable ValueEntry[tableSize];
       this.hashTable = hashTable;
     }
 
@@ -368,7 +412,7 @@
     public Iterator<V> iterator() {
       return new Iterator<V>() {
         ValueSetLink<K, V> nextEntry = firstEntry;
-        @Nullable ValueEntry<K, V> toRemove;
+        @CheckForNull ValueEntry<K, V> toRemove;
         int expectedModCount = modCount;
 
         private void checkForComodification() {
@@ -384,6 +428,7 @@
         }
 
         @Override
+        @ParametricNullness
         public V next() {
           if (!hasNext()) {
             throw new NoSuchElementException();
@@ -398,7 +443,7 @@
         @Override
         public void remove() {
           checkForComodification();
-          checkRemove(toRemove != null);
+          checkState(toRemove != null, "no calls to next() since the last call to remove()");
           ValueSet.this.remove(toRemove.getValue());
           expectedModCount = modCount;
           toRemove = null;
@@ -422,7 +467,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object o) {
+    public boolean contains(@CheckForNull Object o) {
       int smearedHash = Hashing.smearedHash(o);
       for (ValueEntry<K, V> entry = hashTable[smearedHash & mask()];
           entry != null;
@@ -435,7 +480,7 @@
     }
 
     @Override
-    public boolean add(@Nullable V value) {
+    public boolean add(@ParametricNullness V value) {
       int smearedHash = Hashing.smearedHash(value);
       int bucket = smearedHash & mask();
       ValueEntry<K, V> rowHead = hashTable[bucket];
@@ -476,7 +521,7 @@
 
     @CanIgnoreReturnValue
     @Override
-    public boolean remove(@Nullable Object o) {
+    public boolean remove(@CheckForNull Object o) {
       int smearedHash = Hashing.smearedHash(o);
       int bucket = smearedHash & mask();
       ValueEntry<K, V> prev = null;
@@ -518,8 +563,8 @@
   @Override
   Iterator<Entry<K, V>> entryIterator() {
     return new Iterator<Entry<K, V>>() {
-      ValueEntry<K, V> nextEntry = multimapHeaderEntry.successorInMultimap;
-      @Nullable ValueEntry<K, V> toRemove;
+      ValueEntry<K, V> nextEntry = multimapHeaderEntry.getSuccessorInMultimap();
+      @CheckForNull ValueEntry<K, V> toRemove;
 
       @Override
       public boolean hasNext() {
@@ -533,13 +578,13 @@
         }
         ValueEntry<K, V> result = nextEntry;
         toRemove = result;
-        nextEntry = nextEntry.successorInMultimap;
+        nextEntry = nextEntry.getSuccessorInMultimap();
         return result;
       }
 
       @Override
       public void remove() {
-        checkRemove(toRemove != null);
+        checkState(toRemove != null, "no calls to next() since the last call to remove()");
         LinkedHashMultimap.this.remove(toRemove.getKey(), toRemove.getValue());
         toRemove = null;
       }
@@ -588,7 +633,7 @@
   @GwtIncompatible // java.io.ObjectInputStream
   private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
     stream.defaultReadObject();
-    multimapHeaderEntry = new ValueEntry<>(null, null, 0, null);
+    multimapHeaderEntry = ValueEntry.newHeader();
     succeedsInMultimap(multimapHeaderEntry, multimapHeaderEntry);
     valueSetCapacity = DEFAULT_VALUE_SET_CAPACITY;
     int distinctKeys = stream.readInt();
@@ -604,7 +649,11 @@
       K key = (K) stream.readObject();
       @SuppressWarnings("unchecked")
       V value = (V) stream.readObject();
-      map.get(key).add(value);
+      /*
+       * requireNonNull is safe for a properly serialized multimap: We've already inserted a
+       * collection for each key that we expect.
+       */
+      requireNonNull(map.get(key)).add(value);
     }
     setMap(map);
   }
diff --git a/guava/src/com/google/common/collect/LinkedHashMultiset.java b/guava/src/com/google/common/collect/LinkedHashMultiset.java
index 87c2ad2..13f70a7 100644
--- a/guava/src/com/google/common/collect/LinkedHashMultiset.java
+++ b/guava/src/com/google/common/collect/LinkedHashMultiset.java
@@ -22,6 +22,7 @@
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.util.LinkedHashMap;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@code Multiset} implementation with predictable iteration order. Its iterator orders elements
@@ -39,10 +40,12 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public final class LinkedHashMultiset<E> extends AbstractMapBasedMultiset<E> {
+@ElementTypesAreNonnullByDefault
+public final class LinkedHashMultiset<E extends @Nullable Object>
+    extends AbstractMapBasedMultiset<E> {
 
   /** Creates a new, empty {@code LinkedHashMultiset} using the default initial capacity. */
-  public static <E> LinkedHashMultiset<E> create() {
+  public static <E extends @Nullable Object> LinkedHashMultiset<E> create() {
     return new LinkedHashMultiset<E>();
   }
 
@@ -53,7 +56,7 @@
    * @param distinctElements the expected number of distinct elements
    * @throws IllegalArgumentException if {@code distinctElements} is negative
    */
-  public static <E> LinkedHashMultiset<E> create(int distinctElements) {
+  public static <E extends @Nullable Object> LinkedHashMultiset<E> create(int distinctElements) {
     return new LinkedHashMultiset<E>(distinctElements);
   }
 
@@ -64,7 +67,8 @@
    *
    * @param elements the elements that the multiset should contain
    */
-  public static <E> LinkedHashMultiset<E> create(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> LinkedHashMultiset<E> create(
+      Iterable<? extends E> elements) {
     LinkedHashMultiset<E> multiset = create(Multisets.inferDistinctElements(elements));
     Iterables.addAll(multiset, elements);
     return multiset;
diff --git a/guava/src/com/google/common/collect/LinkedListMultimap.java b/guava/src/com/google/common/collect/LinkedListMultimap.java
index b93a9a3..a557870 100644
--- a/guava/src/com/google/common/collect/LinkedListMultimap.java
+++ b/guava/src/com/google/common/collect/LinkedListMultimap.java
@@ -19,8 +19,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndex;
 import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
 import static java.util.Collections.unmodifiableList;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -41,6 +41,7 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.function.Consumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -96,8 +97,9 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public class LinkedListMultimap<K, V> extends AbstractMultimap<K, V>
-    implements ListMultimap<K, V>, Serializable {
+@ElementTypesAreNonnullByDefault
+public class LinkedListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractMultimap<K, V> implements ListMultimap<K, V>, Serializable {
   /*
    * Order is maintained using a linked list containing all key-value pairs. In
    * addition, a series of disjoint linked lists of "siblings", each containing
@@ -105,38 +107,42 @@
    * ValueForKeyIterator} in constant time.
    */
 
-  private static final class Node<K, V> extends AbstractMapEntry<K, V> {
-    final @Nullable K key;
-    @Nullable V value;
-    @Nullable Node<K, V> next; // the next node (with any key)
-    @Nullable Node<K, V> previous; // the previous node (with any key)
-    @Nullable Node<K, V> nextSibling; // the next node with the same key
-    @Nullable Node<K, V> previousSibling; // the previous node with the same key
+  private static final class Node<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMapEntry<K, V> {
+    @ParametricNullness final K key;
+    @ParametricNullness V value;
+    @CheckForNull Node<K, V> next; // the next node (with any key)
+    @CheckForNull Node<K, V> previous; // the previous node (with any key)
+    @CheckForNull Node<K, V> nextSibling; // the next node with the same key
+    @CheckForNull Node<K, V> previousSibling; // the previous node with the same key
 
-    Node(@Nullable K key, @Nullable V value) {
+    Node(@ParametricNullness K key, @ParametricNullness V value) {
       this.key = key;
       this.value = value;
     }
 
     @Override
+    @ParametricNullness
     public K getKey() {
       return key;
     }
 
     @Override
+    @ParametricNullness
     public V getValue() {
       return value;
     }
 
     @Override
-    public V setValue(@Nullable V newValue) {
+    @ParametricNullness
+    public V setValue(@ParametricNullness V newValue) {
       V result = value;
       this.value = newValue;
       return result;
     }
   }
 
-  private static class KeyList<K, V> {
+  private static class KeyList<K extends @Nullable Object, V extends @Nullable Object> {
     Node<K, V> head;
     Node<K, V> tail;
     int count;
@@ -150,8 +156,8 @@
     }
   }
 
-  private transient @Nullable Node<K, V> head; // the head for all keys
-  private transient @Nullable Node<K, V> tail; // the tail for all keys
+  @CheckForNull private transient Node<K, V> head; // the head for all keys
+  @CheckForNull private transient Node<K, V> tail; // the tail for all keys
   private transient Map<K, KeyList<K, V>> keyToKeyList;
   private transient int size;
 
@@ -163,7 +169,8 @@
   private transient int modCount;
 
   /** Creates a new, empty {@code LinkedListMultimap} with the default initial capacity. */
-  public static <K, V> LinkedListMultimap<K, V> create() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedListMultimap<K, V> create() {
     return new LinkedListMultimap<>();
   }
 
@@ -174,7 +181,8 @@
    * @param expectedKeys the expected number of distinct keys
    * @throws IllegalArgumentException if {@code expectedKeys} is negative
    */
-  public static <K, V> LinkedListMultimap<K, V> create(int expectedKeys) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedListMultimap<K, V> create(int expectedKeys) {
     return new LinkedListMultimap<>(expectedKeys);
   }
 
@@ -185,8 +193,8 @@
    *
    * @param multimap the multimap whose contents are copied to this multimap
    */
-  public static <K, V> LinkedListMultimap<K, V> create(
-      Multimap<? extends K, ? extends V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedListMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
     return new LinkedListMultimap<>(multimap);
   }
 
@@ -209,14 +217,18 @@
    * is specified, it MUST be for an node for the same {@code key}!
    */
   @CanIgnoreReturnValue
-  private Node<K, V> addNode(@Nullable K key, @Nullable V value, @Nullable Node<K, V> nextSibling) {
+  private Node<K, V> addNode(
+      @ParametricNullness K key,
+      @ParametricNullness V value,
+      @CheckForNull Node<K, V> nextSibling) {
     Node<K, V> node = new Node<>(key, value);
     if (head == null) { // empty list
       head = tail = node;
       keyToKeyList.put(key, new KeyList<K, V>(node));
       modCount++;
     } else if (nextSibling == null) { // non-empty list, add to tail
-      tail.next = node;
+      // requireNonNull is safe because the list is non-empty.
+      requireNonNull(tail).next = node;
       node.previous = tail;
       tail = node;
       KeyList<K, V> keyList = keyToKeyList.get(key);
@@ -231,14 +243,19 @@
         keyList.tail = node;
       }
     } else { // non-empty list, insert before nextSibling
-      KeyList<K, V> keyList = keyToKeyList.get(key);
+      /*
+       * requireNonNull is safe as long as callers pass a nextSibling that (a) has the same key and
+       * (b) is present in the multimap. (And they do, except maybe in case of concurrent
+       * modification, in which case all bets are off.)
+       */
+      KeyList<K, V> keyList = requireNonNull(keyToKeyList.get(key));
       keyList.count++;
       node.previous = nextSibling.previous;
       node.previousSibling = nextSibling.previousSibling;
       node.next = nextSibling;
       node.nextSibling = nextSibling;
       if (nextSibling.previousSibling == null) { // nextSibling was key head
-        keyToKeyList.get(key).head = node;
+        keyList.head = node;
       } else {
         nextSibling.previousSibling.nextSibling = node;
       }
@@ -270,21 +287,29 @@
       tail = node.previous;
     }
     if (node.previousSibling == null && node.nextSibling == null) {
-      KeyList<K, V> keyList = keyToKeyList.remove(node.key);
+      /*
+       * requireNonNull is safe as long as we call removeNode only for nodes that are still in the
+       * Multimap. This should be the case (except in case of concurrent modification, when all bets
+       * are off).
+       */
+      KeyList<K, V> keyList = requireNonNull(keyToKeyList.remove(node.key));
       keyList.count = 0;
       modCount++;
     } else {
-      KeyList<K, V> keyList = keyToKeyList.get(node.key);
+      // requireNonNull is safe (under the conditions listed in the comment in the branch above).
+      KeyList<K, V> keyList = requireNonNull(keyToKeyList.get(node.key));
       keyList.count--;
 
       if (node.previousSibling == null) {
-        keyList.head = node.nextSibling;
+        // requireNonNull is safe because we checked that not *both* siblings were null.
+        keyList.head = requireNonNull(node.nextSibling);
       } else {
         node.previousSibling.nextSibling = node.nextSibling;
       }
 
       if (node.nextSibling == null) {
-        keyList.tail = node.previousSibling;
+        // requireNonNull is safe because we checked that not *both* siblings were null.
+        keyList.tail = requireNonNull(node.previousSibling);
       } else {
         node.nextSibling.previousSibling = node.previousSibling;
       }
@@ -293,23 +318,16 @@
   }
 
   /** Removes all nodes for the specified key. */
-  private void removeAllNodes(@Nullable Object key) {
+  private void removeAllNodes(@ParametricNullness K key) {
     Iterators.clear(new ValueForKeyIterator(key));
   }
 
-  /** Helper method for verifying that an iterator element is present. */
-  private static void checkElement(@Nullable Object node) {
-    if (node == null) {
-      throw new NoSuchElementException();
-    }
-  }
-
   /** An {@code Iterator} over all nodes. */
   private class NodeIterator implements ListIterator<Entry<K, V>> {
     int nextIndex;
-    @Nullable Node<K, V> next;
-    @Nullable Node<K, V> current;
-    @Nullable Node<K, V> previous;
+    @CheckForNull Node<K, V> next;
+    @CheckForNull Node<K, V> current;
+    @CheckForNull Node<K, V> previous;
     int expectedModCount = modCount;
 
     NodeIterator(int index) {
@@ -346,7 +364,9 @@
     @Override
     public Node<K, V> next() {
       checkForConcurrentModification();
-      checkElement(next);
+      if (next == null) {
+        throw new NoSuchElementException();
+      }
       previous = current = next;
       next = next.next;
       nextIndex++;
@@ -356,7 +376,7 @@
     @Override
     public void remove() {
       checkForConcurrentModification();
-      checkRemove(current != null);
+      checkState(current != null, "no calls to next() since the last call to remove()");
       if (current != next) { // after call to next()
         previous = current.previous;
         nextIndex--;
@@ -378,7 +398,9 @@
     @Override
     public Node<K, V> previous() {
       checkForConcurrentModification();
-      checkElement(previous);
+      if (previous == null) {
+        throw new NoSuchElementException();
+      }
       next = current = previous;
       previous = previous.previous;
       nextIndex--;
@@ -405,7 +427,7 @@
       throw new UnsupportedOperationException();
     }
 
-    void setValue(V value) {
+    void setValue(@ParametricNullness V value) {
       checkState(current != null);
       current.value = value;
     }
@@ -414,8 +436,8 @@
   /** An {@code Iterator} over distinct keys in key head order. */
   private class DistinctKeyIterator implements Iterator<K> {
     final Set<K> seenKeys = Sets.<K>newHashSetWithExpectedSize(keySet().size());
-    Node<K, V> next = head;
-    @Nullable Node<K, V> current;
+    @CheckForNull Node<K, V> next = head;
+    @CheckForNull Node<K, V> current;
     int expectedModCount = modCount;
 
     private void checkForConcurrentModification() {
@@ -431,9 +453,12 @@
     }
 
     @Override
+    @ParametricNullness
     public K next() {
       checkForConcurrentModification();
-      checkElement(next);
+      if (next == null) {
+        throw new NoSuchElementException();
+      }
       current = next;
       seenKeys.add(current.key);
       do { // skip ahead to next unseen key
@@ -445,7 +470,7 @@
     @Override
     public void remove() {
       checkForConcurrentModification();
-      checkRemove(current != null);
+      checkState(current != null, "no calls to next() since the last call to remove()");
       removeAllNodes(current.key);
       current = null;
       expectedModCount = modCount;
@@ -454,14 +479,14 @@
 
   /** A {@code ListIterator} over values for a specified key. */
   private class ValueForKeyIterator implements ListIterator<V> {
-    final @Nullable Object key;
+    @ParametricNullness final K key;
     int nextIndex;
-    @Nullable Node<K, V> next;
-    @Nullable Node<K, V> current;
-    @Nullable Node<K, V> previous;
+    @CheckForNull Node<K, V> next;
+    @CheckForNull Node<K, V> current;
+    @CheckForNull Node<K, V> previous;
 
     /** Constructs a new iterator over all values for the specified key. */
-    ValueForKeyIterator(@Nullable Object key) {
+    ValueForKeyIterator(@ParametricNullness K key) {
       this.key = key;
       KeyList<K, V> keyList = keyToKeyList.get(key);
       next = (keyList == null) ? null : keyList.head;
@@ -475,7 +500,7 @@
      *
      * @throws IndexOutOfBoundsException if index is invalid
      */
-    public ValueForKeyIterator(@Nullable Object key, int index) {
+    public ValueForKeyIterator(@ParametricNullness K key, int index) {
       KeyList<K, V> keyList = keyToKeyList.get(key);
       int size = (keyList == null) ? 0 : keyList.count;
       checkPositionIndex(index, size);
@@ -502,8 +527,11 @@
 
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public V next() {
-      checkElement(next);
+      if (next == null) {
+        throw new NoSuchElementException();
+      }
       previous = current = next;
       next = next.nextSibling;
       nextIndex++;
@@ -517,8 +545,11 @@
 
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public V previous() {
-      checkElement(previous);
+      if (previous == null) {
+        throw new NoSuchElementException();
+      }
       next = current = previous;
       previous = previous.previousSibling;
       nextIndex--;
@@ -537,7 +568,7 @@
 
     @Override
     public void remove() {
-      checkRemove(current != null);
+      checkState(current != null, "no calls to next() since the last call to remove()");
       if (current != next) { // after call to next()
         previous = current.previousSibling;
         nextIndex--;
@@ -549,15 +580,14 @@
     }
 
     @Override
-    public void set(V value) {
+    public void set(@ParametricNullness V value) {
       checkState(current != null);
       current.value = value;
     }
 
     @Override
-    @SuppressWarnings("unchecked")
-    public void add(V value) {
-      previous = addNode((K) key, value, next);
+    public void add(@ParametricNullness V value) {
+      previous = addNode(key, value, next);
       nextIndex++;
       current = null;
     }
@@ -576,12 +606,12 @@
   }
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return keyToKeyList.containsKey(key);
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return values().contains(value);
   }
 
@@ -596,7 +626,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public boolean put(@Nullable K key, @Nullable V value) {
+  public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
     addNode(key, value, null);
     return true;
   }
@@ -613,7 +643,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  public List<V> replaceValues(@Nullable K key, Iterable<? extends V> values) {
+  public List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
     List<V> oldValues = getCopy(key);
     ListIterator<V> keyValues = new ValueForKeyIterator(key);
     Iterator<? extends V> newValues = values.iterator();
@@ -638,7 +668,7 @@
     return oldValues;
   }
 
-  private List<V> getCopy(@Nullable Object key) {
+  private List<V> getCopy(@ParametricNullness K key) {
     return unmodifiableList(Lists.newArrayList(new ValueForKeyIterator(key)));
   }
 
@@ -650,8 +680,15 @@
   @CanIgnoreReturnValue
   @Override
   public List<V> removeAll(@Nullable Object key) {
-    List<V> oldValues = getCopy(key);
-    removeAllNodes(key);
+    /*
+     * Safe because all we do is remove values for the key, not add them. (If we wanted to make sure
+     * to call getCopy and removeAllNodes only with a true K, then we could check containsKey first.
+     * But that check wouldn't eliminate the warnings.)
+     */
+    @SuppressWarnings({"unchecked", "nullness"})
+    K castKey = (K) key;
+    List<V> oldValues = getCopy(castKey);
+    removeAllNodes(castKey);
     return oldValues;
   }
 
@@ -676,7 +713,7 @@
    * <p>The returned list is not serializable and does not have random access.
    */
   @Override
-  public List<V> get(final @Nullable K key) {
+  public List<V> get(@ParametricNullness final K key) {
     return new AbstractSequentialList<V>() {
       @Override
       public int size() {
@@ -706,12 +743,12 @@
       }
 
       @Override
-      public boolean contains(Object key) { // for performance
+      public boolean contains(@CheckForNull Object key) { // for performance
         return containsKey(key);
       }
 
       @Override
-      public boolean remove(Object o) { // for performance
+      public boolean remove(@CheckForNull Object o) { // for performance
         return !LinkedListMultimap.this.removeAll(o).isEmpty();
       }
     }
@@ -750,12 +787,13 @@
         final NodeIterator nodeItr = new NodeIterator(index);
         return new TransformedListIterator<Entry<K, V>, V>(nodeItr) {
           @Override
+          @ParametricNullness
           V transform(Entry<K, V> entry) {
             return entry.getValue();
           }
 
           @Override
-          public void set(V value) {
+          public void set(@ParametricNullness V value) {
             nodeItr.setValue(value);
           }
         };
diff --git a/guava/src/com/google/common/collect/ListMultimap.java b/guava/src/com/google/common/collect/ListMultimap.java
index 967c9a0..1686068 100644
--- a/guava/src/com/google/common/collect/ListMultimap.java
+++ b/guava/src/com/google/common/collect/ListMultimap.java
@@ -21,6 +21,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -40,7 +41,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public interface ListMultimap<K, V> extends Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface ListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends Multimap<K, V> {
   /**
    * {@inheritDoc}
    *
@@ -49,7 +52,7 @@
    * the {@link Multimap} interface.
    */
   @Override
-  List<V> get(@Nullable K key);
+  List<V> get(@ParametricNullness K key);
 
   /**
    * {@inheritDoc}
@@ -60,7 +63,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  List<V> removeAll(@Nullable Object key);
+  List<V> removeAll(@CheckForNull Object key);
 
   /**
    * {@inheritDoc}
@@ -71,7 +74,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  List<V> replaceValues(K key, Iterable<? extends V> values);
+  List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values);
 
   /**
    * {@inheritDoc}
@@ -93,5 +96,5 @@
    * empty {@code SetMultimap}.
    */
   @Override
-  boolean equals(@Nullable Object obj);
+  boolean equals(@CheckForNull Object obj);
 }
diff --git a/guava/src/com/google/common/collect/Lists.java b/guava/src/com/google/common/collect/Lists.java
index 3882493..31d6e2a 100644
--- a/guava/src/com/google/common/collect/Lists.java
+++ b/guava/src/com/google/common/collect/Lists.java
@@ -49,6 +49,7 @@
 import java.util.RandomAccess;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.Predicate;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -64,6 +65,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Lists {
   private Lists() {}
 
@@ -79,7 +81,7 @@
    * directly, taking advantage of the new <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayList() {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayList() {
     return new ArrayList<>();
   }
 
@@ -99,7 +101,7 @@
    */
   @SafeVarargs
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayList(E... elements) {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayList(E... elements) {
     checkNotNull(elements); // for GWT
     // Avoid integer overflow when a large array is passed in
     int capacity = computeArrayListCapacity(elements.length);
@@ -122,7 +124,8 @@
    * syntax</a>.
    */
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayList(
+      Iterable<? extends E> elements) {
     checkNotNull(elements); // for GWT
     // Let ArrayList's sizing logic work, if possible
     return (elements instanceof Collection)
@@ -138,7 +141,8 @@
    * ImmutableList#copyOf(Iterator)} instead.
    */
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayList(Iterator<? extends E> elements) {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayList(
+      Iterator<? extends E> elements) {
     ArrayList<E> list = newArrayList();
     Iterators.addAll(list, elements);
     return list;
@@ -169,7 +173,8 @@
    * @throws IllegalArgumentException if {@code initialArraySize} is negative
    */
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayListWithCapacity(int initialArraySize) {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayListWithCapacity(
+      int initialArraySize) {
     checkNonnegative(initialArraySize, "initialArraySize"); // for GWT.
     return new ArrayList<>(initialArraySize);
   }
@@ -188,7 +193,8 @@
    * @throws IllegalArgumentException if {@code estimatedSize} is negative
    */
   @GwtCompatible(serializable = true)
-  public static <E> ArrayList<E> newArrayListWithExpectedSize(int estimatedSize) {
+  public static <E extends @Nullable Object> ArrayList<E> newArrayListWithExpectedSize(
+      int estimatedSize) {
     return new ArrayList<>(computeArrayListCapacity(estimatedSize));
   }
 
@@ -210,7 +216,7 @@
    * syntax</a>.
    */
   @GwtCompatible(serializable = true)
-  public static <E> LinkedList<E> newLinkedList() {
+  public static <E extends @Nullable Object> LinkedList<E> newLinkedList() {
     return new LinkedList<>();
   }
 
@@ -232,7 +238,8 @@
    * syntax</a>.
    */
   @GwtCompatible(serializable = true)
-  public static <E> LinkedList<E> newLinkedList(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> LinkedList<E> newLinkedList(
+      Iterable<? extends E> elements) {
     LinkedList<E> list = newLinkedList();
     Iterables.addAll(list, elements);
     return list;
@@ -248,7 +255,7 @@
    * @since 12.0
    */
   @GwtIncompatible // CopyOnWriteArrayList
-  public static <E> CopyOnWriteArrayList<E> newCopyOnWriteArrayList() {
+  public static <E extends @Nullable Object> CopyOnWriteArrayList<E> newCopyOnWriteArrayList() {
     return new CopyOnWriteArrayList<>();
   }
 
@@ -260,7 +267,7 @@
    * @since 12.0
    */
   @GwtIncompatible // CopyOnWriteArrayList
-  public static <E> CopyOnWriteArrayList<E> newCopyOnWriteArrayList(
+  public static <E extends @Nullable Object> CopyOnWriteArrayList<E> newCopyOnWriteArrayList(
       Iterable<? extends E> elements) {
     // We copy elements to an ArrayList first, rather than incurring the
     // quadratic cost of adding them to the COWAL directly.
@@ -285,7 +292,7 @@
    * @param rest an array of additional elements, possibly empty
    * @return an unmodifiable list containing the specified elements
    */
-  public static <E> List<E> asList(@Nullable E first, E[] rest) {
+  public static <E extends @Nullable Object> List<E> asList(@ParametricNullness E first, E[] rest) {
     return new OnePlusArrayList<>(first, rest);
   }
 
@@ -305,17 +312,18 @@
    * @param rest an array of additional elements, possibly empty
    * @return an unmodifiable list containing the specified elements
    */
-  public static <E> List<E> asList(@Nullable E first, @Nullable E second, E[] rest) {
+  public static <E extends @Nullable Object> List<E> asList(
+      @ParametricNullness E first, @ParametricNullness E second, E[] rest) {
     return new TwoPlusArrayList<>(first, second, rest);
   }
 
   /** @see Lists#asList(Object, Object[]) */
-  private static class OnePlusArrayList<E> extends AbstractList<E>
+  private static class OnePlusArrayList<E extends @Nullable Object> extends AbstractList<E>
       implements Serializable, RandomAccess {
-    final @Nullable E first;
+    @ParametricNullness final E first;
     final E[] rest;
 
-    OnePlusArrayList(@Nullable E first, E[] rest) {
+    OnePlusArrayList(@ParametricNullness E first, E[] rest) {
       this.first = first;
       this.rest = checkNotNull(rest);
     }
@@ -326,6 +334,7 @@
     }
 
     @Override
+    @ParametricNullness
     public E get(int index) {
       // check explicitly so the IOOBE will have the right message
       checkElementIndex(index, size());
@@ -336,13 +345,13 @@
   }
 
   /** @see Lists#asList(Object, Object, Object[]) */
-  private static class TwoPlusArrayList<E> extends AbstractList<E>
+  private static class TwoPlusArrayList<E extends @Nullable Object> extends AbstractList<E>
       implements Serializable, RandomAccess {
-    final @Nullable E first;
-    final @Nullable E second;
+    @ParametricNullness final E first;
+    @ParametricNullness final E second;
     final E[] rest;
 
-    TwoPlusArrayList(@Nullable E first, @Nullable E second, E[] rest) {
+    TwoPlusArrayList(@ParametricNullness E first, @ParametricNullness E second, E[] rest) {
       this.first = first;
       this.second = second;
       this.rest = checkNotNull(rest);
@@ -354,6 +363,7 @@
     }
 
     @Override
+    @ParametricNullness
     public E get(int index) {
       switch (index) {
         case 0:
@@ -519,7 +529,7 @@
    * java.util.stream.Stream#map}. This method is not being deprecated, but we gently encourage you
    * to migrate to streams.
    */
-  public static <F, T> List<T> transform(
+  public static <F extends @Nullable Object, T extends @Nullable Object> List<T> transform(
       List<F> fromList, Function<? super F, ? extends T> function) {
     return (fromList instanceof RandomAccess)
         ? new TransformingRandomAccessList<>(fromList, function)
@@ -531,8 +541,9 @@
    *
    * @see Lists#transform
    */
-  private static class TransformingSequentialList<F, T> extends AbstractSequentialList<T>
-      implements Serializable {
+  private static class TransformingSequentialList<
+          F extends @Nullable Object, T extends @Nullable Object>
+      extends AbstractSequentialList<T> implements Serializable {
     final List<F> fromList;
     final Function<? super F, ? extends T> function;
 
@@ -559,7 +570,8 @@
     public ListIterator<T> listIterator(final int index) {
       return new TransformedListIterator<F, T>(fromList.listIterator(index)) {
         @Override
-        T transform(F from) {
+        @ParametricNullness
+        T transform(@ParametricNullness F from) {
           return function.apply(from);
         }
       };
@@ -581,8 +593,9 @@
    *
    * @see Lists#transform
    */
-  private static class TransformingRandomAccessList<F, T> extends AbstractList<T>
-      implements RandomAccess, Serializable {
+  private static class TransformingRandomAccessList<
+          F extends @Nullable Object, T extends @Nullable Object>
+      extends AbstractList<T> implements RandomAccess, Serializable {
     final List<F> fromList;
     final Function<? super F, ? extends T> function;
 
@@ -597,6 +610,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T get(int index) {
       return function.apply(fromList.get(index));
     }
@@ -628,6 +642,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T remove(int index) {
       return function.apply(fromList.remove(index));
     }
@@ -655,7 +670,7 @@
    * @return a list of consecutive sublists
    * @throws IllegalArgumentException if {@code partitionSize} is nonpositive
    */
-  public static <T> List<List<T>> partition(List<T> list, int size) {
+  public static <T extends @Nullable Object> List<List<T>> partition(List<T> list, int size) {
     checkNotNull(list);
     checkArgument(size > 0);
     return (list instanceof RandomAccess)
@@ -663,7 +678,7 @@
         : new Partition<>(list, size);
   }
 
-  private static class Partition<T> extends AbstractList<List<T>> {
+  private static class Partition<T extends @Nullable Object> extends AbstractList<List<T>> {
     final List<T> list;
     final int size;
 
@@ -691,7 +706,8 @@
     }
   }
 
-  private static class RandomAccessPartition<T> extends Partition<T> implements RandomAccess {
+  private static class RandomAccessPartition<T extends @Nullable Object> extends Partition<T>
+      implements RandomAccess {
     RandomAccessPartition(List<T> list, int size) {
       super(list, size);
     }
@@ -730,12 +746,12 @@
     }
 
     @Override
-    public int indexOf(@Nullable Object object) {
+    public int indexOf(@CheckForNull Object object) {
       return (object instanceof Character) ? string.indexOf((Character) object) : -1;
     }
 
     @Override
-    public int lastIndexOf(@Nullable Object object) {
+    public int lastIndexOf(@CheckForNull Object object) {
       return (object instanceof Character) ? string.lastIndexOf((Character) object) : -1;
     }
 
@@ -792,9 +808,13 @@
    *
    * @since 7.0
    */
-  public static <T> List<T> reverse(List<T> list) {
+  public static <T extends @Nullable Object> List<T> reverse(List<T> list) {
     if (list instanceof ImmutableList) {
-      return ((ImmutableList<T>) list).reverse();
+      // Avoid nullness warnings.
+      List<?> reversed = ((ImmutableList<?>) list).reverse();
+      @SuppressWarnings("unchecked")
+      List<T> result = (List<T>) reversed;
+      return result;
     } else if (list instanceof ReverseList) {
       return ((ReverseList<T>) list).getForwardList();
     } else if (list instanceof RandomAccess) {
@@ -804,7 +824,7 @@
     }
   }
 
-  private static class ReverseList<T> extends AbstractList<T> {
+  private static class ReverseList<T extends @Nullable Object> extends AbstractList<T> {
     private final List<T> forwardList;
 
     ReverseList(List<T> forwardList) {
@@ -828,7 +848,7 @@
     }
 
     @Override
-    public void add(int index, @Nullable T element) {
+    public void add(int index, @ParametricNullness T element) {
       forwardList.add(reversePosition(index), element);
     }
 
@@ -838,6 +858,7 @@
     }
 
     @Override
+    @ParametricNullness
     public T remove(int index) {
       return forwardList.remove(reverseIndex(index));
     }
@@ -848,11 +869,13 @@
     }
 
     @Override
-    public T set(int index, @Nullable T element) {
+    @ParametricNullness
+    public T set(int index, @ParametricNullness T element) {
       return forwardList.set(reverseIndex(index), element);
     }
 
     @Override
+    @ParametricNullness
     public T get(int index) {
       return forwardList.get(reverseIndex(index));
     }
@@ -882,7 +905,7 @@
         boolean canRemoveOrSet;
 
         @Override
-        public void add(T e) {
+        public void add(@ParametricNullness T e) {
           forwardIterator.add(e);
           forwardIterator.previous();
           canRemoveOrSet = false;
@@ -899,6 +922,7 @@
         }
 
         @Override
+        @ParametricNullness
         public T next() {
           if (!hasNext()) {
             throw new NoSuchElementException();
@@ -913,6 +937,7 @@
         }
 
         @Override
+        @ParametricNullness
         public T previous() {
           if (!hasPrevious()) {
             throw new NoSuchElementException();
@@ -934,7 +959,7 @@
         }
 
         @Override
-        public void set(T e) {
+        public void set(@ParametricNullness T e) {
           checkState(canRemoveOrSet);
           forwardIterator.set(e);
         }
@@ -942,7 +967,8 @@
     }
   }
 
-  private static class RandomAccessReverseList<T> extends ReverseList<T> implements RandomAccess {
+  private static class RandomAccessReverseList<T extends @Nullable Object> extends ReverseList<T>
+      implements RandomAccess {
     RandomAccessReverseList(List<T> forwardList) {
       super(forwardList);
     }
@@ -962,7 +988,7 @@
   }
 
   /** An implementation of {@link List#equals(Object)}. */
-  static boolean equalsImpl(List<?> thisList, @Nullable Object other) {
+  static boolean equalsImpl(List<?> thisList, @CheckForNull Object other) {
     if (other == checkNotNull(thisList)) {
       return true;
     }
@@ -988,7 +1014,8 @@
   }
 
   /** An implementation of {@link List#addAll(int, Collection)}. */
-  static <E> boolean addAllImpl(List<E> list, int index, Iterable<? extends E> elements) {
+  static <E extends @Nullable Object> boolean addAllImpl(
+      List<E> list, int index, Iterable<? extends E> elements) {
     boolean changed = false;
     ListIterator<E> listIterator = list.listIterator(index);
     for (E e : elements) {
@@ -999,7 +1026,7 @@
   }
 
   /** An implementation of {@link List#indexOf(Object)}. */
-  static int indexOfImpl(List<?> list, @Nullable Object element) {
+  static int indexOfImpl(List<?> list, @CheckForNull Object element) {
     if (list instanceof RandomAccess) {
       return indexOfRandomAccess(list, element);
     } else {
@@ -1013,7 +1040,7 @@
     }
   }
 
-  private static int indexOfRandomAccess(List<?> list, @Nullable Object element) {
+  private static int indexOfRandomAccess(List<?> list, @CheckForNull Object element) {
     int size = list.size();
     if (element == null) {
       for (int i = 0; i < size; i++) {
@@ -1032,7 +1059,7 @@
   }
 
   /** An implementation of {@link List#lastIndexOf(Object)}. */
-  static int lastIndexOfImpl(List<?> list, @Nullable Object element) {
+  static int lastIndexOfImpl(List<?> list, @CheckForNull Object element) {
     if (list instanceof RandomAccess) {
       return lastIndexOfRandomAccess(list, element);
     } else {
@@ -1046,7 +1073,7 @@
     }
   }
 
-  private static int lastIndexOfRandomAccess(List<?> list, @Nullable Object element) {
+  private static int lastIndexOfRandomAccess(List<?> list, @CheckForNull Object element) {
     if (element == null) {
       for (int i = list.size() - 1; i >= 0; i--) {
         if (list.get(i) == null) {
@@ -1064,12 +1091,13 @@
   }
 
   /** Returns an implementation of {@link List#listIterator(int)}. */
-  static <E> ListIterator<E> listIteratorImpl(List<E> list, int index) {
+  static <E extends @Nullable Object> ListIterator<E> listIteratorImpl(List<E> list, int index) {
     return new AbstractListWrapper<>(list).listIterator(index);
   }
 
   /** An implementation of {@link List#subList(int, int)}. */
-  static <E> List<E> subListImpl(final List<E> list, int fromIndex, int toIndex) {
+  static <E extends @Nullable Object> List<E> subListImpl(
+      final List<E> list, int fromIndex, int toIndex) {
     List<E> wrapper;
     if (list instanceof RandomAccess) {
       wrapper =
@@ -1095,7 +1123,7 @@
     return wrapper.subList(fromIndex, toIndex);
   }
 
-  private static class AbstractListWrapper<E> extends AbstractList<E> {
+  private static class AbstractListWrapper<E extends @Nullable Object> extends AbstractList<E> {
     final List<E> backingList;
 
     AbstractListWrapper(List<E> backingList) {
@@ -1103,7 +1131,7 @@
     }
 
     @Override
-    public void add(int index, E element) {
+    public void add(int index, @ParametricNullness E element) {
       backingList.add(index, element);
     }
 
@@ -1113,22 +1141,25 @@
     }
 
     @Override
+    @ParametricNullness
     public E get(int index) {
       return backingList.get(index);
     }
 
     @Override
+    @ParametricNullness
     public E remove(int index) {
       return backingList.remove(index);
     }
 
     @Override
-    public E set(int index, E element) {
+    @ParametricNullness
+    public E set(int index, @ParametricNullness E element) {
       return backingList.set(index, element);
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return backingList.contains(o);
     }
 
@@ -1138,15 +1169,15 @@
     }
   }
 
-  private static class RandomAccessListWrapper<E> extends AbstractListWrapper<E>
-      implements RandomAccess {
+  private static class RandomAccessListWrapper<E extends @Nullable Object>
+      extends AbstractListWrapper<E> implements RandomAccess {
     RandomAccessListWrapper(List<E> backingList) {
       super(backingList);
     }
   }
 
   /** Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557 */
-  static <T> List<T> cast(Iterable<T> iterable) {
+  static <T extends @Nullable Object> List<T> cast(Iterable<T> iterable) {
     return (List<T>) iterable;
   }
 }
diff --git a/guava/src/com/google/common/collect/MapDifference.java b/guava/src/com/google/common/collect/MapDifference.java
index 066aebf..5000e4b 100644
--- a/guava/src/com/google/common/collect/MapDifference.java
+++ b/guava/src/com/google/common/collect/MapDifference.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -29,7 +30,8 @@
  */
 @DoNotMock("Use Maps.difference")
 @GwtCompatible
-public interface MapDifference<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface MapDifference<K extends @Nullable Object, V extends @Nullable Object> {
   /**
    * Returns {@code true} if there are no differences between the two maps; that is, if the maps are
    * equal.
@@ -67,7 +69,7 @@
    * #entriesDiffering()} of the two instances are equal.
    */
   @Override
-  boolean equals(@Nullable Object object);
+  boolean equals(@CheckForNull Object object);
 
   /**
    * Returns the hash code for this instance. This is defined as the hash code of
@@ -87,11 +89,13 @@
    * @since 2.0
    */
   @DoNotMock("Use Maps.difference")
-  interface ValueDifference<V> {
+  interface ValueDifference<V extends @Nullable Object> {
     /** Returns the value from the left map (possibly null). */
+    @ParametricNullness
     V leftValue();
 
     /** Returns the value from the right map (possibly null). */
+    @ParametricNullness
     V rightValue();
 
     /**
@@ -99,7 +103,7 @@
      * {@link #rightValue()} values are also equal.
      */
     @Override
-    boolean equals(@Nullable Object other);
+    boolean equals(@CheckForNull Object other);
 
     /**
      * The hash code equals the value {@code Arrays.asList(leftValue(), rightValue()).hashCode()}.
diff --git a/guava/src/com/google/common/collect/MapMaker.java b/guava/src/com/google/common/collect/MapMaker.java
index 1cbe4a4..a2612c1 100644
--- a/guava/src/com/google/common/collect/MapMaker.java
+++ b/guava/src/com/google/common/collect/MapMaker.java
@@ -30,7 +30,7 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A builder of {@link ConcurrentMap} instances that can have keys or values automatically wrapped
@@ -86,6 +86,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class MapMaker {
   private static final int DEFAULT_INITIAL_CAPACITY = 16;
   private static final int DEFAULT_CONCURRENCY_LEVEL = 4;
@@ -98,10 +99,10 @@
   int initialCapacity = UNSET_INT;
   int concurrencyLevel = UNSET_INT;
 
-  @Nullable Strength keyStrength;
-  @Nullable Strength valueStrength;
+  @CheckForNull Strength keyStrength;
+  @CheckForNull Strength valueStrength;
 
-  @Nullable Equivalence<Object> keyEquivalence;
+  @CheckForNull Equivalence<Object> keyEquivalence;
 
   /**
    * Constructs a new {@code MapMaker} instance with default settings, including strong keys, strong
diff --git a/guava/src/com/google/common/collect/MapMakerInternalMap.java b/guava/src/com/google/common/collect/MapMakerInternalMap.java
index b647f76..3725d97 100644
--- a/guava/src/com/google/common/collect/MapMakerInternalMap.java
+++ b/guava/src/com/google/common/collect/MapMakerInternalMap.java
@@ -65,7 +65,11 @@
  */
 // TODO(kak): Consider removing @CanIgnoreReturnValue from this class.
 @GwtIncompatible
-@SuppressWarnings("GuardedBy") // TODO(b/35466881): Fix or suppress.
+@SuppressWarnings({
+  "GuardedBy", // TODO(b/35466881): Fix or suppress.
+  "nullness", // too much trouble for the payoff
+})
+// TODO(cpovirk): Annotate for nullness.
 class MapMakerInternalMap<
         K,
         V,
diff --git a/guava/src/com/google/common/collect/Maps.java b/guava/src/com/google/common/collect/Maps.java
index 3dad657..c892557 100644
--- a/guava/src/com/google/common/collect/Maps.java
+++ b/guava/src/com/google/common/collect/Maps.java
@@ -21,6 +21,8 @@
 import static com.google.common.base.Predicates.compose;
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -68,6 +70,7 @@
 import java.util.function.BinaryOperator;
 import java.util.function.Consumer;
 import java.util.stream.Collector;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -85,46 +88,53 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Maps {
   private Maps() {}
 
-  private enum EntryFunction implements Function<Entry<?, ?>, Object> {
+  private enum EntryFunction implements Function<Entry<?, ?>, @Nullable Object> {
     KEY {
       @Override
-      public @Nullable Object apply(Entry<?, ?> entry) {
+      @CheckForNull
+      public Object apply(Entry<?, ?> entry) {
         return entry.getKey();
       }
     },
     VALUE {
       @Override
-      public @Nullable Object apply(Entry<?, ?> entry) {
+      @CheckForNull
+      public Object apply(Entry<?, ?> entry) {
         return entry.getValue();
       }
     };
   }
 
   @SuppressWarnings("unchecked")
-  static <K> Function<Entry<K, ?>, K> keyFunction() {
+  static <K extends @Nullable Object> Function<Entry<K, ?>, K> keyFunction() {
     return (Function) EntryFunction.KEY;
   }
 
   @SuppressWarnings("unchecked")
-  static <V> Function<Entry<?, V>, V> valueFunction() {
+  static <V extends @Nullable Object> Function<Entry<?, V>, V> valueFunction() {
     return (Function) EntryFunction.VALUE;
   }
 
-  static <K, V> Iterator<K> keyIterator(Iterator<Entry<K, V>> entryIterator) {
+  static <K extends @Nullable Object, V extends @Nullable Object> Iterator<K> keyIterator(
+      Iterator<Entry<K, V>> entryIterator) {
     return new TransformedIterator<Entry<K, V>, K>(entryIterator) {
       @Override
+      @ParametricNullness
       K transform(Entry<K, V> entry) {
         return entry.getKey();
       }
     };
   }
 
-  static <K, V> Iterator<V> valueIterator(Iterator<Entry<K, V>> entryIterator) {
+  static <K extends @Nullable Object, V extends @Nullable Object> Iterator<V> valueIterator(
+      Iterator<Entry<K, V>> entryIterator) {
     return new TransformedIterator<Entry<K, V>, V>(entryIterator) {
       @Override
+      @ParametricNullness
       V transform(Entry<K, V> entry) {
         return entry.getValue();
       }
@@ -171,37 +181,6 @@
     return ImmutableEnumMap.asImmutable(enumMap);
   }
 
-  private static class Accumulator<K extends Enum<K>, V> {
-    private final BinaryOperator<V> mergeFunction;
-    private EnumMap<K, V> map = null;
-
-    Accumulator(BinaryOperator<V> mergeFunction) {
-      this.mergeFunction = mergeFunction;
-    }
-
-    void put(K key, V value) {
-      if (map == null) {
-        map = new EnumMap<>(key.getDeclaringClass());
-      }
-      map.merge(key, value, mergeFunction);
-    }
-
-    Accumulator<K, V> combine(Accumulator<K, V> other) {
-      if (this.map == null) {
-        return other;
-      } else if (other.map == null) {
-        return this;
-      } else {
-        other.map.forEach(this::put);
-        return this;
-      }
-    }
-
-    ImmutableMap<K, V> toImmutableMap() {
-      return (map == null) ? ImmutableMap.<K, V>of() : ImmutableEnumMap.asImmutable(map);
-    }
-  }
-
   /**
    * Returns a {@link Collector} that accumulates elements into an {@code ImmutableMap} whose keys
    * and values are the result of applying the provided mapping functions to the input elements. The
@@ -216,25 +195,11 @@
    *
    * @since 21.0
    */
-  public static <T, K extends Enum<K>, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableEnumMap(
-      java.util.function.Function<? super T, ? extends K> keyFunction,
-      java.util.function.Function<? super T, ? extends V> valueFunction) {
-    checkNotNull(keyFunction);
-    checkNotNull(valueFunction);
-    return Collector.of(
-        () ->
-            new Accumulator<K, V>(
-                (v1, v2) -> {
-                  throw new IllegalArgumentException("Multiple values for key: " + v1 + ", " + v2);
-                }),
-        (accum, t) -> {
-          K key = checkNotNull(keyFunction.apply(t), "Null key for input %s", t);
-          V newValue = checkNotNull(valueFunction.apply(t), "Null value for input %s", t);
-          accum.put(key, newValue);
-        },
-        Accumulator::combine,
-        Accumulator::toImmutableMap,
-        Collector.Characteristics.UNORDERED);
+  public static <T extends @Nullable Object, K extends Enum<K>, V>
+      Collector<T, ?, ImmutableMap<K, V>> toImmutableEnumMap(
+          java.util.function.Function<? super T, ? extends K> keyFunction,
+          java.util.function.Function<? super T, ? extends V> valueFunction) {
+    return CollectCollectors.toImmutableEnumMap(keyFunction, valueFunction);
   }
 
   /**
@@ -248,23 +213,12 @@
    *
    * @since 21.0
    */
-  public static <T, K extends Enum<K>, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableEnumMap(
-      java.util.function.Function<? super T, ? extends K> keyFunction,
-      java.util.function.Function<? super T, ? extends V> valueFunction,
-      BinaryOperator<V> mergeFunction) {
-    checkNotNull(keyFunction);
-    checkNotNull(valueFunction);
-    checkNotNull(mergeFunction);
-    // not UNORDERED because we don't know if mergeFunction is commutative
-    return Collector.of(
-        () -> new Accumulator<K, V>(mergeFunction),
-        (accum, t) -> {
-          K key = checkNotNull(keyFunction.apply(t), "Null key for input %s", t);
-          V newValue = checkNotNull(valueFunction.apply(t), "Null value for input %s", t);
-          accum.put(key, newValue);
-        },
-        Accumulator::combine,
-        Accumulator::toImmutableMap);
+  public static <T extends @Nullable Object, K extends Enum<K>, V>
+      Collector<T, ?, ImmutableMap<K, V>> toImmutableEnumMap(
+          java.util.function.Function<? super T, ? extends K> keyFunction,
+          java.util.function.Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction) {
+    return CollectCollectors.toImmutableEnumMap(keyFunction, valueFunction, mergeFunction);
   }
 
   /**
@@ -280,7 +234,8 @@
    *
    * @return a new, empty {@code HashMap}
    */
-  public static <K, V> HashMap<K, V> newHashMap() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      HashMap<K, V> newHashMap() {
     return new HashMap<>();
   }
 
@@ -298,7 +253,8 @@
    * @param map the mappings to be placed in the new map
    * @return a new {@code HashMap} initialized with the mappings from {@code map}
    */
-  public static <K, V> HashMap<K, V> newHashMap(Map<? extends K, ? extends V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> HashMap<K, V> newHashMap(
+      Map<? extends K, ? extends V> map) {
     return new HashMap<>(map);
   }
 
@@ -313,7 +269,8 @@
    *     without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <K, V> HashMap<K, V> newHashMapWithExpectedSize(int expectedSize) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      HashMap<K, V> newHashMapWithExpectedSize(int expectedSize) {
     return new HashMap<>(capacity(expectedSize));
   }
 
@@ -346,7 +303,8 @@
    *
    * @return a new, empty {@code LinkedHashMap}
    */
-  public static <K, V> LinkedHashMap<K, V> newLinkedHashMap() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMap<K, V> newLinkedHashMap() {
     return new LinkedHashMap<>();
   }
 
@@ -363,7 +321,8 @@
    * @param map the mappings to be placed in the new map
    * @return a new, {@code LinkedHashMap} initialized with the mappings from {@code map}
    */
-  public static <K, V> LinkedHashMap<K, V> newLinkedHashMap(Map<? extends K, ? extends V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMap<K, V> newLinkedHashMap(Map<? extends K, ? extends V> map) {
     return new LinkedHashMap<>(map);
   }
 
@@ -379,7 +338,8 @@
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    * @since 19.0
    */
-  public static <K, V> LinkedHashMap<K, V> newLinkedHashMapWithExpectedSize(int expectedSize) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      LinkedHashMap<K, V> newLinkedHashMapWithExpectedSize(int expectedSize) {
     return new LinkedHashMap<>(capacity(expectedSize));
   }
 
@@ -404,7 +364,7 @@
    *
    * @return a new, empty {@code TreeMap}
    */
-  public static <K extends Comparable, V> TreeMap<K, V> newTreeMap() {
+  public static <K extends Comparable, V extends @Nullable Object> TreeMap<K, V> newTreeMap() {
     return new TreeMap<>();
   }
 
@@ -424,7 +384,8 @@
    * @return a new {@code TreeMap} initialized with the mappings from {@code map} and using the
    *     comparator of {@code map}
    */
-  public static <K, V> TreeMap<K, V> newTreeMap(SortedMap<K, ? extends V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> TreeMap<K, V> newTreeMap(
+      SortedMap<K, ? extends V> map) {
     return new TreeMap<>(map);
   }
 
@@ -441,7 +402,8 @@
    * @param comparator the comparator to sort the keys with
    * @return a new, empty {@code TreeMap}
    */
-  public static <C, K extends C, V> TreeMap<K, V> newTreeMap(@Nullable Comparator<C> comparator) {
+  public static <C extends @Nullable Object, K extends C, V extends @Nullable Object>
+      TreeMap<K, V> newTreeMap(@CheckForNull Comparator<C> comparator) {
     // Ideally, the extra type parameter "C" shouldn't be necessary. It is a
     // work-around of a compiler type inference quirk that prevents the
     // following code from being compiled:
@@ -456,7 +418,8 @@
    * @param type the key type for this map
    * @return a new, empty {@code EnumMap}
    */
-  public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap(Class<K> type) {
+  public static <K extends Enum<K>, V extends @Nullable Object> EnumMap<K, V> newEnumMap(
+      Class<K> type) {
     return new EnumMap<>(checkNotNull(type));
   }
 
@@ -472,7 +435,8 @@
    * @throws IllegalArgumentException if {@code m} is not an {@code EnumMap} instance and contains
    *     no mappings
    */
-  public static <K extends Enum<K>, V> EnumMap<K, V> newEnumMap(Map<K, ? extends V> map) {
+  public static <K extends Enum<K>, V extends @Nullable Object> EnumMap<K, V> newEnumMap(
+      Map<K, ? extends V> map) {
     return new EnumMap<>(map);
   }
 
@@ -485,7 +449,8 @@
    *
    * @return a new, empty {@code IdentityHashMap}
    */
-  public static <K, V> IdentityHashMap<K, V> newIdentityHashMap() {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      IdentityHashMap<K, V> newIdentityHashMap() {
     return new IdentityHashMap<>();
   }
 
@@ -505,13 +470,27 @@
    * @return the difference between the two maps
    */
   @SuppressWarnings("unchecked")
-  public static <K, V> MapDifference<K, V> difference(
-      Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      MapDifference<K, V> difference(
+          Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
     if (left instanceof SortedMap) {
       SortedMap<K, ? extends V> sortedLeft = (SortedMap<K, ? extends V>) left;
       return difference(sortedLeft, right);
     }
-    return difference(left, right, Equivalence.equals());
+    /*
+     * This cast is safe: The Equivalence-accepting overload of difference() (which we call below)
+     * has a weird signature because Equivalence is itself a little weird. Still, we know that
+     * Equivalence.equals() can handle all inputs, and we know that the resulting MapDifference will
+     * contain only Ks and Vs (as opposed to possibly containing @Nullable objects even when K and V
+     * are *not* @Nullable).
+     *
+     * An alternative to suppressing the warning would be to inline the body of the other
+     * difference() method into this one.
+     */
+    @SuppressWarnings("nullness")
+    MapDifference<K, V> result =
+        (MapDifference<K, V>) difference(left, right, Equivalence.equals());
+    return result;
   }
 
   /**
@@ -528,7 +507,33 @@
    * @return the difference between the two maps
    * @since 10.0
    */
-  public static <K, V> MapDifference<K, V> difference(
+  /*
+   * This method should really be annotated to accept maps with @Nullable value types. Fortunately,
+   * no existing Google callers appear to pass null values (much less pass null values *and* run a
+   * nullness checker).
+   *
+   * Still, if we decide that we want to make that work, we'd need to introduce a new type parameter
+   * for the Equivalence input type:
+   *
+   * <E, K extends @Nullable Object, V extends @Nullable E> ... difference(..., Equivalence<E> ...)
+   *
+   * Maybe we should, even though it will break source compatibility.
+   *
+   * Alternatively, this is a case in which it would be useful to be able to express Equivalence<?
+   * super @Nonnull T>).
+   *
+   * As things stand now, though, we have to either:
+   *
+   * - require non-null inputs so that we can guarantee non-null outputs
+   *
+   * - accept nullable inputs but force users to cope with nullable outputs
+   *
+   * And the non-null option is far more useful to existing users.
+   *
+   * (Vaguely related: Another thing we could consider is an overload that accepts a BiPredicate:
+   * https://github.com/google/guava/issues/3913)
+   */
+  public static <K extends @Nullable Object, V> MapDifference<K, V> difference(
       Map<? extends K, ? extends V> left,
       Map<? extends K, ? extends V> right,
       Equivalence<? super V> valueEquivalence) {
@@ -559,8 +564,9 @@
    * @return the difference between the two maps
    * @since 11.0
    */
-  public static <K, V> SortedMapDifference<K, V> difference(
-      SortedMap<K, ? extends V> left, Map<? extends K, ? extends V> right) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedMapDifference<K, V> difference(
+          SortedMap<K, ? extends V> left, Map<? extends K, ? extends V> right) {
     checkNotNull(left);
     checkNotNull(right);
     Comparator<? super K> comparator = orNaturalOrder(left.comparator());
@@ -573,7 +579,7 @@
     return new SortedMapDifferenceImpl<>(onlyOnLeft, onlyOnRight, onBoth, differences);
   }
 
-  private static <K, V> void doDifference(
+  private static <K extends @Nullable Object, V extends @Nullable Object> void doDifference(
       Map<? extends K, ? extends V> left,
       Map<? extends K, ? extends V> right,
       Equivalence<? super V> valueEquivalence,
@@ -585,7 +591,17 @@
       K leftKey = entry.getKey();
       V leftValue = entry.getValue();
       if (right.containsKey(leftKey)) {
-        V rightValue = onlyOnRight.remove(leftKey);
+        /*
+         * The cast is safe because onlyOnRight contains all the keys of right.
+         *
+         * TODO(cpovirk): Consider checking onlyOnRight.containsKey instead of right.containsKey.
+         * That could change behavior if the input maps use different equivalence relations (and so
+         * a key that appears once in `right` might appear multiple times in `left`). We don't
+         * guarantee behavior in that case, anyway, and the current behavior is likely undesirable.
+         * So that's either a reason to feel free to change it or a reason to not bother thinking
+         * further about this.
+         */
+        V rightValue = uncheckedCastNullableTToT(onlyOnRight.remove(leftKey));
         if (valueEquivalence.equivalent(leftValue, rightValue)) {
           onBoth.put(leftKey, leftValue);
         } else {
@@ -597,7 +613,8 @@
     }
   }
 
-  private static <K, V> Map<K, V> unmodifiableMap(Map<K, ? extends V> map) {
+  private static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> unmodifiableMap(
+      Map<K, ? extends V> map) {
     if (map instanceof SortedMap) {
       return Collections.unmodifiableSortedMap((SortedMap<K, ? extends V>) map);
     } else {
@@ -605,7 +622,8 @@
     }
   }
 
-  static class MapDifferenceImpl<K, V> implements MapDifference<K, V> {
+  static class MapDifferenceImpl<K extends @Nullable Object, V extends @Nullable Object>
+      implements MapDifference<K, V> {
     final Map<K, V> onlyOnLeft;
     final Map<K, V> onlyOnRight;
     final Map<K, V> onBoth;
@@ -648,7 +666,7 @@
     }
 
     @Override
-    public boolean equals(Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
@@ -688,31 +706,35 @@
     }
   }
 
-  static class ValueDifferenceImpl<V> implements MapDifference.ValueDifference<V> {
-    private final @Nullable V left;
-    private final @Nullable V right;
+  static class ValueDifferenceImpl<V extends @Nullable Object>
+      implements MapDifference.ValueDifference<V> {
+    @ParametricNullness private final V left;
+    @ParametricNullness private final V right;
 
-    static <V> ValueDifference<V> create(@Nullable V left, @Nullable V right) {
+    static <V extends @Nullable Object> ValueDifference<V> create(
+        @ParametricNullness V left, @ParametricNullness V right) {
       return new ValueDifferenceImpl<V>(left, right);
     }
 
-    private ValueDifferenceImpl(@Nullable V left, @Nullable V right) {
+    private ValueDifferenceImpl(@ParametricNullness V left, @ParametricNullness V right) {
       this.left = left;
       this.right = right;
     }
 
     @Override
+    @ParametricNullness
     public V leftValue() {
       return left;
     }
 
     @Override
+    @ParametricNullness
     public V rightValue() {
       return right;
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof MapDifference.ValueDifference) {
         MapDifference.ValueDifference<?> that = (MapDifference.ValueDifference<?>) object;
         return Objects.equal(this.left, that.leftValue())
@@ -732,8 +754,8 @@
     }
   }
 
-  static class SortedMapDifferenceImpl<K, V> extends MapDifferenceImpl<K, V>
-      implements SortedMapDifference<K, V> {
+  static class SortedMapDifferenceImpl<K extends @Nullable Object, V extends @Nullable Object>
+      extends MapDifferenceImpl<K, V> implements SortedMapDifference<K, V> {
     SortedMapDifferenceImpl(
         SortedMap<K, V> onlyOnLeft,
         SortedMap<K, V> onlyOnRight,
@@ -769,7 +791,8 @@
    * ugly type-casting in one place.
    */
   @SuppressWarnings("unchecked")
-  static <E> Comparator<? super E> orNaturalOrder(@Nullable Comparator<? super E> comparator) {
+  static <E extends @Nullable Object> Comparator<? super E> orNaturalOrder(
+      @CheckForNull Comparator<? super E> comparator) {
     if (comparator != null) { // can't use ? : because of javac bug 5080917
       return comparator;
     }
@@ -800,7 +823,8 @@
    *
    * @since 14.0
    */
-  public static <K, V> Map<K, V> asMap(Set<K> set, Function<? super K, V> function) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> asMap(
+      Set<K> set, Function<? super K, V> function) {
     return new AsMapView<>(set, function);
   }
 
@@ -827,7 +851,8 @@
    *
    * @since 14.0
    */
-  public static <K, V> SortedMap<K, V> asMap(SortedSet<K> set, Function<? super K, V> function) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> SortedMap<K, V> asMap(
+      SortedSet<K> set, Function<? super K, V> function) {
     return new SortedAsMapView<>(set, function);
   }
 
@@ -855,12 +880,13 @@
    * @since 14.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> asMap(
+  public static <K extends @Nullable Object, V extends @Nullable Object> NavigableMap<K, V> asMap(
       NavigableSet<K> set, Function<? super K, V> function) {
     return new NavigableAsMapView<>(set, function);
   }
 
-  private static class AsMapView<K, V> extends ViewCachingAbstractMap<K, V> {
+  private static class AsMapView<K extends @Nullable Object, V extends @Nullable Object>
+      extends ViewCachingAbstractMap<K, V> {
 
     private final Set<K> set;
     final Function<? super K, V> function;
@@ -890,17 +916,19 @@
     }
 
     @Override
-    public boolean containsKey(@Nullable Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return backingSet().contains(key);
     }
 
     @Override
-    public V get(@Nullable Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       return getOrDefault(key, null);
     }
 
     @Override
-    public V getOrDefault(@Nullable Object key, @Nullable V defaultValue) {
+    @CheckForNull
+    public V getOrDefault(@CheckForNull Object key, @CheckForNull V defaultValue) {
       if (Collections2.safeContains(backingSet(), key)) {
         @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
         K k = (K) key;
@@ -911,7 +939,8 @@
     }
 
     @Override
-    public V remove(@Nullable Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       if (backingSet().remove(key)) {
         @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
         K k = (K) key;
@@ -951,17 +980,18 @@
     }
   }
 
-  static <K, V> Iterator<Entry<K, V>> asMapEntryIterator(
-      Set<K> set, final Function<? super K, V> function) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      Iterator<Entry<K, V>> asMapEntryIterator(Set<K> set, final Function<? super K, V> function) {
     return new TransformedIterator<K, Entry<K, V>>(set.iterator()) {
       @Override
-      Entry<K, V> transform(final K key) {
+      Entry<K, V> transform(@ParametricNullness final K key) {
         return immutableEntry(key, function.apply(key));
       }
     };
   }
 
-  private static class SortedAsMapView<K, V> extends AsMapView<K, V> implements SortedMap<K, V> {
+  private static class SortedAsMapView<K extends @Nullable Object, V extends @Nullable Object>
+      extends AsMapView<K, V> implements SortedMap<K, V> {
 
     SortedAsMapView(SortedSet<K> set, Function<? super K, V> function) {
       super(set, function);
@@ -973,6 +1003,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return backingSet().comparator();
     }
@@ -983,33 +1014,37 @@
     }
 
     @Override
-    public SortedMap<K, V> subMap(K fromKey, K toKey) {
+    public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return asMap(backingSet().subSet(fromKey, toKey), function);
     }
 
     @Override
-    public SortedMap<K, V> headMap(K toKey) {
+    public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
       return asMap(backingSet().headSet(toKey), function);
     }
 
     @Override
-    public SortedMap<K, V> tailMap(K fromKey) {
+    public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
       return asMap(backingSet().tailSet(fromKey), function);
     }
 
     @Override
+    @ParametricNullness
     public K firstKey() {
       return backingSet().first();
     }
 
     @Override
+    @ParametricNullness
     public K lastKey() {
       return backingSet().last();
     }
   }
 
   @GwtIncompatible // NavigableMap
-  private static final class NavigableAsMapView<K, V> extends AbstractNavigableMap<K, V> {
+  private static final class NavigableAsMapView<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractNavigableMap<K, V> {
     /*
      * Using AbstractNavigableMap is simpler than extending SortedAsMapView and rewriting all the
      * NavigableMap methods.
@@ -1025,32 +1060,38 @@
 
     @Override
     public NavigableMap<K, V> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return asMap(set.subSet(fromKey, fromInclusive, toKey, toInclusive), function);
     }
 
     @Override
-    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, V> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return asMap(set.headSet(toKey, inclusive), function);
     }
 
     @Override
-    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, V> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
       return asMap(set.tailSet(fromKey, inclusive), function);
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return set.comparator();
     }
 
     @Override
-    public @Nullable V get(@Nullable Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       return getOrDefault(key, null);
     }
 
     @Override
-    public @Nullable V getOrDefault(@Nullable Object key, @Nullable V defaultValue) {
+    @CheckForNull
+    public V getOrDefault(@CheckForNull Object key, @CheckForNull V defaultValue) {
       if (Collections2.safeContains(set, key)) {
         @SuppressWarnings("unchecked") // unsafe, but Javadoc warns about it
         K k = (K) key;
@@ -1101,7 +1142,7 @@
     }
   }
 
-  private static <E> Set<E> removeOnlySet(final Set<E> set) {
+  private static <E extends @Nullable Object> Set<E> removeOnlySet(final Set<E> set) {
     return new ForwardingSet<E>() {
       @Override
       protected Set<E> delegate() {
@@ -1109,7 +1150,7 @@
       }
 
       @Override
-      public boolean add(E element) {
+      public boolean add(@ParametricNullness E element) {
         throw new UnsupportedOperationException();
       }
 
@@ -1120,7 +1161,8 @@
     };
   }
 
-  private static <E> SortedSet<E> removeOnlySortedSet(final SortedSet<E> set) {
+  private static <E extends @Nullable Object> SortedSet<E> removeOnlySortedSet(
+      final SortedSet<E> set) {
     return new ForwardingSortedSet<E>() {
       @Override
       protected SortedSet<E> delegate() {
@@ -1128,7 +1170,7 @@
       }
 
       @Override
-      public boolean add(E element) {
+      public boolean add(@ParametricNullness E element) {
         throw new UnsupportedOperationException();
       }
 
@@ -1138,24 +1180,26 @@
       }
 
       @Override
-      public SortedSet<E> headSet(E toElement) {
+      public SortedSet<E> headSet(@ParametricNullness E toElement) {
         return removeOnlySortedSet(super.headSet(toElement));
       }
 
       @Override
-      public SortedSet<E> subSet(E fromElement, E toElement) {
+      public SortedSet<E> subSet(
+          @ParametricNullness E fromElement, @ParametricNullness E toElement) {
         return removeOnlySortedSet(super.subSet(fromElement, toElement));
       }
 
       @Override
-      public SortedSet<E> tailSet(E fromElement) {
+      public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
         return removeOnlySortedSet(super.tailSet(fromElement));
       }
     };
   }
 
   @GwtIncompatible // NavigableSet
-  private static <E> NavigableSet<E> removeOnlyNavigableSet(final NavigableSet<E> set) {
+  private static <E extends @Nullable Object> NavigableSet<E> removeOnlyNavigableSet(
+      final NavigableSet<E> set) {
     return new ForwardingNavigableSet<E>() {
       @Override
       protected NavigableSet<E> delegate() {
@@ -1163,7 +1207,7 @@
       }
 
       @Override
-      public boolean add(E element) {
+      public boolean add(@ParametricNullness E element) {
         throw new UnsupportedOperationException();
       }
 
@@ -1173,34 +1217,38 @@
       }
 
       @Override
-      public SortedSet<E> headSet(E toElement) {
+      public SortedSet<E> headSet(@ParametricNullness E toElement) {
         return removeOnlySortedSet(super.headSet(toElement));
       }
 
       @Override
-      public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+      public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
         return removeOnlyNavigableSet(super.headSet(toElement, inclusive));
       }
 
       @Override
-      public SortedSet<E> subSet(E fromElement, E toElement) {
+      public SortedSet<E> subSet(
+          @ParametricNullness E fromElement, @ParametricNullness E toElement) {
         return removeOnlySortedSet(super.subSet(fromElement, toElement));
       }
 
       @Override
       public NavigableSet<E> subSet(
-          E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+          @ParametricNullness E fromElement,
+          boolean fromInclusive,
+          @ParametricNullness E toElement,
+          boolean toInclusive) {
         return removeOnlyNavigableSet(
             super.subSet(fromElement, fromInclusive, toElement, toInclusive));
       }
 
       @Override
-      public SortedSet<E> tailSet(E fromElement) {
+      public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
         return removeOnlySortedSet(super.tailSet(fromElement));
       }
 
       @Override
-      public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+      public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
         return removeOnlyNavigableSet(super.tailSet(fromElement, inclusive));
       }
 
@@ -1346,16 +1394,42 @@
    *
    * @param properties a {@code Properties} object to be converted
    * @return an immutable map containing all the entries in {@code properties}
-   * @throws ClassCastException if any key in {@code Properties} is not a {@code String}
-   * @throws NullPointerException if any key or value in {@code Properties} is null
+   * @throws ClassCastException if any key in {@code properties} is not a {@code String}
+   * @throws NullPointerException if any key or value in {@code properties} is null
    */
   @GwtIncompatible // java.util.Properties
   public static ImmutableMap<String, String> fromProperties(Properties properties) {
     ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
 
     for (Enumeration<?> e = properties.propertyNames(); e.hasMoreElements(); ) {
-      String key = (String) e.nextElement();
-      builder.put(key, properties.getProperty(key));
+      /*
+       * requireNonNull is safe because propertyNames contains only non-null elements.
+       *
+       * Accordingly, we have it annotated as returning `Enumeration<? extends Object>` in our
+       * prototype checker's JDK. However, the checker still sees the return type as plain
+       * `Enumeration<?>`, probably because of one of the following two bugs (and maybe those two
+       * bugs are themselves just symptoms of the same underlying problem):
+       *
+       * https://github.com/typetools/checker-framework/issues/3030
+       *
+       * https://github.com/typetools/checker-framework/issues/3236
+       */
+      String key = (String) requireNonNull(e.nextElement());
+      /*
+       * requireNonNull is safe because the key came from propertyNames...
+       *
+       * ...except that it's possible for users to insert a string key with a non-string value, and
+       * in that case, getProperty *will* return null.
+       *
+       * TODO(b/192002623): Handle that case: Either:
+       *
+       * - Skip non-string keys and values entirely, as proposed in the linked bug.
+       *
+       * - Throw ClassCastException instead of NullPointerException, as documented in the current
+       *   Javadoc. (Note that we can't necessarily "just" change our call to `getProperty` to `get`
+       *   because `get` does not consult the default properties.)
+       */
+      builder.put(key, requireNonNull(properties.getProperty(key)));
     }
 
     return builder.build();
@@ -1374,7 +1448,8 @@
    * @param value the value to be associated with the returned entry
    */
   @GwtCompatible(serializable = true)
-  public static <K, V> Entry<K, V> immutableEntry(@Nullable K key, @Nullable V value) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Entry<K, V> immutableEntry(
+      @ParametricNullness K key, @ParametricNullness V value) {
     return new ImmutableEntry<>(key, value);
   }
 
@@ -1386,7 +1461,8 @@
    * @param entrySet the entries for which to return an unmodifiable view
    * @return an unmodifiable view of the entries
    */
-  static <K, V> Set<Entry<K, V>> unmodifiableEntrySet(Set<Entry<K, V>> entrySet) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      Set<Entry<K, V>> unmodifiableEntrySet(Set<Entry<K, V>> entrySet) {
     return new UnmodifiableEntrySet<>(Collections.unmodifiableSet(entrySet));
   }
 
@@ -1399,23 +1475,27 @@
    * @param entry the entry for which to return an unmodifiable view
    * @return an unmodifiable view of the entry
    */
-  static <K, V> Entry<K, V> unmodifiableEntry(final Entry<? extends K, ? extends V> entry) {
+  static <K extends @Nullable Object, V extends @Nullable Object> Entry<K, V> unmodifiableEntry(
+      final Entry<? extends K, ? extends V> entry) {
     checkNotNull(entry);
     return new AbstractMapEntry<K, V>() {
       @Override
+      @ParametricNullness
       public K getKey() {
         return entry.getKey();
       }
 
       @Override
+      @ParametricNullness
       public V getValue() {
         return entry.getValue();
       }
     };
   }
 
-  static <K, V> UnmodifiableIterator<Entry<K, V>> unmodifiableEntryIterator(
-      final Iterator<Entry<K, V>> entryIterator) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      UnmodifiableIterator<Entry<K, V>> unmodifiableEntryIterator(
+          final Iterator<Entry<K, V>> entryIterator) {
     return new UnmodifiableIterator<Entry<K, V>>() {
       @Override
       public boolean hasNext() {
@@ -1430,7 +1510,8 @@
   }
 
   /** @see Multimaps#unmodifiableEntries */
-  static class UnmodifiableEntries<K, V> extends ForwardingCollection<Entry<K, V>> {
+  static class UnmodifiableEntries<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingCollection<Entry<K, V>> {
     private final Collection<Entry<K, V>> entries;
 
     UnmodifiableEntries(Collection<Entry<K, V>> entries) {
@@ -1451,18 +1532,26 @@
 
     @Override
     public Object[] toArray() {
-      return standardToArray();
+      /*
+       * standardToArray returns `@Nullable Object[]` rather than `Object[]` but only because it can
+       * be used with collections that may contain null. This collection never contains nulls, so we
+       * can treat it as a plain `Object[]`.
+       */
+      @SuppressWarnings("nullness")
+      Object[] result = standardToArray();
+      return result;
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return standardToArray(array);
     }
   }
 
   /** @see Maps#unmodifiableEntrySet(Set) */
-  static class UnmodifiableEntrySet<K, V> extends UnmodifiableEntries<K, V>
-      implements Set<Entry<K, V>> {
+  static class UnmodifiableEntrySet<K extends @Nullable Object, V extends @Nullable Object>
+      extends UnmodifiableEntries<K, V> implements Set<Entry<K, V>> {
     UnmodifiableEntrySet(Set<Entry<K, V>> entries) {
       super(entries);
     }
@@ -1470,7 +1559,7 @@
     // See java.util.Collections.UnmodifiableEntrySet for details on attacks.
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       return Sets.equalsImpl(this, object);
     }
 
@@ -1518,7 +1607,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof BiMapConverter) {
         BiMapConverter<?, ?> that = (BiMapConverter<?, ?>) object;
         return this.bimap.equals(that.bimap);
@@ -1569,7 +1658,8 @@
    * @param bimap the bimap to be wrapped in a synchronized view
    * @return a synchronized view of the specified bimap
    */
-  public static <K, V> BiMap<K, V> synchronizedBiMap(BiMap<K, V> bimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      BiMap<K, V> synchronizedBiMap(BiMap<K, V> bimap) {
     return Synchronized.biMap(bimap, null);
   }
 
@@ -1584,19 +1674,20 @@
    * @param bimap the bimap for which an unmodifiable view is to be returned
    * @return an unmodifiable view of the specified bimap
    */
-  public static <K, V> BiMap<K, V> unmodifiableBiMap(BiMap<? extends K, ? extends V> bimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      BiMap<K, V> unmodifiableBiMap(BiMap<? extends K, ? extends V> bimap) {
     return new UnmodifiableBiMap<>(bimap, null);
   }
 
   /** @see Maps#unmodifiableBiMap(BiMap) */
-  private static class UnmodifiableBiMap<K, V> extends ForwardingMap<K, V>
-      implements BiMap<K, V>, Serializable {
+  private static class UnmodifiableBiMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingMap<K, V> implements BiMap<K, V>, Serializable {
     final Map<K, V> unmodifiableMap;
     final BiMap<? extends K, ? extends V> delegate;
-    @RetainedWith @Nullable BiMap<V, K> inverse;
-    transient @Nullable Set<V> values;
+    @RetainedWith @CheckForNull BiMap<V, K> inverse;
+    @CheckForNull transient Set<V> values;
 
-    UnmodifiableBiMap(BiMap<? extends K, ? extends V> delegate, @Nullable BiMap<V, K> inverse) {
+    UnmodifiableBiMap(BiMap<? extends K, ? extends V> delegate, @CheckForNull BiMap<V, K> inverse) {
       unmodifiableMap = Collections.unmodifiableMap(delegate);
       this.delegate = delegate;
       this.inverse = inverse;
@@ -1608,7 +1699,8 @@
     }
 
     @Override
-    public V forcePut(K key, V value) {
+    @CheckForNull
+    public V forcePut(@ParametricNullness K key, @ParametricNullness V value) {
       throw new UnsupportedOperationException();
     }
 
@@ -1662,8 +1754,9 @@
    * function} should be fast. To avoid lazy evaluation when the returned map doesn't need to be a
    * view, copy the returned map into a new map of your choosing.
    */
-  public static <K, V1, V2> Map<K, V2> transformValues(
-      Map<K, V1> fromMap, Function<? super V1, V2> function) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Map<K, V2> transformValues(Map<K, V1> fromMap, Function<? super V1, V2> function) {
     return transformEntries(fromMap, asEntryTransformer(function));
   }
 
@@ -1703,8 +1796,10 @@
    *
    * @since 11.0
    */
-  public static <K, V1, V2> SortedMap<K, V2> transformValues(
-      SortedMap<K, V1> fromMap, Function<? super V1, V2> function) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      SortedMap<K, V2> transformValues(
+          SortedMap<K, V1> fromMap, Function<? super V1, V2> function) {
     return transformEntries(fromMap, asEntryTransformer(function));
   }
 
@@ -1747,8 +1842,10 @@
    * @since 13.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V1, V2> NavigableMap<K, V2> transformValues(
-      NavigableMap<K, V1> fromMap, Function<? super V1, V2> function) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      NavigableMap<K, V2> transformValues(
+          NavigableMap<K, V1> fromMap, Function<? super V1, V2> function) {
     return transformEntries(fromMap, asEntryTransformer(function));
   }
 
@@ -1799,8 +1896,10 @@
    *
    * @since 7.0
    */
-  public static <K, V1, V2> Map<K, V2> transformEntries(
-      Map<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Map<K, V2> transformEntries(
+          Map<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
     return new TransformedEntriesMap<>(fromMap, transformer);
   }
 
@@ -1851,8 +1950,10 @@
    *
    * @since 11.0
    */
-  public static <K, V1, V2> SortedMap<K, V2> transformEntries(
-      SortedMap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      SortedMap<K, V2> transformEntries(
+          SortedMap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
     return new TransformedEntriesSortedMap<>(fromMap, transformer);
   }
 
@@ -1905,8 +2006,10 @@
    * @since 13.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V1, V2> NavigableMap<K, V2> transformEntries(
-      final NavigableMap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      NavigableMap<K, V2> transformEntries(
+          NavigableMap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
     return new TransformedEntriesNavigableMap<>(fromMap, transformer);
   }
 
@@ -1920,7 +2023,8 @@
    * @since 7.0
    */
   @FunctionalInterface
-  public interface EntryTransformer<K, V1, V2> {
+  public interface EntryTransformer<
+      K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object> {
     /**
      * Determines an output value based on a key-value pair. This method is <i>generally
      * expected</i>, but not absolutely required, to have the following properties:
@@ -1935,38 +2039,43 @@
      * @throws NullPointerException if the key or value is null and this transformer does not accept
      *     null arguments
      */
-    V2 transformEntry(@Nullable K key, @Nullable V1 value);
+    V2 transformEntry(@ParametricNullness K key, @ParametricNullness V1 value);
   }
 
   /** Views a function as an entry transformer that ignores the entry key. */
-  static <K, V1, V2> EntryTransformer<K, V1, V2> asEntryTransformer(
-      final Function<? super V1, V2> function) {
+  static <K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      EntryTransformer<K, V1, V2> asEntryTransformer(final Function<? super V1, V2> function) {
     checkNotNull(function);
     return new EntryTransformer<K, V1, V2>() {
       @Override
-      public V2 transformEntry(K key, V1 value) {
+      @ParametricNullness
+      public V2 transformEntry(@ParametricNullness K key, @ParametricNullness V1 value) {
         return function.apply(value);
       }
     };
   }
 
-  static <K, V1, V2> Function<V1, V2> asValueToValueFunction(
-      final EntryTransformer<? super K, V1, V2> transformer, final K key) {
+  static <K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Function<V1, V2> asValueToValueFunction(
+          final EntryTransformer<? super K, V1, V2> transformer, @ParametricNullness final K key) {
     checkNotNull(transformer);
     return new Function<V1, V2>() {
       @Override
-      public V2 apply(@Nullable V1 v1) {
+      @ParametricNullness
+      public V2 apply(@ParametricNullness V1 v1) {
         return transformer.transformEntry(key, v1);
       }
     };
   }
 
   /** Views an entry transformer as a function from {@code Entry} to values. */
-  static <K, V1, V2> Function<Entry<K, V1>, V2> asEntryToValueFunction(
-      final EntryTransformer<? super K, ? super V1, V2> transformer) {
+  static <K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Function<Entry<K, V1>, V2> asEntryToValueFunction(
+          final EntryTransformer<? super K, ? super V1, V2> transformer) {
     checkNotNull(transformer);
     return new Function<Entry<K, V1>, V2>() {
       @Override
+      @ParametricNullness
       public V2 apply(Entry<K, V1> entry) {
         return transformer.transformEntry(entry.getKey(), entry.getValue());
       }
@@ -1974,17 +2083,20 @@
   }
 
   /** Returns a view of an entry transformed by the specified transformer. */
-  static <V2, K, V1> Entry<K, V2> transformEntry(
-      final EntryTransformer<? super K, ? super V1, V2> transformer, final Entry<K, V1> entry) {
+  static <V2 extends @Nullable Object, K extends @Nullable Object, V1 extends @Nullable Object>
+      Entry<K, V2> transformEntry(
+          final EntryTransformer<? super K, ? super V1, V2> transformer, final Entry<K, V1> entry) {
     checkNotNull(transformer);
     checkNotNull(entry);
     return new AbstractMapEntry<K, V2>() {
       @Override
+      @ParametricNullness
       public K getKey() {
         return entry.getKey();
       }
 
       @Override
+      @ParametricNullness
       public V2 getValue() {
         return transformer.transformEntry(entry.getKey(), entry.getValue());
       }
@@ -1992,8 +2104,9 @@
   }
 
   /** Views an entry transformer as a function from entries to entries. */
-  static <K, V1, V2> Function<Entry<K, V1>, Entry<K, V2>> asEntryToEntryFunction(
-      final EntryTransformer<? super K, ? super V1, V2> transformer) {
+  static <K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Function<Entry<K, V1>, Entry<K, V2>> asEntryToEntryFunction(
+          final EntryTransformer<? super K, ? super V1, V2> transformer) {
     checkNotNull(transformer);
     return new Function<Entry<K, V1>, Entry<K, V2>>() {
       @Override
@@ -2003,7 +2116,9 @@
     };
   }
 
-  static class TransformedEntriesMap<K, V1, V2> extends IteratorBasedAbstractMap<K, V2> {
+  static class TransformedEntriesMap<
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      extends IteratorBasedAbstractMap<K, V2> {
     final Map<K, V1> fromMap;
     final EntryTransformer<? super K, ? super V1, V2> transformer;
 
@@ -2019,31 +2134,37 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return fromMap.containsKey(key);
     }
 
     @Override
-    public @Nullable V2 get(@Nullable Object key) {
+    @CheckForNull
+    public V2 get(@CheckForNull Object key) {
       return getOrDefault(key, null);
     }
 
     // safe as long as the user followed the <b>Warning</b> in the javadoc
     @SuppressWarnings("unchecked")
     @Override
-    public @Nullable V2 getOrDefault(@Nullable Object key, @Nullable V2 defaultValue) {
+    @CheckForNull
+    public V2 getOrDefault(@CheckForNull Object key, @CheckForNull V2 defaultValue) {
       V1 value = fromMap.get(key);
-      return (value != null || fromMap.containsKey(key))
-          ? transformer.transformEntry((K) key, value)
-          : defaultValue;
+      if (value != null || fromMap.containsKey(key)) {
+        // The cast is safe because of the containsKey check.
+        return transformer.transformEntry((K) key, uncheckedCastNullableTToT(value));
+      }
+      return defaultValue;
     }
 
     // safe as long as the user followed the <b>Warning</b> in the javadoc
     @SuppressWarnings("unchecked")
     @Override
-    public V2 remove(Object key) {
+    @CheckForNull
+    public V2 remove(@CheckForNull Object key) {
       return fromMap.containsKey(key)
-          ? transformer.transformEntry((K) key, fromMap.remove(key))
+          // The cast is safe because of the containsKey check.
+          ? transformer.transformEntry((K) key, uncheckedCastNullableTToT(fromMap.remove(key)))
           : null;
     }
 
@@ -2082,8 +2203,9 @@
     }
   }
 
-  static class TransformedEntriesSortedMap<K, V1, V2> extends TransformedEntriesMap<K, V1, V2>
-      implements SortedMap<K, V2> {
+  static class TransformedEntriesSortedMap<
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      extends TransformedEntriesMap<K, V1, V2> implements SortedMap<K, V2> {
 
     protected SortedMap<K, V1> fromMap() {
       return (SortedMap<K, V1>) fromMap;
@@ -2095,38 +2217,42 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return fromMap().comparator();
     }
 
     @Override
+    @ParametricNullness
     public K firstKey() {
       return fromMap().firstKey();
     }
 
     @Override
-    public SortedMap<K, V2> headMap(K toKey) {
+    public SortedMap<K, V2> headMap(@ParametricNullness K toKey) {
       return transformEntries(fromMap().headMap(toKey), transformer);
     }
 
     @Override
+    @ParametricNullness
     public K lastKey() {
       return fromMap().lastKey();
     }
 
     @Override
-    public SortedMap<K, V2> subMap(K fromKey, K toKey) {
+    public SortedMap<K, V2> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return transformEntries(fromMap().subMap(fromKey, toKey), transformer);
     }
 
     @Override
-    public SortedMap<K, V2> tailMap(K fromKey) {
+    public SortedMap<K, V2> tailMap(@ParametricNullness K fromKey) {
       return transformEntries(fromMap().tailMap(fromKey), transformer);
     }
   }
 
   @GwtIncompatible // NavigableMap
-  private static class TransformedEntriesNavigableMap<K, V1, V2>
+  private static class TransformedEntriesNavigableMap<
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
       extends TransformedEntriesSortedMap<K, V1, V2> implements NavigableMap<K, V2> {
 
     TransformedEntriesNavigableMap(
@@ -2135,12 +2261,14 @@
     }
 
     @Override
-    public Entry<K, V2> ceilingEntry(K key) {
+    @CheckForNull
+    public Entry<K, V2> ceilingEntry(@ParametricNullness K key) {
       return transformEntry(fromMap().ceilingEntry(key));
     }
 
     @Override
-    public K ceilingKey(K key) {
+    @CheckForNull
+    public K ceilingKey(@ParametricNullness K key) {
       return fromMap().ceilingKey(key);
     }
 
@@ -2155,52 +2283,60 @@
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V2> firstEntry() {
       return transformEntry(fromMap().firstEntry());
     }
 
     @Override
-    public Entry<K, V2> floorEntry(K key) {
+    @CheckForNull
+    public Entry<K, V2> floorEntry(@ParametricNullness K key) {
       return transformEntry(fromMap().floorEntry(key));
     }
 
     @Override
-    public K floorKey(K key) {
+    @CheckForNull
+    public K floorKey(@ParametricNullness K key) {
       return fromMap().floorKey(key);
     }
 
     @Override
-    public NavigableMap<K, V2> headMap(K toKey) {
+    public NavigableMap<K, V2> headMap(@ParametricNullness K toKey) {
       return headMap(toKey, false);
     }
 
     @Override
-    public NavigableMap<K, V2> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, V2> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return transformEntries(fromMap().headMap(toKey, inclusive), transformer);
     }
 
     @Override
-    public Entry<K, V2> higherEntry(K key) {
+    @CheckForNull
+    public Entry<K, V2> higherEntry(@ParametricNullness K key) {
       return transformEntry(fromMap().higherEntry(key));
     }
 
     @Override
-    public K higherKey(K key) {
+    @CheckForNull
+    public K higherKey(@ParametricNullness K key) {
       return fromMap().higherKey(key);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V2> lastEntry() {
       return transformEntry(fromMap().lastEntry());
     }
 
     @Override
-    public Entry<K, V2> lowerEntry(K key) {
+    @CheckForNull
+    public Entry<K, V2> lowerEntry(@ParametricNullness K key) {
       return transformEntry(fromMap().lowerEntry(key));
     }
 
     @Override
-    public K lowerKey(K key) {
+    @CheckForNull
+    public K lowerKey(@ParametricNullness K key) {
       return fromMap().lowerKey(key);
     }
 
@@ -2210,38 +2346,44 @@
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V2> pollFirstEntry() {
       return transformEntry(fromMap().pollFirstEntry());
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V2> pollLastEntry() {
       return transformEntry(fromMap().pollLastEntry());
     }
 
     @Override
     public NavigableMap<K, V2> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return transformEntries(
           fromMap().subMap(fromKey, fromInclusive, toKey, toInclusive), transformer);
     }
 
     @Override
-    public NavigableMap<K, V2> subMap(K fromKey, K toKey) {
+    public NavigableMap<K, V2> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return subMap(fromKey, true, toKey, false);
     }
 
     @Override
-    public NavigableMap<K, V2> tailMap(K fromKey) {
+    public NavigableMap<K, V2> tailMap(@ParametricNullness K fromKey) {
       return tailMap(fromKey, true);
     }
 
     @Override
-    public NavigableMap<K, V2> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, V2> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
       return transformEntries(fromMap().tailMap(fromKey, inclusive), transformer);
     }
 
-    private @Nullable Entry<K, V2> transformEntry(@Nullable Entry<K, V1> entry) {
+    @CheckForNull
+    private Entry<K, V2> transformEntry(@CheckForNull Entry<K, V1> entry) {
       return (entry == null) ? null : Maps.transformEntry(transformer, entry);
     }
 
@@ -2251,11 +2393,13 @@
     }
   }
 
-  static <K> Predicate<Entry<K, ?>> keyPredicateOnEntries(Predicate<? super K> keyPredicate) {
+  static <K extends @Nullable Object> Predicate<Entry<K, ?>> keyPredicateOnEntries(
+      Predicate<? super K> keyPredicate) {
     return compose(keyPredicate, Maps.<K>keyFunction());
   }
 
-  static <V> Predicate<Entry<?, V>> valuePredicateOnEntries(Predicate<? super V> valuePredicate) {
+  static <V extends @Nullable Object> Predicate<Entry<?, V>> valuePredicateOnEntries(
+      Predicate<? super V> valuePredicate) {
     return compose(valuePredicate, Maps.<V>valueFunction());
   }
 
@@ -2282,7 +2426,7 @@
    * {@link Predicate#apply}. Do not provide a predicate such as {@code
    * Predicates.instanceOf(ArrayList.class)}, which is inconsistent with equals.
    */
-  public static <K, V> Map<K, V> filterKeys(
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> filterKeys(
       Map<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     checkNotNull(keyPredicate);
     Predicate<Entry<K, ?>> entryPredicate = keyPredicateOnEntries(keyPredicate);
@@ -2317,7 +2461,7 @@
    *
    * @since 11.0
    */
-  public static <K, V> SortedMap<K, V> filterKeys(
+  public static <K extends @Nullable Object, V extends @Nullable Object> SortedMap<K, V> filterKeys(
       SortedMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     // TODO(lowasser): Return a subclass of Maps.FilteredKeyMap for slightly better
     // performance.
@@ -2351,8 +2495,9 @@
    * @since 14.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> filterKeys(
-      NavigableMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> filterKeys(
+          NavigableMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     // TODO(lowasser): Return a subclass of Maps.FilteredKeyMap for slightly better
     // performance.
     return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate));
@@ -2382,7 +2527,7 @@
    *
    * @since 14.0
    */
-  public static <K, V> BiMap<K, V> filterKeys(
+  public static <K extends @Nullable Object, V extends @Nullable Object> BiMap<K, V> filterKeys(
       BiMap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     checkNotNull(keyPredicate);
     return filterEntries(unfiltered, Maps.<K>keyPredicateOnEntries(keyPredicate));
@@ -2411,7 +2556,7 @@
    * at {@link Predicate#apply}. Do not provide a predicate such as {@code
    * Predicates.instanceOf(ArrayList.class)}, which is inconsistent with equals.
    */
-  public static <K, V> Map<K, V> filterValues(
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> filterValues(
       Map<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
@@ -2442,8 +2587,9 @@
    *
    * @since 11.0
    */
-  public static <K, V> SortedMap<K, V> filterValues(
-      SortedMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedMap<K, V> filterValues(
+          SortedMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
 
@@ -2474,8 +2620,9 @@
    * @since 14.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> filterValues(
-      NavigableMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> filterValues(
+          NavigableMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
 
@@ -2506,7 +2653,7 @@
    *
    * @since 14.0
    */
-  public static <K, V> BiMap<K, V> filterValues(
+  public static <K extends @Nullable Object, V extends @Nullable Object> BiMap<K, V> filterValues(
       BiMap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
@@ -2535,7 +2682,7 @@
    * <p><b>Warning:</b> {@code entryPredicate} must be <i>consistent with equals</i>, as documented
    * at {@link Predicate#apply}.
    */
-  public static <K, V> Map<K, V> filterEntries(
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> filterEntries(
       Map<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(entryPredicate);
     return (unfiltered instanceof AbstractFilteredMap)
@@ -2569,8 +2716,9 @@
    *
    * @since 11.0
    */
-  public static <K, V> SortedMap<K, V> filterEntries(
-      SortedMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedMap<K, V> filterEntries(
+          SortedMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(entryPredicate);
     return (unfiltered instanceof FilteredEntrySortedMap)
         ? filterFiltered((FilteredEntrySortedMap<K, V>) unfiltered, entryPredicate)
@@ -2604,8 +2752,9 @@
    * @since 14.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> filterEntries(
-      NavigableMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> filterEntries(
+          NavigableMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(entryPredicate);
     return (unfiltered instanceof FilteredEntryNavigableMap)
         ? filterFiltered((FilteredEntryNavigableMap<K, V>) unfiltered, entryPredicate)
@@ -2639,7 +2788,7 @@
    *
    * @since 14.0
    */
-  public static <K, V> BiMap<K, V> filterEntries(
+  public static <K extends @Nullable Object, V extends @Nullable Object> BiMap<K, V> filterEntries(
       BiMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(unfiltered);
     checkNotNull(entryPredicate);
@@ -2652,7 +2801,7 @@
    * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when filtering a filtered
    * map.
    */
-  private static <K, V> Map<K, V> filterFiltered(
+  private static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> filterFiltered(
       AbstractFilteredMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
     return new FilteredEntryMap<>(
         map.unfiltered, Predicates.<Entry<K, V>>and(map.predicate, entryPredicate));
@@ -2662,8 +2811,9 @@
    * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when filtering a filtered
    * sorted map.
    */
-  private static <K, V> SortedMap<K, V> filterFiltered(
-      FilteredEntrySortedMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedMap<K, V> filterFiltered(
+          FilteredEntrySortedMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
     Predicate<Entry<K, V>> predicate = Predicates.<Entry<K, V>>and(map.predicate, entryPredicate);
     return new FilteredEntrySortedMap<>(map.sortedMap(), predicate);
   }
@@ -2673,8 +2823,9 @@
    * navigable map.
    */
   @GwtIncompatible // NavigableMap
-  private static <K, V> NavigableMap<K, V> filterFiltered(
-      FilteredEntryNavigableMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> filterFiltered(
+          FilteredEntryNavigableMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
     Predicate<Entry<K, V>> predicate =
         Predicates.<Entry<K, V>>and(map.entryPredicate, entryPredicate);
     return new FilteredEntryNavigableMap<>(map.unfiltered, predicate);
@@ -2684,13 +2835,16 @@
    * Support {@code clear()}, {@code removeAll()}, and {@code retainAll()} when filtering a filtered
    * map.
    */
-  private static <K, V> BiMap<K, V> filterFiltered(
-      FilteredEntryBiMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      BiMap<K, V> filterFiltered(
+          FilteredEntryBiMap<K, V> map, Predicate<? super Entry<K, V>> entryPredicate) {
     Predicate<Entry<K, V>> predicate = Predicates.<Entry<K, V>>and(map.predicate, entryPredicate);
     return new FilteredEntryBiMap<>(map.unfiltered(), predicate);
   }
 
-  private abstract static class AbstractFilteredMap<K, V> extends ViewCachingAbstractMap<K, V> {
+  private abstract static class AbstractFilteredMap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends ViewCachingAbstractMap<K, V> {
     final Map<K, V> unfiltered;
     final Predicate<? super Entry<K, V>> predicate;
 
@@ -2699,16 +2853,17 @@
       this.predicate = predicate;
     }
 
-    boolean apply(@Nullable Object key, @Nullable V value) {
-      // This method is called only when the key is in the map, implying that
-      // key is a K.
-      @SuppressWarnings("unchecked")
+    boolean apply(@CheckForNull Object key, @ParametricNullness V value) {
+      // This method is called only when the key is in the map (or about to be added to the map),
+      // implying that key is a K.
+      @SuppressWarnings({"unchecked", "nullness"})
       K k = (K) key;
       return predicate.apply(Maps.immutableEntry(k, value));
     }
 
     @Override
-    public V put(K key, V value) {
+    @CheckForNull
+    public V put(@ParametricNullness K key, @ParametricNullness V value) {
       checkArgument(apply(key, value));
       return unfiltered.put(key, value);
     }
@@ -2722,12 +2877,13 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return unfiltered.containsKey(key) && apply(key, unfiltered.get(key));
     }
 
     @Override
-    public V get(Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       V value = unfiltered.get(key);
       return ((value != null) && apply(key, value)) ? value : null;
     }
@@ -2738,7 +2894,8 @@
     }
 
     @Override
-    public V remove(Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       return containsKey(key) ? unfiltered.remove(key) : null;
     }
 
@@ -2748,7 +2905,9 @@
     }
   }
 
-  private static final class FilteredMapValues<K, V> extends Maps.Values<K, V> {
+  private static final class FilteredMapValues<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends Maps.Values<K, V> {
     final Map<K, V> unfiltered;
     final Predicate<? super Entry<K, V>> predicate;
 
@@ -2760,7 +2919,7 @@
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       Iterator<Entry<K, V>> entryItr = unfiltered.entrySet().iterator();
       while (entryItr.hasNext()) {
         Entry<K, V> entry = entryItr.next();
@@ -2801,18 +2960,20 @@
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       // creating an ArrayList so filtering happens once
       return Lists.newArrayList(iterator()).toArray();
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return Lists.newArrayList(iterator()).toArray(array);
     }
   }
 
-  private static class FilteredKeyMap<K, V> extends AbstractFilteredMap<K, V> {
+  private static class FilteredKeyMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractFilteredMap<K, V> {
     final Predicate<? super K> keyPredicate;
 
     FilteredKeyMap(
@@ -2837,12 +2998,13 @@
     // that key is a K.
     @Override
     @SuppressWarnings("unchecked")
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return unfiltered.containsKey(key) && keyPredicate.apply((K) key);
     }
   }
 
-  static class FilteredEntryMap<K, V> extends AbstractFilteredMap<K, V> {
+  static class FilteredEntryMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractFilteredMap<K, V> {
     /**
      * Entries in this set satisfy the predicate, but they don't validate the input to {@code
      * Entry.setValue()}.
@@ -2878,7 +3040,8 @@
               }
 
               @Override
-              public V setValue(V newValue) {
+              @ParametricNullness
+              public V setValue(@ParametricNullness V newValue) {
                 checkArgument(apply(getKey(), newValue));
                 return super.setValue(newValue);
               }
@@ -2893,7 +3056,7 @@
       return new KeySet();
     }
 
-    static <K, V> boolean removeAllKeys(
+    static <K extends @Nullable Object, V extends @Nullable Object> boolean removeAllKeys(
         Map<K, V> map, Predicate<? super Entry<K, V>> entryPredicate, Collection<?> keyCollection) {
       Iterator<Entry<K, V>> entryItr = map.entrySet().iterator();
       boolean result = false;
@@ -2907,7 +3070,7 @@
       return result;
     }
 
-    static <K, V> boolean retainAllKeys(
+    static <K extends @Nullable Object, V extends @Nullable Object> boolean retainAllKeys(
         Map<K, V> map, Predicate<? super Entry<K, V>> entryPredicate, Collection<?> keyCollection) {
       Iterator<Entry<K, V>> entryItr = map.entrySet().iterator();
       boolean result = false;
@@ -2928,7 +3091,7 @@
       }
 
       @Override
-      public boolean remove(Object o) {
+      public boolean remove(@CheckForNull Object o) {
         if (containsKey(o)) {
           unfiltered.remove(o);
           return true;
@@ -2947,20 +3110,22 @@
       }
 
       @Override
-      public Object[] toArray() {
+      public @Nullable Object[] toArray() {
         // creating an ArrayList so filtering happens once
         return Lists.newArrayList(iterator()).toArray();
       }
 
       @Override
-      public <T> T[] toArray(T[] array) {
+      @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+      public <T extends @Nullable Object> T[] toArray(T[] array) {
         return Lists.newArrayList(iterator()).toArray(array);
       }
     }
   }
 
-  private static class FilteredEntrySortedMap<K, V> extends FilteredEntryMap<K, V>
-      implements SortedMap<K, V> {
+  private static class FilteredEntrySortedMap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends FilteredEntryMap<K, V> implements SortedMap<K, V> {
 
     FilteredEntrySortedMap(
         SortedMap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
@@ -2984,54 +3149,62 @@
     @WeakOuter
     class SortedKeySet extends KeySet implements SortedSet<K> {
       @Override
+      @CheckForNull
       public Comparator<? super K> comparator() {
         return sortedMap().comparator();
       }
 
       @Override
-      public SortedSet<K> subSet(K fromElement, K toElement) {
+      public SortedSet<K> subSet(
+          @ParametricNullness K fromElement, @ParametricNullness K toElement) {
         return (SortedSet<K>) subMap(fromElement, toElement).keySet();
       }
 
       @Override
-      public SortedSet<K> headSet(K toElement) {
+      public SortedSet<K> headSet(@ParametricNullness K toElement) {
         return (SortedSet<K>) headMap(toElement).keySet();
       }
 
       @Override
-      public SortedSet<K> tailSet(K fromElement) {
+      public SortedSet<K> tailSet(@ParametricNullness K fromElement) {
         return (SortedSet<K>) tailMap(fromElement).keySet();
       }
 
       @Override
+      @ParametricNullness
       public K first() {
         return firstKey();
       }
 
       @Override
+      @ParametricNullness
       public K last() {
         return lastKey();
       }
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return sortedMap().comparator();
     }
 
     @Override
+    @ParametricNullness
     public K firstKey() {
       // correctly throws NoSuchElementException when filtered map is empty.
       return keySet().iterator().next();
     }
 
     @Override
+    @ParametricNullness
     public K lastKey() {
       SortedMap<K, V> headMap = sortedMap();
       while (true) {
         // correctly throws NoSuchElementException when filtered map is empty.
         K key = headMap.lastKey();
-        if (apply(key, unfiltered.get(key))) {
+        // The cast is safe because the key is taken from the map.
+        if (apply(key, uncheckedCastNullableTToT(unfiltered.get(key)))) {
           return key;
         }
         headMap = sortedMap().headMap(key);
@@ -3039,23 +3212,25 @@
     }
 
     @Override
-    public SortedMap<K, V> headMap(K toKey) {
+    public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
       return new FilteredEntrySortedMap<>(sortedMap().headMap(toKey), predicate);
     }
 
     @Override
-    public SortedMap<K, V> subMap(K fromKey, K toKey) {
+    public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return new FilteredEntrySortedMap<>(sortedMap().subMap(fromKey, toKey), predicate);
     }
 
     @Override
-    public SortedMap<K, V> tailMap(K fromKey) {
+    public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
       return new FilteredEntrySortedMap<>(sortedMap().tailMap(fromKey), predicate);
     }
   }
 
   @GwtIncompatible // NavigableMap
-  private static class FilteredEntryNavigableMap<K, V> extends AbstractNavigableMap<K, V> {
+  private static class FilteredEntryNavigableMap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractNavigableMap<K, V> {
     /*
      * It's less code to extend AbstractNavigableMap and forward the filtering logic to
      * FilteredEntryMap than to extend FilteredEntrySortedMap and reimplement all the NavigableMap
@@ -3074,6 +3249,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return unfiltered.comparator();
     }
@@ -3119,22 +3295,25 @@
     }
 
     @Override
-    public @Nullable V get(@Nullable Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       return filteredDelegate.get(key);
     }
 
     @Override
-    public boolean containsKey(@Nullable Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return filteredDelegate.containsKey(key);
     }
 
     @Override
-    public V put(K key, V value) {
+    @CheckForNull
+    public V put(@ParametricNullness K key, @ParametricNullness V value) {
       return filteredDelegate.put(key, value);
     }
 
     @Override
-    public V remove(@Nullable Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       return filteredDelegate.remove(key);
     }
 
@@ -3154,11 +3333,13 @@
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> pollFirstEntry() {
       return Iterables.removeFirstMatching(unfiltered.entrySet(), entryPredicate);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> pollLastEntry() {
       return Iterables.removeFirstMatching(unfiltered.descendingMap().entrySet(), entryPredicate);
     }
@@ -3170,28 +3351,32 @@
 
     @Override
     public NavigableMap<K, V> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return filterEntries(
           unfiltered.subMap(fromKey, fromInclusive, toKey, toInclusive), entryPredicate);
     }
 
     @Override
-    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, V> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return filterEntries(unfiltered.headMap(toKey, inclusive), entryPredicate);
     }
 
     @Override
-    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, V> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
       return filterEntries(unfiltered.tailMap(fromKey, inclusive), entryPredicate);
     }
   }
 
-  static final class FilteredEntryBiMap<K, V> extends FilteredEntryMap<K, V>
-      implements BiMap<K, V> {
+  static final class FilteredEntryBiMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends FilteredEntryMap<K, V> implements BiMap<K, V> {
     @RetainedWith private final BiMap<V, K> inverse;
 
-    private static <K, V> Predicate<Entry<V, K>> inversePredicate(
-        final Predicate<? super Entry<K, V>> forwardPredicate) {
+    private static <K extends @Nullable Object, V extends @Nullable Object>
+        Predicate<Entry<V, K>> inversePredicate(
+            final Predicate<? super Entry<K, V>> forwardPredicate) {
       return new Predicate<Entry<V, K>>() {
         @Override
         public boolean apply(Entry<V, K> input) {
@@ -3217,7 +3402,8 @@
     }
 
     @Override
-    public V forcePut(@Nullable K key, @Nullable V value) {
+    @CheckForNull
+    public V forcePut(@ParametricNullness K key, @ParametricNullness V value) {
       checkArgument(apply(key, value));
       return unfiltered().forcePut(key, value);
     }
@@ -3262,8 +3448,8 @@
    * @since 12.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> unmodifiableNavigableMap(
-      NavigableMap<K, ? extends V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> unmodifiableNavigableMap(NavigableMap<K, ? extends V> map) {
     checkNotNull(map);
     if (map instanceof UnmodifiableNavigableMap) {
       @SuppressWarnings("unchecked") // covariant
@@ -3274,14 +3460,15 @@
     }
   }
 
-  private static <K, V> @Nullable Entry<K, V> unmodifiableOrNull(
-      @Nullable Entry<K, ? extends V> entry) {
+  @CheckForNull
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      Entry<K, V> unmodifiableOrNull(@CheckForNull Entry<K, ? extends V> entry) {
     return (entry == null) ? null : Maps.unmodifiableEntry(entry);
   }
 
   @GwtIncompatible // NavigableMap
-  static class UnmodifiableNavigableMap<K, V> extends ForwardingSortedMap<K, V>
-      implements NavigableMap<K, V>, Serializable {
+  static class UnmodifiableNavigableMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingSortedMap<K, V> implements NavigableMap<K, V>, Serializable {
     private final NavigableMap<K, ? extends V> delegate;
 
     UnmodifiableNavigableMap(NavigableMap<K, ? extends V> delegate) {
@@ -3300,66 +3487,78 @@
     }
 
     @Override
-    public Entry<K, V> lowerEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> lowerEntry(@ParametricNullness K key) {
       return unmodifiableOrNull(delegate.lowerEntry(key));
     }
 
     @Override
-    public K lowerKey(K key) {
+    @CheckForNull
+    public K lowerKey(@ParametricNullness K key) {
       return delegate.lowerKey(key);
     }
 
     @Override
-    public Entry<K, V> floorEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> floorEntry(@ParametricNullness K key) {
       return unmodifiableOrNull(delegate.floorEntry(key));
     }
 
     @Override
-    public K floorKey(K key) {
+    @CheckForNull
+    public K floorKey(@ParametricNullness K key) {
       return delegate.floorKey(key);
     }
 
     @Override
-    public Entry<K, V> ceilingEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> ceilingEntry(@ParametricNullness K key) {
       return unmodifiableOrNull(delegate.ceilingEntry(key));
     }
 
     @Override
-    public K ceilingKey(K key) {
+    @CheckForNull
+    public K ceilingKey(@ParametricNullness K key) {
       return delegate.ceilingKey(key);
     }
 
     @Override
-    public Entry<K, V> higherEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> higherEntry(@ParametricNullness K key) {
       return unmodifiableOrNull(delegate.higherEntry(key));
     }
 
     @Override
-    public K higherKey(K key) {
+    @CheckForNull
+    public K higherKey(@ParametricNullness K key) {
       return delegate.higherKey(key);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> firstEntry() {
       return unmodifiableOrNull(delegate.firstEntry());
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> lastEntry() {
       return unmodifiableOrNull(delegate.lastEntry());
     }
 
     @Override
+    @CheckForNull
     public final Entry<K, V> pollFirstEntry() {
       throw new UnsupportedOperationException();
     }
 
     @Override
+    @CheckForNull
     public final Entry<K, V> pollLastEntry() {
       throw new UnsupportedOperationException();
     }
 
-    private transient @Nullable UnmodifiableNavigableMap<K, V> descendingMap;
+    @CheckForNull private transient UnmodifiableNavigableMap<K, V> descendingMap;
 
     @Override
     public NavigableMap<K, V> descendingMap() {
@@ -3385,34 +3584,37 @@
     }
 
     @Override
-    public SortedMap<K, V> subMap(K fromKey, K toKey) {
+    public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return subMap(fromKey, true, toKey, false);
     }
 
     @Override
     public NavigableMap<K, V> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return Maps.unmodifiableNavigableMap(
           delegate.subMap(fromKey, fromInclusive, toKey, toInclusive));
     }
 
     @Override
-    public SortedMap<K, V> headMap(K toKey) {
+    public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
       return headMap(toKey, false);
     }
 
     @Override
-    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, V> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return Maps.unmodifiableNavigableMap(delegate.headMap(toKey, inclusive));
     }
 
     @Override
-    public SortedMap<K, V> tailMap(K fromKey) {
+    public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
       return tailMap(fromKey, true);
     }
 
     @Override
-    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, V> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
       return Maps.unmodifiableNavigableMap(delegate.tailMap(fromKey, inclusive));
     }
   }
@@ -3467,8 +3669,8 @@
    * @since 13.0
    */
   @GwtIncompatible // NavigableMap
-  public static <K, V> NavigableMap<K, V> synchronizedNavigableMap(
-      NavigableMap<K, V> navigableMap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      NavigableMap<K, V> synchronizedNavigableMap(NavigableMap<K, V> navigableMap) {
     return Synchronized.navigableMap(navigableMap);
   }
 
@@ -3477,14 +3679,16 @@
    * entrySet views.
    */
   @GwtCompatible
-  abstract static class ViewCachingAbstractMap<K, V> extends AbstractMap<K, V> {
+  abstract static class ViewCachingAbstractMap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMap<K, V> {
     /**
      * Creates the entry set to be returned by {@link #entrySet()}. This method is invoked at most
      * once on a given map, at the time when {@code entrySet} is first called.
      */
     abstract Set<Entry<K, V>> createEntrySet();
 
-    private transient @Nullable Set<Entry<K, V>> entrySet;
+    @CheckForNull private transient Set<Entry<K, V>> entrySet;
 
     @Override
     public Set<Entry<K, V>> entrySet() {
@@ -3492,7 +3696,7 @@
       return (result == null) ? entrySet = createEntrySet() : result;
     }
 
-    private transient @Nullable Set<K> keySet;
+    @CheckForNull private transient Set<K> keySet;
 
     @Override
     public Set<K> keySet() {
@@ -3504,7 +3708,7 @@
       return new KeySet<>(this);
     }
 
-    private transient @Nullable Collection<V> values;
+    @CheckForNull private transient Collection<V> values;
 
     @Override
     public Collection<V> values() {
@@ -3517,7 +3721,9 @@
     }
   }
 
-  abstract static class IteratorBasedAbstractMap<K, V> extends AbstractMap<K, V> {
+  abstract static class IteratorBasedAbstractMap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMap<K, V> {
     @Override
     public abstract int size();
 
@@ -3567,7 +3773,8 @@
    * Delegates to {@link Map#get}. Returns {@code null} on {@code ClassCastException} and {@code
    * NullPointerException}.
    */
-  static <V> V safeGet(Map<?, V> map, @Nullable Object key) {
+  @CheckForNull
+  static <V extends @Nullable Object> V safeGet(Map<?, V> map, @CheckForNull Object key) {
     checkNotNull(map);
     try {
       return map.get(key);
@@ -3580,7 +3787,7 @@
    * Delegates to {@link Map#containsKey}. Returns {@code false} on {@code ClassCastException} and
    * {@code NullPointerException}.
    */
-  static boolean safeContainsKey(Map<?, ?> map, Object key) {
+  static boolean safeContainsKey(Map<?, ?> map, @CheckForNull Object key) {
     checkNotNull(map);
     try {
       return map.containsKey(key);
@@ -3593,7 +3800,8 @@
    * Delegates to {@link Map#remove}. Returns {@code null} on {@code ClassCastException} and {@code
    * NullPointerException}.
    */
-  static <V> V safeRemove(Map<?, V> map, Object key) {
+  @CheckForNull
+  static <V extends @Nullable Object> V safeRemove(Map<?, V> map, @CheckForNull Object key) {
     checkNotNull(map);
     try {
       return map.remove(key);
@@ -3603,12 +3811,12 @@
   }
 
   /** An admittedly inefficient implementation of {@link Map#containsKey}. */
-  static boolean containsKeyImpl(Map<?, ?> map, @Nullable Object key) {
+  static boolean containsKeyImpl(Map<?, ?> map, @CheckForNull Object key) {
     return Iterators.contains(keyIterator(map.entrySet().iterator()), key);
   }
 
   /** An implementation of {@link Map#containsValue}. */
-  static boolean containsValueImpl(Map<?, ?> map, @Nullable Object value) {
+  static boolean containsValueImpl(Map<?, ?> map, @CheckForNull Object value) {
     return Iterators.contains(valueIterator(map.entrySet().iterator()), value);
   }
 
@@ -3624,7 +3832,8 @@
    * @param o the object that might be contained in {@code c}
    * @return {@code true} if {@code c} contains {@code o}
    */
-  static <K, V> boolean containsEntryImpl(Collection<Entry<K, V>> c, Object o) {
+  static <K extends @Nullable Object, V extends @Nullable Object> boolean containsEntryImpl(
+      Collection<Entry<K, V>> c, @CheckForNull Object o) {
     if (!(o instanceof Entry)) {
       return false;
     }
@@ -3642,7 +3851,8 @@
    * @param o the object to remove from {@code c}
    * @return {@code true} if {@code c} was changed
    */
-  static <K, V> boolean removeEntryImpl(Collection<Entry<K, V>> c, Object o) {
+  static <K extends @Nullable Object, V extends @Nullable Object> boolean removeEntryImpl(
+      Collection<Entry<K, V>> c, @CheckForNull Object o) {
     if (!(o instanceof Entry)) {
       return false;
     }
@@ -3650,7 +3860,7 @@
   }
 
   /** An implementation of {@link Map#equals}. */
-  static boolean equalsImpl(Map<?, ?> map, Object object) {
+  static boolean equalsImpl(Map<?, ?> map, @CheckForNull Object object) {
     if (map == object) {
       return true;
     } else if (object instanceof Map) {
@@ -3675,13 +3885,15 @@
   }
 
   /** An implementation of {@link Map#putAll}. */
-  static <K, V> void putAllImpl(Map<K, V> self, Map<? extends K, ? extends V> map) {
+  static <K extends @Nullable Object, V extends @Nullable Object> void putAllImpl(
+      Map<K, V> self, Map<? extends K, ? extends V> map) {
     for (Entry<? extends K, ? extends V> entry : map.entrySet()) {
       self.put(entry.getKey(), entry.getValue());
     }
   }
 
-  static class KeySet<K, V> extends Sets.ImprovedAbstractSet<K> {
+  static class KeySet<K extends @Nullable Object, V extends @Nullable Object>
+      extends Sets.ImprovedAbstractSet<K> {
     @Weak final Map<K, V> map;
 
     KeySet(Map<K, V> map) {
@@ -3715,12 +3927,12 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return map().containsKey(o);
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       if (contains(o)) {
         map().remove(o);
         return true;
@@ -3734,15 +3946,18 @@
     }
   }
 
-  static <K> @Nullable K keyOrNull(@Nullable Entry<K, ?> entry) {
+  @CheckForNull
+  static <K extends @Nullable Object> K keyOrNull(@CheckForNull Entry<K, ?> entry) {
     return (entry == null) ? null : entry.getKey();
   }
 
-  static <V> @Nullable V valueOrNull(@Nullable Entry<?, V> entry) {
+  @CheckForNull
+  static <V extends @Nullable Object> V valueOrNull(@CheckForNull Entry<?, V> entry) {
     return (entry == null) ? null : entry.getValue();
   }
 
-  static class SortedKeySet<K, V> extends KeySet<K, V> implements SortedSet<K> {
+  static class SortedKeySet<K extends @Nullable Object, V extends @Nullable Object>
+      extends KeySet<K, V> implements SortedSet<K> {
     SortedKeySet(SortedMap<K, V> map) {
       super(map);
     }
@@ -3753,38 +3968,42 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       return map().comparator();
     }
 
     @Override
-    public SortedSet<K> subSet(K fromElement, K toElement) {
+    public SortedSet<K> subSet(@ParametricNullness K fromElement, @ParametricNullness K toElement) {
       return new SortedKeySet<>(map().subMap(fromElement, toElement));
     }
 
     @Override
-    public SortedSet<K> headSet(K toElement) {
+    public SortedSet<K> headSet(@ParametricNullness K toElement) {
       return new SortedKeySet<>(map().headMap(toElement));
     }
 
     @Override
-    public SortedSet<K> tailSet(K fromElement) {
+    public SortedSet<K> tailSet(@ParametricNullness K fromElement) {
       return new SortedKeySet<>(map().tailMap(fromElement));
     }
 
     @Override
+    @ParametricNullness
     public K first() {
       return map().firstKey();
     }
 
     @Override
+    @ParametricNullness
     public K last() {
       return map().lastKey();
     }
   }
 
   @GwtIncompatible // NavigableMap
-  static class NavigableKeySet<K, V> extends SortedKeySet<K, V> implements NavigableSet<K> {
+  static class NavigableKeySet<K extends @Nullable Object, V extends @Nullable Object>
+      extends SortedKeySet<K, V> implements NavigableSet<K> {
     NavigableKeySet(NavigableMap<K, V> map) {
       super(map);
     }
@@ -3795,31 +4014,37 @@
     }
 
     @Override
-    public K lower(K e) {
+    @CheckForNull
+    public K lower(@ParametricNullness K e) {
       return map().lowerKey(e);
     }
 
     @Override
-    public K floor(K e) {
+    @CheckForNull
+    public K floor(@ParametricNullness K e) {
       return map().floorKey(e);
     }
 
     @Override
-    public K ceiling(K e) {
+    @CheckForNull
+    public K ceiling(@ParametricNullness K e) {
       return map().ceilingKey(e);
     }
 
     @Override
-    public K higher(K e) {
+    @CheckForNull
+    public K higher(@ParametricNullness K e) {
       return map().higherKey(e);
     }
 
     @Override
+    @CheckForNull
     public K pollFirst() {
       return keyOrNull(map().pollFirstEntry());
     }
 
     @Override
+    @CheckForNull
     public K pollLast() {
       return keyOrNull(map().pollLastEntry());
     }
@@ -3836,37 +4061,41 @@
 
     @Override
     public NavigableSet<K> subSet(
-        K fromElement, boolean fromInclusive, K toElement, boolean toInclusive) {
+        @ParametricNullness K fromElement,
+        boolean fromInclusive,
+        @ParametricNullness K toElement,
+        boolean toInclusive) {
       return map().subMap(fromElement, fromInclusive, toElement, toInclusive).navigableKeySet();
     }
 
     @Override
-    public SortedSet<K> subSet(K fromElement, K toElement) {
+    public SortedSet<K> subSet(@ParametricNullness K fromElement, @ParametricNullness K toElement) {
       return subSet(fromElement, true, toElement, false);
     }
 
     @Override
-    public NavigableSet<K> headSet(K toElement, boolean inclusive) {
+    public NavigableSet<K> headSet(@ParametricNullness K toElement, boolean inclusive) {
       return map().headMap(toElement, inclusive).navigableKeySet();
     }
 
     @Override
-    public SortedSet<K> headSet(K toElement) {
+    public SortedSet<K> headSet(@ParametricNullness K toElement) {
       return headSet(toElement, false);
     }
 
     @Override
-    public NavigableSet<K> tailSet(K fromElement, boolean inclusive) {
+    public NavigableSet<K> tailSet(@ParametricNullness K fromElement, boolean inclusive) {
       return map().tailMap(fromElement, inclusive).navigableKeySet();
     }
 
     @Override
-    public SortedSet<K> tailSet(K fromElement) {
+    public SortedSet<K> tailSet(@ParametricNullness K fromElement) {
       return tailSet(fromElement, true);
     }
   }
 
-  static class Values<K, V> extends AbstractCollection<V> {
+  static class Values<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractCollection<V> {
     @Weak final Map<K, V> map;
 
     Values(Map<K, V> map) {
@@ -3890,7 +4119,7 @@
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       try {
         return super.remove(o);
       } catch (UnsupportedOperationException e) {
@@ -3945,7 +4174,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return map().containsValue(o);
     }
 
@@ -3955,7 +4184,8 @@
     }
   }
 
-  abstract static class EntrySet<K, V> extends Sets.ImprovedAbstractSet<Entry<K, V>> {
+  abstract static class EntrySet<K extends @Nullable Object, V extends @Nullable Object>
+      extends Sets.ImprovedAbstractSet<Entry<K, V>> {
     abstract Map<K, V> map();
 
     @Override
@@ -3969,7 +4199,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) o;
         Object key = entry.getKey();
@@ -3985,8 +4215,12 @@
     }
 
     @Override
-    public boolean remove(Object o) {
-      if (contains(o)) {
+    public boolean remove(@CheckForNull Object o) {
+      /*
+       * `o instanceof Entry` is guaranteed by `contains`, but we check it here to satisfy our
+       * nullness checker.
+       */
+      if (contains(o) && o instanceof Entry) {
         Entry<?, ?> entry = (Entry<?, ?>) o;
         return map().keySet().remove(entry.getKey());
       }
@@ -4009,9 +4243,13 @@
         return super.retainAll(checkNotNull(c));
       } catch (UnsupportedOperationException e) {
         // if the iterators don't support remove
-        Set<Object> keys = Sets.newHashSetWithExpectedSize(c.size());
+        Set<@Nullable Object> keys = Sets.newHashSetWithExpectedSize(c.size());
         for (Object o : c) {
-          if (contains(o)) {
+          /*
+           * `o instanceof Entry` is guaranteed by `contains`, but we check it here to satisfy our
+           * nullness checker.
+           */
+          if (contains(o) && o instanceof Entry) {
             Entry<?, ?> entry = (Entry<?, ?>) o;
             keys.add(entry.getKey());
           }
@@ -4022,8 +4260,8 @@
   }
 
   @GwtIncompatible // NavigableMap
-  abstract static class DescendingMap<K, V> extends ForwardingMap<K, V>
-      implements NavigableMap<K, V> {
+  abstract static class DescendingMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingMap<K, V> implements NavigableMap<K, V> {
 
     abstract NavigableMap<K, V> forward();
 
@@ -4032,7 +4270,7 @@
       return forward();
     }
 
-    private transient @Nullable Comparator<? super K> comparator;
+    @CheckForNull private transient Comparator<? super K> comparator;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -4049,76 +4287,90 @@
     }
 
     // If we inline this, we get a javac error.
-    private static <T> Ordering<T> reverse(Comparator<T> forward) {
+    private static <T extends @Nullable Object> Ordering<T> reverse(Comparator<T> forward) {
       return Ordering.from(forward).reverse();
     }
 
     @Override
+    @ParametricNullness
     public K firstKey() {
       return forward().lastKey();
     }
 
     @Override
+    @ParametricNullness
     public K lastKey() {
       return forward().firstKey();
     }
 
     @Override
-    public Entry<K, V> lowerEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> lowerEntry(@ParametricNullness K key) {
       return forward().higherEntry(key);
     }
 
     @Override
-    public K lowerKey(K key) {
+    @CheckForNull
+    public K lowerKey(@ParametricNullness K key) {
       return forward().higherKey(key);
     }
 
     @Override
-    public Entry<K, V> floorEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> floorEntry(@ParametricNullness K key) {
       return forward().ceilingEntry(key);
     }
 
     @Override
-    public K floorKey(K key) {
+    @CheckForNull
+    public K floorKey(@ParametricNullness K key) {
       return forward().ceilingKey(key);
     }
 
     @Override
-    public Entry<K, V> ceilingEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> ceilingEntry(@ParametricNullness K key) {
       return forward().floorEntry(key);
     }
 
     @Override
-    public K ceilingKey(K key) {
+    @CheckForNull
+    public K ceilingKey(@ParametricNullness K key) {
       return forward().floorKey(key);
     }
 
     @Override
-    public Entry<K, V> higherEntry(K key) {
+    @CheckForNull
+    public Entry<K, V> higherEntry(@ParametricNullness K key) {
       return forward().lowerEntry(key);
     }
 
     @Override
-    public K higherKey(K key) {
+    @CheckForNull
+    public K higherKey(@ParametricNullness K key) {
       return forward().lowerKey(key);
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> firstEntry() {
       return forward().lastEntry();
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> lastEntry() {
       return forward().firstEntry();
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> pollFirstEntry() {
       return forward().pollLastEntry();
     }
 
     @Override
+    @CheckForNull
     public Entry<K, V> pollLastEntry() {
       return forward().pollFirstEntry();
     }
@@ -4128,7 +4380,7 @@
       return forward();
     }
 
-    private transient @Nullable Set<Entry<K, V>> entrySet;
+    @CheckForNull private transient Set<Entry<K, V>> entrySet;
 
     @Override
     public Set<Entry<K, V>> entrySet() {
@@ -4159,7 +4411,7 @@
       return navigableKeySet();
     }
 
-    private transient @Nullable NavigableSet<K> navigableKeySet;
+    @CheckForNull private transient NavigableSet<K> navigableKeySet;
 
     @Override
     public NavigableSet<K> navigableKeySet() {
@@ -4174,32 +4426,35 @@
 
     @Override
     public NavigableMap<K, V> subMap(
-        K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
+        @ParametricNullness K fromKey,
+        boolean fromInclusive,
+        @ParametricNullness K toKey,
+        boolean toInclusive) {
       return forward().subMap(toKey, toInclusive, fromKey, fromInclusive).descendingMap();
     }
 
     @Override
-    public SortedMap<K, V> subMap(K fromKey, K toKey) {
+    public SortedMap<K, V> subMap(@ParametricNullness K fromKey, @ParametricNullness K toKey) {
       return subMap(fromKey, true, toKey, false);
     }
 
     @Override
-    public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
+    public NavigableMap<K, V> headMap(@ParametricNullness K toKey, boolean inclusive) {
       return forward().tailMap(toKey, inclusive).descendingMap();
     }
 
     @Override
-    public SortedMap<K, V> headMap(K toKey) {
+    public SortedMap<K, V> headMap(@ParametricNullness K toKey) {
       return headMap(toKey, false);
     }
 
     @Override
-    public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
+    public NavigableMap<K, V> tailMap(@ParametricNullness K fromKey, boolean inclusive) {
       return forward().headMap(fromKey, inclusive).descendingMap();
     }
 
     @Override
-    public SortedMap<K, V> tailMap(K fromKey) {
+    public SortedMap<K, V> tailMap(@ParametricNullness K fromKey) {
       return tailMap(fromKey, true);
     }
 
@@ -4242,8 +4497,8 @@
    */
   @Beta
   @GwtIncompatible // NavigableMap
-  public static <K extends Comparable<? super K>, V> NavigableMap<K, V> subMap(
-      NavigableMap<K, V> map, Range<K> range) {
+  public static <K extends Comparable<? super K>, V extends @Nullable Object>
+      NavigableMap<K, V> subMap(NavigableMap<K, V> map, Range<K> range) {
     if (map.comparator() != null
         && map.comparator() != Ordering.natural()
         && range.hasLowerBound()
diff --git a/guava/src/com/google/common/collect/MinMaxPriorityQueue.java b/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
index 32cebef..cd01279 100644
--- a/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
+++ b/guava/src/com/google/common/collect/MinMaxPriorityQueue.java
@@ -21,6 +21,7 @@
 import static com.google.common.base.Preconditions.checkPositionIndex;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -41,6 +42,7 @@
 import java.util.NoSuchElementException;
 import java.util.PriorityQueue;
 import java.util.Queue;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -98,6 +100,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class MinMaxPriorityQueue<E> extends AbstractQueue<E> {
 
   /**
@@ -121,6 +124,12 @@
    * Creates and returns a new builder, configured to build {@code MinMaxPriorityQueue} instances
    * that use {@code comparator} to determine the least and greatest elements.
    */
+  /*
+   * TODO(cpovirk): Change to Comparator<? super B> to permit Comparator<@Nullable ...> and
+   * Comparator<SupertypeOfB>? What we have here matches the immutable collections, but those also
+   * expose a public Builder constructor that accepts "? super." So maybe we should do *that*
+   * instead.
+   */
   public static <B> Builder<B> orderedBy(Comparator<B> comparator) {
     return new Builder<B>(comparator);
   }
@@ -224,7 +233,7 @@
   private final Heap minHeap;
   private final Heap maxHeap;
   @VisibleForTesting final int maximumSize;
-  private Object[] queue;
+  private @Nullable Object[] queue;
   private int size;
   private int modCount;
 
@@ -292,16 +301,22 @@
 
   @CanIgnoreReturnValue
   @Override
+  @CheckForNull
   public E poll() {
     return isEmpty() ? null : removeAndGet(0);
   }
 
   @SuppressWarnings("unchecked") // we must carefully only allow Es to get in
   E elementData(int index) {
-    return (E) queue[index];
+    /*
+     * requireNonNull is safe as long as we're careful to call this method only with populated
+     * indexes.
+     */
+    return (E) requireNonNull(queue[index]);
   }
 
   @Override
+  @CheckForNull
   public E peek() {
     return isEmpty() ? null : elementData(0);
   }
@@ -325,6 +340,7 @@
    * empty.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   public E pollFirst() {
     return poll();
   }
@@ -343,6 +359,7 @@
    * Retrieves, but does not remove, the least element of this queue, or returns {@code null} if the
    * queue is empty.
    */
+  @CheckForNull
   public E peekFirst() {
     return peek();
   }
@@ -352,6 +369,7 @@
    * empty.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   public E pollLast() {
     return isEmpty() ? null : removeAndGet(getMaxElementIndex());
   }
@@ -373,6 +391,7 @@
    * Retrieves, but does not remove, the greatest element of this queue, or returns {@code null} if
    * the queue is empty.
    */
+  @CheckForNull
   public E peekLast() {
     return isEmpty() ? null : elementData(getMaxElementIndex());
   }
@@ -392,6 +411,7 @@
    */
   @VisibleForTesting
   @CanIgnoreReturnValue
+  @CheckForNull
   MoveDesc<E> removeAt(int index) {
     checkPositionIndex(index, size);
     modCount++;
@@ -427,6 +447,7 @@
     return changes;
   }
 
+  @CheckForNull
   private MoveDesc<E> fillHole(int index, E toTrickle) {
     Heap heap = heapForIndex(index);
     // We consider elementData(index) a "hole", and we want to fill it
@@ -504,7 +525,7 @@
   @WeakOuter
   private class Heap {
     final Ordering<E> ordering;
-    @Weak @Nullable Heap otherHeap;
+    @Weak Heap otherHeap; // always initialized immediately after construction
 
     Heap(Ordering<E> ordering) {
       this.ordering = ordering;
@@ -518,6 +539,7 @@
      * Tries to move {@code toTrickle} from a min to a max level and bubble up there. If it moved
      * before {@code removeIndex} this method returns a pair as described in {@link #removeAt}.
      */
+    @CheckForNull
     MoveDesc<E> tryCrossOverAndBubbleUp(int removeIndex, int vacated, E toTrickle) {
       int crossOver = crossOver(vacated, toTrickle);
       if (crossOver == vacated) {
@@ -751,9 +773,9 @@
     private int expectedModCount = modCount;
     // The same element is not allowed in both forgetMeNot and skipMe, but duplicates are allowed in
     // either of them, up to the same multiplicity as the queue.
-    private @Nullable Queue<E> forgetMeNot;
-    private @Nullable List<E> skipMe;
-    private @Nullable E lastFromForgetMeNot;
+    @CheckForNull private Queue<E> forgetMeNot;
+    @CheckForNull private List<E> skipMe;
+    @CheckForNull private E lastFromForgetMeNot;
     private boolean canRemove;
 
     @Override
@@ -791,7 +813,8 @@
       if (cursor < size()) {
         MoveDesc<E> moved = removeAt(cursor);
         if (moved != null) {
-          if (forgetMeNot == null) {
+          // Either both are null or neither is, but we check both to satisfy the nullness checker.
+          if (forgetMeNot == null || skipMe == null) {
             forgetMeNot = new ArrayDeque<E>();
             skipMe = new ArrayList<E>(3);
           }
@@ -805,7 +828,7 @@
         cursor--;
         nextCursor--;
       } else { // we must have set lastFromForgetMeNot in next()
-        checkState(removeExact(lastFromForgetMeNot));
+        checkState(removeExact(requireNonNull(lastFromForgetMeNot)));
         lastFromForgetMeNot = null;
       }
     }
diff --git a/guava/src/com/google/common/collect/MoreCollectors.java b/guava/src/com/google/common/collect/MoreCollectors.java
index f447ebe..5a84a46 100644
--- a/guava/src/com/google/common/collect/MoreCollectors.java
+++ b/guava/src/com/google/common/collect/MoreCollectors.java
@@ -17,6 +17,7 @@
 package com.google.common.collect;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Collections.emptyList;
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.ArrayList;
@@ -34,6 +35,7 @@
  * @since 21.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class MoreCollectors {
 
   /*
@@ -49,10 +51,12 @@
           Collector.Characteristics.UNORDERED);
 
   /**
-   * A collector that converts a stream of zero or one elements to an {@code Optional}. The returned
-   * collector throws an {@code IllegalArgumentException} if the stream consists of two or more
-   * elements, and a {@code NullPointerException} if the stream consists of exactly one element,
-   * which is null.
+   * A collector that converts a stream of zero or one elements to an {@code Optional}.
+   *
+   * @throws IllegalArgumentException if the stream consists of two or more elements.
+   * @throws NullPointerException if any element in the stream is {@code null}.
+   * @return {@code Optional.of(onlyElement)} if the stream has exactly one element (must not be
+   *     {@code null}) and returns {@code Optional.empty()} if it has none.
    */
   @SuppressWarnings("unchecked")
   public static <T> Collector<T, ?, Optional<T>> toOptional() {
@@ -61,8 +65,8 @@
 
   private static final Object NULL_PLACEHOLDER = new Object();
 
-  private static final Collector<Object, ?, Object> ONLY_ELEMENT =
-      Collector.of(
+  private static final Collector<@Nullable Object, ?, @Nullable Object> ONLY_ELEMENT =
+      Collector.<@Nullable Object, ToOptionalState, @Nullable Object>of(
           ToOptionalState::new,
           (state, o) -> state.add((o == null) ? NULL_PLACEHOLDER : o),
           ToOptionalState::combine,
@@ -78,7 +82,7 @@
    * more elements, and a {@code NoSuchElementException} if the stream is empty.
    */
   @SuppressWarnings("unchecked")
-  public static <T> Collector<T, ?, T> onlyElement() {
+  public static <T extends @Nullable Object> Collector<T, ?, T> onlyElement() {
     return (Collector) ONLY_ELEMENT;
   }
 
@@ -90,11 +94,11 @@
     static final int MAX_EXTRAS = 4;
 
     @Nullable Object element;
-    @Nullable List<Object> extras;
+    List<Object> extras;
 
     ToOptionalState() {
       element = null;
-      extras = null;
+      extras = emptyList();
     }
 
     IllegalArgumentException multiples(boolean overflow) {
@@ -114,7 +118,8 @@
       checkNotNull(o);
       if (element == null) {
         this.element = o;
-      } else if (extras == null) {
+      } else if (extras.isEmpty()) {
+        // Replace immutable empty list with mutable list.
         extras = new ArrayList<>(MAX_EXTRAS);
         extras.add(o);
       } else if (extras.size() < MAX_EXTRAS) {
@@ -130,13 +135,12 @@
       } else if (other.element == null) {
         return this;
       } else {
-        if (extras == null) {
+        if (extras.isEmpty()) {
+          // Replace immutable empty list with mutable list.
           extras = new ArrayList<>();
         }
         extras.add(other.element);
-        if (other.extras != null) {
-          this.extras.addAll(other.extras);
-        }
+        extras.addAll(other.extras);
         if (extras.size() > MAX_EXTRAS) {
           extras.subList(MAX_EXTRAS, extras.size()).clear();
           throw multiples(true);
@@ -146,7 +150,7 @@
     }
 
     Optional<Object> getOptional() {
-      if (extras == null) {
+      if (extras.isEmpty()) {
         return Optional.ofNullable(element);
       } else {
         throw multiples(false);
@@ -156,7 +160,7 @@
     Object getElement() {
       if (element == null) {
         throw new NoSuchElementException();
-      } else if (extras == null) {
+      } else if (extras.isEmpty()) {
         return element;
       } else {
         throw multiples(false);
diff --git a/guava/src/com/google/common/collect/Multimap.java b/guava/src/com/google/common/collect/Multimap.java
index ec2b9ef..e1a0a8e 100644
--- a/guava/src/com/google/common/collect/Multimap.java
+++ b/guava/src/com/google/common/collect/Multimap.java
@@ -28,6 +28,7 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.function.BiConsumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -161,7 +162,8 @@
  */
 @DoNotMock("Use ImmutableMultimap, HashMultimap, or another implementation")
 @GwtCompatible
-public interface Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface Multimap<K extends @Nullable Object, V extends @Nullable Object> {
   // Query Operations
 
   /**
@@ -183,20 +185,21 @@
    * Returns {@code true} if this multimap contains at least one key-value pair with the key {@code
    * key}.
    */
-  boolean containsKey(@CompatibleWith("K") @Nullable Object key);
+  boolean containsKey(@CompatibleWith("K") @CheckForNull Object key);
 
   /**
    * Returns {@code true} if this multimap contains at least one key-value pair with the value
    * {@code value}.
    */
-  boolean containsValue(@CompatibleWith("V") @Nullable Object value);
+  boolean containsValue(@CompatibleWith("V") @CheckForNull Object value);
 
   /**
    * Returns {@code true} if this multimap contains at least one key-value pair with the key {@code
    * key} and the value {@code value}.
    */
   boolean containsEntry(
-      @CompatibleWith("K") @Nullable Object key, @CompatibleWith("V") @Nullable Object value);
+      @CompatibleWith("K") @CheckForNull Object key,
+      @CompatibleWith("V") @CheckForNull Object value);
 
   // Modification Operations
 
@@ -211,7 +214,7 @@
    *     multimap already contained the key-value pair and doesn't allow duplicates
    */
   @CanIgnoreReturnValue
-  boolean put(@Nullable K key, @Nullable V value);
+  boolean put(@ParametricNullness K key, @ParametricNullness V value);
 
   /**
    * Removes a single key-value pair with the key {@code key} and the value {@code value} from this
@@ -222,7 +225,8 @@
    */
   @CanIgnoreReturnValue
   boolean remove(
-      @CompatibleWith("K") @Nullable Object key, @CompatibleWith("V") @Nullable Object value);
+      @CompatibleWith("K") @CheckForNull Object key,
+      @CompatibleWith("V") @CheckForNull Object value);
 
   // Bulk Operations
 
@@ -241,7 +245,7 @@
    * @return {@code true} if the multimap changed
    */
   @CanIgnoreReturnValue
-  boolean putAll(@Nullable K key, Iterable<? extends V> values);
+  boolean putAll(@ParametricNullness K key, Iterable<? extends V> values);
 
   /**
    * Stores all key-value pairs of {@code multimap} in this multimap, in the order returned by
@@ -262,7 +266,7 @@
    *     no effect on the multimap.
    */
   @CanIgnoreReturnValue
-  Collection<V> replaceValues(@Nullable K key, Iterable<? extends V> values);
+  Collection<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values);
 
   /**
    * Removes all values associated with the key {@code key}.
@@ -274,7 +278,7 @@
    *     modifiable, but updating it will have no effect on the multimap.
    */
   @CanIgnoreReturnValue
-  Collection<V> removeAll(@CompatibleWith("K") @Nullable Object key);
+  Collection<V> removeAll(@CompatibleWith("K") @CheckForNull Object key);
 
   /** Removes all key-value pairs from the multimap, leaving it {@linkplain #isEmpty empty}. */
   void clear();
@@ -288,7 +292,7 @@
    *
    * <p>Changes to the returned collection will update the underlying multimap, and vice versa.
    */
-  Collection<V> get(@Nullable K key);
+  Collection<V> get(@ParametricNullness K key);
 
   /**
    * Returns a view collection of all <i>distinct</i> keys contained in this multimap. Note that the
@@ -370,7 +374,7 @@
    * multimaps are equal, because they both have empty {@link #asMap} views.
    */
   @Override
-  boolean equals(@Nullable Object obj);
+  boolean equals(@CheckForNull Object obj);
 
   /**
    * Returns the hash code for this multimap.
diff --git a/guava/src/com/google/common/collect/MultimapBuilder.java b/guava/src/com/google/common/collect/MultimapBuilder.java
index 161c29d..dddae28 100644
--- a/guava/src/com/google/common/collect/MultimapBuilder.java
+++ b/guava/src/com/google/common/collect/MultimapBuilder.java
@@ -34,6 +34,7 @@
 import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A builder for a multimap implementation that allows customization of the backing map and value
@@ -61,7 +62,8 @@
  * @since 16.0
  */
 @GwtCompatible
-public abstract class MultimapBuilder<K0, V0> {
+@ElementTypesAreNonnullByDefault
+public abstract class MultimapBuilder<K0 extends @Nullable Object, V0 extends @Nullable Object> {
   /*
    * Leaving K and V as upper bounds rather than the actual key and value types allows type
    * parameters to be left implicit more often. CacheBuilder uses the same technique.
@@ -72,7 +74,7 @@
   private static final int DEFAULT_EXPECTED_KEYS = 8;
 
   /** Uses a hash table to map keys to value collections. */
-  public static MultimapBuilderWithKeys<Object> hashKeys() {
+  public static MultimapBuilderWithKeys<@Nullable Object> hashKeys() {
     return hashKeys(DEFAULT_EXPECTED_KEYS);
   }
 
@@ -82,11 +84,11 @@
    *
    * @throws IllegalArgumentException if {@code expectedKeys < 0}
    */
-  public static MultimapBuilderWithKeys<Object> hashKeys(final int expectedKeys) {
+  public static MultimapBuilderWithKeys<@Nullable Object> hashKeys(final int expectedKeys) {
     checkNonnegative(expectedKeys, "expectedKeys");
-    return new MultimapBuilderWithKeys<Object>() {
+    return new MultimapBuilderWithKeys<@Nullable Object>() {
       @Override
-      <K, V> Map<K, Collection<V>> createMap() {
+      <K extends @Nullable Object, V extends @Nullable Object> Map<K, Collection<V>> createMap() {
         return Platform.newHashMapWithExpectedSize(expectedKeys);
       }
     };
@@ -100,7 +102,7 @@
    * multimap, save that if all values associated with a key are removed and then the key is added
    * back into the multimap, that key will come last in the key iteration order.
    */
-  public static MultimapBuilderWithKeys<Object> linkedHashKeys() {
+  public static MultimapBuilderWithKeys<@Nullable Object> linkedHashKeys() {
     return linkedHashKeys(DEFAULT_EXPECTED_KEYS);
   }
 
@@ -113,11 +115,11 @@
    * multimap, save that if all values associated with a key are removed and then the key is added
    * back into the multimap, that key will come last in the key iteration order.
    */
-  public static MultimapBuilderWithKeys<Object> linkedHashKeys(final int expectedKeys) {
+  public static MultimapBuilderWithKeys<@Nullable Object> linkedHashKeys(final int expectedKeys) {
     checkNonnegative(expectedKeys, "expectedKeys");
-    return new MultimapBuilderWithKeys<Object>() {
+    return new MultimapBuilderWithKeys<@Nullable Object>() {
       @Override
-      <K, V> Map<K, Collection<V>> createMap() {
+      <K extends @Nullable Object, V extends @Nullable Object> Map<K, Collection<V>> createMap() {
         return Platform.newLinkedHashMapWithExpectedSize(expectedKeys);
       }
     };
@@ -151,11 +153,12 @@
    * <p>Multimaps generated by the resulting builder will not be serializable if {@code comparator}
    * is not serializable.
    */
-  public static <K0> MultimapBuilderWithKeys<K0> treeKeys(final Comparator<K0> comparator) {
+  public static <K0 extends @Nullable Object> MultimapBuilderWithKeys<K0> treeKeys(
+      final Comparator<K0> comparator) {
     checkNotNull(comparator);
     return new MultimapBuilderWithKeys<K0>() {
       @Override
-      <K extends K0, V> Map<K, Collection<V>> createMap() {
+      <K extends K0, V extends @Nullable Object> Map<K, Collection<V>> createMap() {
         return new TreeMap<>(comparator);
       }
     };
@@ -172,7 +175,7 @@
     return new MultimapBuilderWithKeys<K0>() {
       @SuppressWarnings("unchecked")
       @Override
-      <K extends K0, V> Map<K, Collection<V>> createMap() {
+      <K extends K0, V extends @Nullable Object> Map<K, Collection<V>> createMap() {
         // K must actually be K0, since enums are effectively final
         // (their subclasses are inaccessible)
         return (Map<K, Collection<V>>) new EnumMap<K0, Collection<V>>(keyClass);
@@ -180,7 +183,8 @@
     };
   }
 
-  private static final class ArrayListSupplier<V> implements Supplier<List<V>>, Serializable {
+  private static final class ArrayListSupplier<V extends @Nullable Object>
+      implements Supplier<List<V>>, Serializable {
     private final int expectedValuesPerKey;
 
     ArrayListSupplier(int expectedValuesPerKey) {
@@ -193,10 +197,10 @@
     }
   }
 
-  private enum LinkedListSupplier implements Supplier<List<Object>> {
+  private enum LinkedListSupplier implements Supplier<List<?>> {
     INSTANCE;
 
-    public static <V> Supplier<List<V>> instance() {
+    public static <V extends @Nullable Object> Supplier<List<V>> instance() {
       // Each call generates a fresh LinkedList, which can serve as a List<V> for any V.
       @SuppressWarnings({"rawtypes", "unchecked"})
       Supplier<List<V>> result = (Supplier) INSTANCE;
@@ -204,12 +208,13 @@
     }
 
     @Override
-    public List<Object> get() {
+    public List<?> get() {
       return new LinkedList<>();
     }
   }
 
-  private static final class HashSetSupplier<V> implements Supplier<Set<V>>, Serializable {
+  private static final class HashSetSupplier<V extends @Nullable Object>
+      implements Supplier<Set<V>>, Serializable {
     private final int expectedValuesPerKey;
 
     HashSetSupplier(int expectedValuesPerKey) {
@@ -222,7 +227,8 @@
     }
   }
 
-  private static final class LinkedHashSetSupplier<V> implements Supplier<Set<V>>, Serializable {
+  private static final class LinkedHashSetSupplier<V extends @Nullable Object>
+      implements Supplier<Set<V>>, Serializable {
     private final int expectedValuesPerKey;
 
     LinkedHashSetSupplier(int expectedValuesPerKey) {
@@ -235,7 +241,8 @@
     }
   }
 
-  private static final class TreeSetSupplier<V> implements Supplier<SortedSet<V>>, Serializable {
+  private static final class TreeSetSupplier<V extends @Nullable Object>
+      implements Supplier<SortedSet<V>>, Serializable {
     private final Comparator<? super V> comparator;
 
     TreeSetSupplier(Comparator<? super V> comparator) {
@@ -269,16 +276,16 @@
    * @param <K0> The upper bound on the key type of the generated multimap.
    * @since 16.0
    */
-  public abstract static class MultimapBuilderWithKeys<K0> {
+  public abstract static class MultimapBuilderWithKeys<K0 extends @Nullable Object> {
 
     private static final int DEFAULT_EXPECTED_VALUES_PER_KEY = 2;
 
     MultimapBuilderWithKeys() {}
 
-    abstract <K extends K0, V> Map<K, Collection<V>> createMap();
+    abstract <K extends K0, V extends @Nullable Object> Map<K, Collection<V>> createMap();
 
     /** Uses an {@link ArrayList} to store value collections. */
-    public ListMultimapBuilder<K0, Object> arrayListValues() {
+    public ListMultimapBuilder<K0, @Nullable Object> arrayListValues() {
       return arrayListValues(DEFAULT_EXPECTED_VALUES_PER_KEY);
     }
 
@@ -288,11 +295,12 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public ListMultimapBuilder<K0, Object> arrayListValues(final int expectedValuesPerKey) {
+    public ListMultimapBuilder<K0, @Nullable Object> arrayListValues(
+        final int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
-      return new ListMultimapBuilder<K0, Object>() {
+      return new ListMultimapBuilder<K0, @Nullable Object>() {
         @Override
-        public <K extends K0, V> ListMultimap<K, V> build() {
+        public <K extends K0, V extends @Nullable Object> ListMultimap<K, V> build() {
           return Multimaps.newListMultimap(
               MultimapBuilderWithKeys.this.<K, V>createMap(),
               new ArrayListSupplier<V>(expectedValuesPerKey));
@@ -301,10 +309,10 @@
     }
 
     /** Uses a {@link LinkedList} to store value collections. */
-    public ListMultimapBuilder<K0, Object> linkedListValues() {
-      return new ListMultimapBuilder<K0, Object>() {
+    public ListMultimapBuilder<K0, @Nullable Object> linkedListValues() {
+      return new ListMultimapBuilder<K0, @Nullable Object>() {
         @Override
-        public <K extends K0, V> ListMultimap<K, V> build() {
+        public <K extends K0, V extends @Nullable Object> ListMultimap<K, V> build() {
           return Multimaps.newListMultimap(
               MultimapBuilderWithKeys.this.<K, V>createMap(), LinkedListSupplier.<V>instance());
         }
@@ -312,7 +320,7 @@
     }
 
     /** Uses a hash-based {@code Set} to store value collections. */
-    public SetMultimapBuilder<K0, Object> hashSetValues() {
+    public SetMultimapBuilder<K0, @Nullable Object> hashSetValues() {
       return hashSetValues(DEFAULT_EXPECTED_VALUES_PER_KEY);
     }
 
@@ -322,11 +330,11 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public SetMultimapBuilder<K0, Object> hashSetValues(final int expectedValuesPerKey) {
+    public SetMultimapBuilder<K0, @Nullable Object> hashSetValues(final int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
-      return new SetMultimapBuilder<K0, Object>() {
+      return new SetMultimapBuilder<K0, @Nullable Object>() {
         @Override
-        public <K extends K0, V> SetMultimap<K, V> build() {
+        public <K extends K0, V extends @Nullable Object> SetMultimap<K, V> build() {
           return Multimaps.newSetMultimap(
               MultimapBuilderWithKeys.this.<K, V>createMap(),
               new HashSetSupplier<V>(expectedValuesPerKey));
@@ -335,7 +343,7 @@
     }
 
     /** Uses an insertion-ordered hash-based {@code Set} to store value collections. */
-    public SetMultimapBuilder<K0, Object> linkedHashSetValues() {
+    public SetMultimapBuilder<K0, @Nullable Object> linkedHashSetValues() {
       return linkedHashSetValues(DEFAULT_EXPECTED_VALUES_PER_KEY);
     }
 
@@ -345,11 +353,12 @@
      *
      * @throws IllegalArgumentException if {@code expectedValuesPerKey < 0}
      */
-    public SetMultimapBuilder<K0, Object> linkedHashSetValues(final int expectedValuesPerKey) {
+    public SetMultimapBuilder<K0, @Nullable Object> linkedHashSetValues(
+        final int expectedValuesPerKey) {
       checkNonnegative(expectedValuesPerKey, "expectedValuesPerKey");
-      return new SetMultimapBuilder<K0, Object>() {
+      return new SetMultimapBuilder<K0, @Nullable Object>() {
         @Override
-        public <K extends K0, V> SetMultimap<K, V> build() {
+        public <K extends K0, V extends @Nullable Object> SetMultimap<K, V> build() {
           return Multimaps.newSetMultimap(
               MultimapBuilderWithKeys.this.<K, V>createMap(),
               new LinkedHashSetSupplier<V>(expectedValuesPerKey));
@@ -369,7 +378,8 @@
      * <p>Multimaps generated by the resulting builder will not be serializable if {@code
      * comparator} is not serializable.
      */
-    public <V0> SortedSetMultimapBuilder<K0, V0> treeSetValues(final Comparator<V0> comparator) {
+    public <V0 extends @Nullable Object> SortedSetMultimapBuilder<K0, V0> treeSetValues(
+        final Comparator<V0> comparator) {
       checkNotNull(comparator, "comparator");
       return new SortedSetMultimapBuilder<K0, V0>() {
         @Override
@@ -416,7 +426,9 @@
    *
    * @since 16.0
    */
-  public abstract static class ListMultimapBuilder<K0, V0> extends MultimapBuilder<K0, V0> {
+  public abstract static class ListMultimapBuilder<
+          K0 extends @Nullable Object, V0 extends @Nullable Object>
+      extends MultimapBuilder<K0, V0> {
     ListMultimapBuilder() {}
 
     @Override
@@ -434,7 +446,9 @@
    *
    * @since 16.0
    */
-  public abstract static class SetMultimapBuilder<K0, V0> extends MultimapBuilder<K0, V0> {
+  public abstract static class SetMultimapBuilder<
+          K0 extends @Nullable Object, V0 extends @Nullable Object>
+      extends MultimapBuilder<K0, V0> {
     SetMultimapBuilder() {}
 
     @Override
@@ -452,7 +466,9 @@
    *
    * @since 16.0
    */
-  public abstract static class SortedSetMultimapBuilder<K0, V0> extends SetMultimapBuilder<K0, V0> {
+  public abstract static class SortedSetMultimapBuilder<
+          K0 extends @Nullable Object, V0 extends @Nullable Object>
+      extends SetMultimapBuilder<K0, V0> {
     SortedSetMultimapBuilder() {}
 
     @Override
diff --git a/guava/src/com/google/common/collect/Multimaps.java b/guava/src/com/google/common/collect/Multimaps.java
index f97191d..9bc9e98 100644
--- a/guava/src/com/google/common/collect/Multimaps.java
+++ b/guava/src/com/google/common/collect/Multimaps.java
@@ -19,6 +19,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
 import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -29,6 +31,7 @@
 import com.google.common.base.Supplier;
 import com.google.common.collect.Maps.EntryTransformer;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.Weak;
 import com.google.j2objc.annotations.WeakOuter;
 import java.io.IOException;
@@ -53,6 +56,7 @@
 import java.util.function.Consumer;
 import java.util.stream.Collector;
 import java.util.stream.Stream;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -69,6 +73,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Multimaps {
   private Multimaps() {}
 
@@ -102,22 +107,22 @@
    * }
    * }</pre>
    *
+   * <p>To collect to an {@link ImmutableMultimap}, use either {@link
+   * ImmutableSetMultimap#toImmutableSetMultimap} or {@link
+   * ImmutableListMultimap#toImmutableListMultimap}.
+   *
    * @since 21.0
    */
-  public static <T, K, V, M extends Multimap<K, V>> Collector<T, ?, M> toMultimap(
-      java.util.function.Function<? super T, ? extends K> keyFunction,
-      java.util.function.Function<? super T, ? extends V> valueFunction,
-      java.util.function.Supplier<M> multimapSupplier) {
-    checkNotNull(keyFunction);
-    checkNotNull(valueFunction);
-    checkNotNull(multimapSupplier);
-    return Collector.of(
-        multimapSupplier,
-        (multimap, input) -> multimap.put(keyFunction.apply(input), valueFunction.apply(input)),
-        (multimap1, multimap2) -> {
-          multimap1.putAll(multimap2);
-          return multimap1;
-        });
+  public static <
+          T extends @Nullable Object,
+          K extends @Nullable Object,
+          V extends @Nullable Object,
+          M extends Multimap<K, V>>
+      Collector<T, ?, M> toMultimap(
+          java.util.function.Function<? super T, ? extends K> keyFunction,
+          java.util.function.Function<? super T, ? extends V> valueFunction,
+          java.util.function.Supplier<M> multimapSupplier) {
+    return CollectCollectors.toMultimap(keyFunction, valueFunction, multimapSupplier);
   }
 
   /**
@@ -154,24 +159,16 @@
    * @since 21.0
    */
   @Beta
-  public static <T, K, V, M extends Multimap<K, V>> Collector<T, ?, M> flatteningToMultimap(
-      java.util.function.Function<? super T, ? extends K> keyFunction,
-      java.util.function.Function<? super T, ? extends Stream<? extends V>> valueFunction,
-      java.util.function.Supplier<M> multimapSupplier) {
-    checkNotNull(keyFunction);
-    checkNotNull(valueFunction);
-    checkNotNull(multimapSupplier);
-    return Collector.of(
-        multimapSupplier,
-        (multimap, input) -> {
-          K key = keyFunction.apply(input);
-          Collection<V> valuesForKey = multimap.get(key);
-          valueFunction.apply(input).forEachOrdered(valuesForKey::add);
-        },
-        (multimap1, multimap2) -> {
-          multimap1.putAll(multimap2);
-          return multimap1;
-        });
+  public static <
+          T extends @Nullable Object,
+          K extends @Nullable Object,
+          V extends @Nullable Object,
+          M extends Multimap<K, V>>
+      Collector<T, ?, M> flatteningToMultimap(
+          java.util.function.Function<? super T, ? extends K> keyFunction,
+          java.util.function.Function<? super T, ? extends Stream<? extends V>> valueFunction,
+          java.util.function.Supplier<M> multimapSupplier) {
+    return CollectCollectors.flatteningToMultimap(keyFunction, valueFunction, multimapSupplier);
   }
 
   /**
@@ -210,12 +207,13 @@
    *     key
    * @throws IllegalArgumentException if {@code map} is not empty
    */
-  public static <K, V> Multimap<K, V> newMultimap(
+  public static <K extends @Nullable Object, V extends @Nullable Object> Multimap<K, V> newMultimap(
       Map<K, Collection<V>> map, final Supplier<? extends Collection<V>> factory) {
     return new CustomMultimap<>(map, factory);
   }
 
-  private static class CustomMultimap<K, V> extends AbstractMapBasedMultimap<K, V> {
+  private static class CustomMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMapBasedMultimap<K, V> {
     transient Supplier<? extends Collection<V>> factory;
 
     CustomMultimap(Map<K, Collection<V>> map, Supplier<? extends Collection<V>> factory) {
@@ -239,7 +237,8 @@
     }
 
     @Override
-    <E> Collection<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+    <E extends @Nullable Object> Collection<E> unmodifiableCollectionSubclass(
+        Collection<E> collection) {
       if (collection instanceof NavigableSet) {
         return Sets.unmodifiableNavigableSet((NavigableSet<E>) collection);
       } else if (collection instanceof SortedSet) {
@@ -254,7 +253,7 @@
     }
 
     @Override
-    Collection<V> wrapCollection(K key, Collection<V> collection) {
+    Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
       if (collection instanceof List) {
         return wrapList(key, (List<V>) collection, null);
       } else if (collection instanceof NavigableSet) {
@@ -322,12 +321,14 @@
    * @param factory supplier of new, empty lists that will each hold all values for a given key
    * @throws IllegalArgumentException if {@code map} is not empty
    */
-  public static <K, V> ListMultimap<K, V> newListMultimap(
-      Map<K, Collection<V>> map, final Supplier<? extends List<V>> factory) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ListMultimap<K, V> newListMultimap(
+          Map<K, Collection<V>> map, final Supplier<? extends List<V>> factory) {
     return new CustomListMultimap<>(map, factory);
   }
 
-  private static class CustomListMultimap<K, V> extends AbstractListMultimap<K, V> {
+  private static class CustomListMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractListMultimap<K, V> {
     transient Supplier<? extends List<V>> factory;
 
     CustomListMultimap(Map<K, Collection<V>> map, Supplier<? extends List<V>> factory) {
@@ -400,12 +401,14 @@
    * @param factory supplier of new, empty sets that will each hold all values for a given key
    * @throws IllegalArgumentException if {@code map} is not empty
    */
-  public static <K, V> SetMultimap<K, V> newSetMultimap(
-      Map<K, Collection<V>> map, final Supplier<? extends Set<V>> factory) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> newSetMultimap(
+          Map<K, Collection<V>> map, final Supplier<? extends Set<V>> factory) {
     return new CustomSetMultimap<>(map, factory);
   }
 
-  private static class CustomSetMultimap<K, V> extends AbstractSetMultimap<K, V> {
+  private static class CustomSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractSetMultimap<K, V> {
     transient Supplier<? extends Set<V>> factory;
 
     CustomSetMultimap(Map<K, Collection<V>> map, Supplier<? extends Set<V>> factory) {
@@ -429,7 +432,8 @@
     }
 
     @Override
-    <E> Collection<E> unmodifiableCollectionSubclass(Collection<E> collection) {
+    <E extends @Nullable Object> Collection<E> unmodifiableCollectionSubclass(
+        Collection<E> collection) {
       if (collection instanceof NavigableSet) {
         return Sets.unmodifiableNavigableSet((NavigableSet<E>) collection);
       } else if (collection instanceof SortedSet) {
@@ -440,7 +444,7 @@
     }
 
     @Override
-    Collection<V> wrapCollection(K key, Collection<V> collection) {
+    Collection<V> wrapCollection(@ParametricNullness K key, Collection<V> collection) {
       if (collection instanceof NavigableSet) {
         return new WrappedNavigableSet(key, (NavigableSet<V>) collection, null);
       } else if (collection instanceof SortedSet) {
@@ -500,14 +504,17 @@
    *     key
    * @throws IllegalArgumentException if {@code map} is not empty
    */
-  public static <K, V> SortedSetMultimap<K, V> newSortedSetMultimap(
-      Map<K, Collection<V>> map, final Supplier<? extends SortedSet<V>> factory) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedSetMultimap<K, V> newSortedSetMultimap(
+          Map<K, Collection<V>> map, final Supplier<? extends SortedSet<V>> factory) {
     return new CustomSortedSetMultimap<>(map, factory);
   }
 
-  private static class CustomSortedSetMultimap<K, V> extends AbstractSortedSetMultimap<K, V> {
+  private static class CustomSortedSetMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractSortedSetMultimap<K, V> {
     transient Supplier<? extends SortedSet<V>> factory;
-    transient Comparator<? super V> valueComparator;
+    @CheckForNull transient Comparator<? super V> valueComparator;
 
     CustomSortedSetMultimap(Map<K, Collection<V>> map, Supplier<? extends SortedSet<V>> factory) {
       super(map);
@@ -531,6 +538,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super V> valueComparator() {
       return valueComparator;
     }
@@ -569,8 +577,8 @@
    * @return {@code dest}
    */
   @CanIgnoreReturnValue
-  public static <K, V, M extends Multimap<K, V>> M invertFrom(
-      Multimap<? extends V, ? extends K> source, M dest) {
+  public static <K extends @Nullable Object, V extends @Nullable Object, M extends Multimap<K, V>>
+      M invertFrom(Multimap<? extends V, ? extends K> source, M dest) {
     checkNotNull(dest);
     for (Map.Entry<? extends V, ? extends K> entry : source.entries()) {
       dest.put(entry.getValue(), entry.getKey());
@@ -610,7 +618,8 @@
    * @param multimap the multimap to be wrapped in a synchronized view
    * @return a synchronized view of the specified multimap
    */
-  public static <K, V> Multimap<K, V> synchronizedMultimap(Multimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      Multimap<K, V> synchronizedMultimap(Multimap<K, V> multimap) {
     return Synchronized.multimap(multimap, null);
   }
 
@@ -625,7 +634,8 @@
    * @param delegate the multimap for which an unmodifiable view is to be returned
    * @return an unmodifiable view of the specified multimap
    */
-  public static <K, V> Multimap<K, V> unmodifiableMultimap(Multimap<K, V> delegate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      Multimap<K, V> unmodifiableMultimap(Multimap<K, V> delegate) {
     if (delegate instanceof UnmodifiableMultimap || delegate instanceof ImmutableMultimap) {
       return delegate;
     }
@@ -643,14 +653,14 @@
     return checkNotNull(delegate);
   }
 
-  private static class UnmodifiableMultimap<K, V> extends ForwardingMultimap<K, V>
-      implements Serializable {
+  private static class UnmodifiableMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingMultimap<K, V> implements Serializable {
     final Multimap<K, V> delegate;
-    transient @Nullable Collection<Entry<K, V>> entries;
-    transient @Nullable Multiset<K> keys;
-    transient @Nullable Set<K> keySet;
-    transient @Nullable Collection<V> values;
-    transient @Nullable Map<K, Collection<V>> map;
+    @LazyInit @CheckForNull transient Collection<Entry<K, V>> entries;
+    @LazyInit @CheckForNull transient Multiset<K> keys;
+    @LazyInit @CheckForNull transient Set<K> keySet;
+    @LazyInit @CheckForNull transient Collection<V> values;
+    @LazyInit @CheckForNull transient Map<K, Collection<V>> map;
 
     UnmodifiableMultimap(final Multimap<K, V> delegate) {
       this.delegate = checkNotNull(delegate);
@@ -700,7 +710,7 @@
     }
 
     @Override
-    public Collection<V> get(K key) {
+    public Collection<V> get(@ParametricNullness K key) {
       return unmodifiableValueCollection(delegate.get(key));
     }
 
@@ -723,12 +733,12 @@
     }
 
     @Override
-    public boolean put(K key, V value) {
+    public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public boolean putAll(K key, Iterable<? extends V> values) {
+    public boolean putAll(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
@@ -738,17 +748,17 @@
     }
 
     @Override
-    public boolean remove(Object key, Object value) {
+    public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Collection<V> removeAll(Object key) {
+    public Collection<V> removeAll(@CheckForNull Object key) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Collection<V> replaceValues(K key, Iterable<? extends V> values) {
+    public Collection<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
@@ -764,8 +774,9 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static class UnmodifiableListMultimap<K, V> extends UnmodifiableMultimap<K, V>
-      implements ListMultimap<K, V> {
+  private static class UnmodifiableListMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends UnmodifiableMultimap<K, V> implements ListMultimap<K, V> {
     UnmodifiableListMultimap(ListMultimap<K, V> delegate) {
       super(delegate);
     }
@@ -776,25 +787,26 @@
     }
 
     @Override
-    public List<V> get(K key) {
+    public List<V> get(@ParametricNullness K key) {
       return Collections.unmodifiableList(delegate().get(key));
     }
 
     @Override
-    public List<V> removeAll(Object key) {
+    public List<V> removeAll(@CheckForNull Object key) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public List<V> replaceValues(K key, Iterable<? extends V> values) {
+    public List<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
     private static final long serialVersionUID = 0;
   }
 
-  private static class UnmodifiableSetMultimap<K, V> extends UnmodifiableMultimap<K, V>
-      implements SetMultimap<K, V> {
+  private static class UnmodifiableSetMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends UnmodifiableMultimap<K, V> implements SetMultimap<K, V> {
     UnmodifiableSetMultimap(SetMultimap<K, V> delegate) {
       super(delegate);
     }
@@ -805,7 +817,7 @@
     }
 
     @Override
-    public Set<V> get(K key) {
+    public Set<V> get(@ParametricNullness K key) {
       /*
        * Note that this doesn't return a SortedSet when delegate is a
        * SortedSetMultiset, unlike (SortedSet<V>) super.get().
@@ -819,20 +831,21 @@
     }
 
     @Override
-    public Set<V> removeAll(Object key) {
+    public Set<V> removeAll(@CheckForNull Object key) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Set<V> replaceValues(K key, Iterable<? extends V> values) {
+    public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
     private static final long serialVersionUID = 0;
   }
 
-  private static class UnmodifiableSortedSetMultimap<K, V> extends UnmodifiableSetMultimap<K, V>
-      implements SortedSetMultimap<K, V> {
+  private static class UnmodifiableSortedSetMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends UnmodifiableSetMultimap<K, V> implements SortedSetMultimap<K, V> {
     UnmodifiableSortedSetMultimap(SortedSetMultimap<K, V> delegate) {
       super(delegate);
     }
@@ -843,21 +856,22 @@
     }
 
     @Override
-    public SortedSet<V> get(K key) {
+    public SortedSet<V> get(@ParametricNullness K key) {
       return Collections.unmodifiableSortedSet(delegate().get(key));
     }
 
     @Override
-    public SortedSet<V> removeAll(Object key) {
+    public SortedSet<V> removeAll(@CheckForNull Object key) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public SortedSet<V> replaceValues(K key, Iterable<? extends V> values) {
+    public SortedSet<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super V> valueComparator() {
       return delegate().valueComparator();
     }
@@ -875,7 +889,8 @@
    * @param multimap the multimap to be wrapped
    * @return a synchronized view of the specified multimap
    */
-  public static <K, V> SetMultimap<K, V> synchronizedSetMultimap(SetMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> synchronizedSetMultimap(SetMultimap<K, V> multimap) {
     return Synchronized.setMultimap(multimap, null);
   }
 
@@ -890,7 +905,8 @@
    * @param delegate the multimap for which an unmodifiable view is to be returned
    * @return an unmodifiable view of the specified multimap
    */
-  public static <K, V> SetMultimap<K, V> unmodifiableSetMultimap(SetMultimap<K, V> delegate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> unmodifiableSetMultimap(SetMultimap<K, V> delegate) {
     if (delegate instanceof UnmodifiableSetMultimap || delegate instanceof ImmutableSetMultimap) {
       return delegate;
     }
@@ -920,8 +936,8 @@
    * @param multimap the multimap to be wrapped
    * @return a synchronized view of the specified multimap
    */
-  public static <K, V> SortedSetMultimap<K, V> synchronizedSortedSetMultimap(
-      SortedSetMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedSetMultimap<K, V> synchronizedSortedSetMultimap(SortedSetMultimap<K, V> multimap) {
     return Synchronized.sortedSetMultimap(multimap, null);
   }
 
@@ -936,8 +952,8 @@
    * @param delegate the multimap for which an unmodifiable view is to be returned
    * @return an unmodifiable view of the specified multimap
    */
-  public static <K, V> SortedSetMultimap<K, V> unmodifiableSortedSetMultimap(
-      SortedSetMultimap<K, V> delegate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedSetMultimap<K, V> unmodifiableSortedSetMultimap(SortedSetMultimap<K, V> delegate) {
     if (delegate instanceof UnmodifiableSortedSetMultimap) {
       return delegate;
     }
@@ -952,7 +968,8 @@
    * @param multimap the multimap to be wrapped
    * @return a synchronized view of the specified multimap
    */
-  public static <K, V> ListMultimap<K, V> synchronizedListMultimap(ListMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ListMultimap<K, V> synchronizedListMultimap(ListMultimap<K, V> multimap) {
     return Synchronized.listMultimap(multimap, null);
   }
 
@@ -967,7 +984,8 @@
    * @param delegate the multimap for which an unmodifiable view is to be returned
    * @return an unmodifiable view of the specified multimap
    */
-  public static <K, V> ListMultimap<K, V> unmodifiableListMultimap(ListMultimap<K, V> delegate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ListMultimap<K, V> unmodifiableListMultimap(ListMultimap<K, V> delegate) {
     if (delegate instanceof UnmodifiableListMultimap || delegate instanceof ImmutableListMultimap) {
       return delegate;
     }
@@ -994,7 +1012,8 @@
    * @param collection the collection for which to return an unmodifiable view
    * @return an unmodifiable view of the collection
    */
-  private static <V> Collection<V> unmodifiableValueCollection(Collection<V> collection) {
+  private static <V extends @Nullable Object> Collection<V> unmodifiableValueCollection(
+      Collection<V> collection) {
     if (collection instanceof SortedSet) {
       return Collections.unmodifiableSortedSet((SortedSet<V>) collection);
     } else if (collection instanceof Set) {
@@ -1013,8 +1032,8 @@
    * @param entries the entries for which to return an unmodifiable view
    * @return an unmodifiable view of the entries
    */
-  private static <K, V> Collection<Entry<K, V>> unmodifiableEntries(
-      Collection<Entry<K, V>> entries) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      Collection<Entry<K, V>> unmodifiableEntries(Collection<Entry<K, V>> entries) {
     if (entries instanceof Set) {
       return Maps.unmodifiableEntrySet((Set<Entry<K, V>>) entries);
     }
@@ -1030,7 +1049,8 @@
   @Beta
   @SuppressWarnings("unchecked")
   // safe by specification of ListMultimap.asMap()
-  public static <K, V> Map<K, List<V>> asMap(ListMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, List<V>> asMap(
+      ListMultimap<K, V> multimap) {
     return (Map<K, List<V>>) (Map<K, ?>) multimap.asMap();
   }
 
@@ -1043,7 +1063,8 @@
   @Beta
   @SuppressWarnings("unchecked")
   // safe by specification of SetMultimap.asMap()
-  public static <K, V> Map<K, Set<V>> asMap(SetMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, Set<V>> asMap(
+      SetMultimap<K, V> multimap) {
     return (Map<K, Set<V>>) (Map<K, ?>) multimap.asMap();
   }
 
@@ -1056,7 +1077,8 @@
   @Beta
   @SuppressWarnings("unchecked")
   // safe by specification of SortedSetMultimap.asMap()
-  public static <K, V> Map<K, SortedSet<V>> asMap(SortedSetMultimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> Map<K, SortedSet<V>> asMap(
+      SortedSetMultimap<K, V> multimap) {
     return (Map<K, SortedSet<V>>) (Map<K, ?>) multimap.asMap();
   }
 
@@ -1067,7 +1089,8 @@
    * @since 15.0
    */
   @Beta
-  public static <K, V> Map<K, Collection<V>> asMap(Multimap<K, V> multimap) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      Map<K, Collection<V>> asMap(Multimap<K, V> multimap) {
     return multimap.asMap();
   }
 
@@ -1086,13 +1109,14 @@
    *
    * @param map the backing map for the returned multimap view
    */
-  public static <K, V> SetMultimap<K, V> forMap(Map<K, V> map) {
+  public static <K extends @Nullable Object, V extends @Nullable Object> SetMultimap<K, V> forMap(
+      Map<K, V> map) {
     return new MapMultimap<>(map);
   }
 
   /** @see Multimaps#forMap */
-  private static class MapMultimap<K, V> extends AbstractMultimap<K, V>
-      implements SetMultimap<K, V>, Serializable {
+  private static class MapMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMultimap<K, V> implements SetMultimap<K, V>, Serializable {
     final Map<K, V> map;
 
     MapMultimap(Map<K, V> map) {
@@ -1105,22 +1129,22 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return map.containsKey(key);
     }
 
     @Override
-    public boolean containsValue(Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       return map.containsValue(value);
     }
 
     @Override
-    public boolean containsEntry(Object key, Object value) {
+    public boolean containsEntry(@CheckForNull Object key, @CheckForNull Object value) {
       return map.entrySet().contains(Maps.immutableEntry(key, value));
     }
 
     @Override
-    public Set<V> get(final K key) {
+    public Set<V> get(@ParametricNullness final K key) {
       return new Sets.ImprovedAbstractSet<V>() {
         @Override
         public Iterator<V> iterator() {
@@ -1133,12 +1157,17 @@
             }
 
             @Override
+            @ParametricNullness
             public V next() {
               if (!hasNext()) {
                 throw new NoSuchElementException();
               }
               i++;
-              return map.get(key);
+              /*
+               * The cast is safe because of the containsKey check in hasNext(). (That means it's
+               * unsafe under concurrent modification, but all bets are off then, anyway.)
+               */
+              return uncheckedCastNullableTToT(map.get(key));
             }
 
             @Override
@@ -1158,12 +1187,12 @@
     }
 
     @Override
-    public boolean put(K key, V value) {
+    public boolean put(@ParametricNullness K key, @ParametricNullness V value) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public boolean putAll(K key, Iterable<? extends V> values) {
+    public boolean putAll(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
@@ -1173,17 +1202,17 @@
     }
 
     @Override
-    public Set<V> replaceValues(K key, Iterable<? extends V> values) {
+    public Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public boolean remove(Object key, Object value) {
+    public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
       return map.entrySet().remove(Maps.immutableEntry(key, value));
     }
 
     @Override
-    public Set<V> removeAll(Object key) {
+    public Set<V> removeAll(@CheckForNull Object key) {
       Set<V> values = new HashSet<V>(2);
       if (!map.containsKey(key)) {
         return values;
@@ -1281,8 +1310,10 @@
    *
    * @since 7.0
    */
-  public static <K, V1, V2> Multimap<K, V2> transformValues(
-      Multimap<K, V1> fromMultimap, final Function<? super V1, V2> function) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Multimap<K, V2> transformValues(
+          Multimap<K, V1> fromMultimap, final Function<? super V1, V2> function) {
     checkNotNull(function);
     EntryTransformer<K, V1, V2> transformer = Maps.asEntryTransformer(function);
     return transformEntries(fromMultimap, transformer);
@@ -1328,8 +1359,10 @@
    *
    * @since 7.0
    */
-  public static <K, V1, V2> ListMultimap<K, V2> transformValues(
-      ListMultimap<K, V1> fromMultimap, final Function<? super V1, V2> function) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      ListMultimap<K, V2> transformValues(
+          ListMultimap<K, V1> fromMultimap, final Function<? super V1, V2> function) {
     checkNotNull(function);
     EntryTransformer<K, V1, V2> transformer = Maps.asEntryTransformer(function);
     return transformEntries(fromMultimap, transformer);
@@ -1386,8 +1419,10 @@
    *
    * @since 7.0
    */
-  public static <K, V1, V2> Multimap<K, V2> transformEntries(
-      Multimap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Multimap<K, V2> transformEntries(
+          Multimap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
     return new TransformedEntriesMultimap<>(fromMap, transformer);
   }
 
@@ -1439,12 +1474,16 @@
    *
    * @since 7.0
    */
-  public static <K, V1, V2> ListMultimap<K, V2> transformEntries(
-      ListMultimap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
+  public static <
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      ListMultimap<K, V2> transformEntries(
+          ListMultimap<K, V1> fromMap, EntryTransformer<? super K, ? super V1, V2> transformer) {
     return new TransformedEntriesListMultimap<>(fromMap, transformer);
   }
 
-  private static class TransformedEntriesMultimap<K, V1, V2> extends AbstractMultimap<K, V2> {
+  private static class TransformedEntriesMultimap<
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
+      extends AbstractMultimap<K, V2> {
     final Multimap<K, V1> fromMultimap;
     final EntryTransformer<? super K, ? super V1, V2> transformer;
 
@@ -1455,7 +1494,7 @@
       this.transformer = checkNotNull(transformer);
     }
 
-    Collection<V2> transform(K key, Collection<V1> values) {
+    Collection<V2> transform(@ParametricNullness K key, Collection<V1> values) {
       Function<? super V1, V2> function = Maps.asValueToValueFunction(transformer, key);
       if (values instanceof List) {
         return Lists.transform((List<V1>) values, function);
@@ -1470,7 +1509,7 @@
           fromMultimap.asMap(),
           new EntryTransformer<K, Collection<V1>, Collection<V2>>() {
             @Override
-            public Collection<V2> transformEntry(K key, Collection<V1> value) {
+            public Collection<V2> transformEntry(@ParametricNullness K key, Collection<V1> value) {
               return transform(key, value);
             }
           });
@@ -1482,7 +1521,7 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return fromMultimap.containsKey(key);
     }
 
@@ -1498,7 +1537,7 @@
     }
 
     @Override
-    public Collection<V2> get(final K key) {
+    public Collection<V2> get(@ParametricNullness final K key) {
       return transform(key, fromMultimap.get(key));
     }
 
@@ -1518,12 +1557,12 @@
     }
 
     @Override
-    public boolean put(K key, V2 value) {
+    public boolean put(@ParametricNullness K key, @ParametricNullness V2 value) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public boolean putAll(K key, Iterable<? extends V2> values) {
+    public boolean putAll(@ParametricNullness K key, Iterable<? extends V2> values) {
       throw new UnsupportedOperationException();
     }
 
@@ -1534,18 +1573,18 @@
 
     @SuppressWarnings("unchecked")
     @Override
-    public boolean remove(Object key, Object value) {
+    public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
       return get((K) key).remove(value);
     }
 
     @SuppressWarnings("unchecked")
     @Override
-    public Collection<V2> removeAll(Object key) {
+    public Collection<V2> removeAll(@CheckForNull Object key) {
       return transform((K) key, fromMultimap.removeAll(key));
     }
 
     @Override
-    public Collection<V2> replaceValues(K key, Iterable<? extends V2> values) {
+    public Collection<V2> replaceValues(@ParametricNullness K key, Iterable<? extends V2> values) {
       throw new UnsupportedOperationException();
     }
 
@@ -1561,7 +1600,8 @@
     }
   }
 
-  private static final class TransformedEntriesListMultimap<K, V1, V2>
+  private static final class TransformedEntriesListMultimap<
+          K extends @Nullable Object, V1 extends @Nullable Object, V2 extends @Nullable Object>
       extends TransformedEntriesMultimap<K, V1, V2> implements ListMultimap<K, V2> {
 
     TransformedEntriesListMultimap(
@@ -1570,23 +1610,23 @@
     }
 
     @Override
-    List<V2> transform(K key, Collection<V1> values) {
+    List<V2> transform(@ParametricNullness K key, Collection<V1> values) {
       return Lists.transform((List<V1>) values, Maps.asValueToValueFunction(transformer, key));
     }
 
     @Override
-    public List<V2> get(K key) {
+    public List<V2> get(@ParametricNullness K key) {
       return transform(key, fromMultimap.get(key));
     }
 
     @SuppressWarnings("unchecked")
     @Override
-    public List<V2> removeAll(Object key) {
+    public List<V2> removeAll(@CheckForNull Object key) {
       return transform((K) key, fromMultimap.removeAll(key));
     }
 
     @Override
-    public List<V2> replaceValues(K key, Iterable<? extends V2> values) {
+    public List<V2> replaceValues(@ParametricNullness K key, Iterable<? extends V2> values) {
       throw new UnsupportedOperationException();
     }
   }
@@ -1679,7 +1719,8 @@
     return builder.build();
   }
 
-  static class Keys<K, V> extends AbstractMultiset<K> {
+  static class Keys<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractMultiset<K> {
     @Weak final Multimap<K, V> multimap;
 
     Keys(Multimap<K, V> multimap) {
@@ -1694,6 +1735,7 @@
         Multiset.Entry<K> transform(final Map.Entry<K, Collection<V>> backingEntry) {
           return new Multisets.AbstractEntry<K>() {
             @Override
+            @ParametricNullness
             public K getElement() {
               return backingEntry.getKey();
             }
@@ -1729,7 +1771,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object element) {
+    public boolean contains(@CheckForNull Object element) {
       return multimap.containsKey(element);
     }
 
@@ -1739,13 +1781,13 @@
     }
 
     @Override
-    public int count(@Nullable Object element) {
+    public int count(@CheckForNull Object element) {
       Collection<V> values = Maps.safeGet(multimap.asMap(), element);
       return (values == null) ? 0 : values.size();
     }
 
     @Override
-    public int remove(@Nullable Object element, int occurrences) {
+    public int remove(@CheckForNull Object element, int occurrences) {
       checkNonnegative(occurrences, "occurrences");
       if (occurrences == 0) {
         return count(element);
@@ -1787,7 +1829,8 @@
   }
 
   /** A skeleton implementation of {@link Multimap#entries()}. */
-  abstract static class Entries<K, V> extends AbstractCollection<Map.Entry<K, V>> {
+  abstract static class Entries<K extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractCollection<Map.Entry<K, V>> {
     abstract Multimap<K, V> multimap();
 
     @Override
@@ -1796,7 +1839,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Map.Entry) {
         Map.Entry<?, ?> entry = (Map.Entry<?, ?>) o;
         return multimap().containsEntry(entry.getKey(), entry.getValue());
@@ -1805,7 +1848,7 @@
     }
 
     @Override
-    public boolean remove(@Nullable Object o) {
+    public boolean remove(@CheckForNull Object o) {
       if (o instanceof Map.Entry) {
         Map.Entry<?, ?> entry = (Map.Entry<?, ?>) o;
         return multimap().remove(entry.getKey(), entry.getValue());
@@ -1820,7 +1863,8 @@
   }
 
   /** A skeleton implementation of {@link Multimap#asMap()}. */
-  static final class AsMap<K, V> extends Maps.ViewCachingAbstractMap<K, Collection<V>> {
+  static final class AsMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends Maps.ViewCachingAbstractMap<K, Collection<V>> {
     @Weak private final Multimap<K, V> multimap;
 
     AsMap(Multimap<K, V> multimap) {
@@ -1837,7 +1881,7 @@
       return new EntrySet();
     }
 
-    void removeValuesForKey(Object key) {
+    void removeValuesForKey(@CheckForNull Object key) {
       multimap.keySet().remove(key);
     }
 
@@ -1854,18 +1898,19 @@
             multimap.keySet(),
             new Function<K, Collection<V>>() {
               @Override
-              public Collection<V> apply(K key) {
+              public Collection<V> apply(@ParametricNullness K key) {
                 return multimap.get(key);
               }
             });
       }
 
       @Override
-      public boolean remove(Object o) {
+      public boolean remove(@CheckForNull Object o) {
         if (!contains(o)) {
           return false;
         }
-        Map.Entry<?, ?> entry = (Map.Entry<?, ?>) o;
+        // requireNonNull is safe because of the contains check.
+        Map.Entry<?, ?> entry = requireNonNull((Map.Entry<?, ?>) o);
         removeValuesForKey(entry.getKey());
         return true;
       }
@@ -1873,12 +1918,14 @@
 
     @SuppressWarnings("unchecked")
     @Override
-    public Collection<V> get(Object key) {
+    @CheckForNull
+    public Collection<V> get(@CheckForNull Object key) {
       return containsKey(key) ? multimap.get((K) key) : null;
     }
 
     @Override
-    public Collection<V> remove(Object key) {
+    @CheckForNull
+    public Collection<V> remove(@CheckForNull Object key) {
       return containsKey(key) ? multimap.removeAll(key) : null;
     }
 
@@ -1893,7 +1940,7 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return multimap.containsKey(key);
     }
 
@@ -1930,7 +1977,7 @@
    *
    * @since 11.0
    */
-  public static <K, V> Multimap<K, V> filterKeys(
+  public static <K extends @Nullable Object, V extends @Nullable Object> Multimap<K, V> filterKeys(
       Multimap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     if (unfiltered instanceof SetMultimap) {
       return filterKeys((SetMultimap<K, V>) unfiltered, keyPredicate);
@@ -1975,8 +2022,9 @@
    *
    * @since 14.0
    */
-  public static <K, V> SetMultimap<K, V> filterKeys(
-      SetMultimap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> filterKeys(
+          SetMultimap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     if (unfiltered instanceof FilteredKeySetMultimap) {
       FilteredKeySetMultimap<K, V> prev = (FilteredKeySetMultimap<K, V>) unfiltered;
       return new FilteredKeySetMultimap<>(
@@ -2016,8 +2064,9 @@
    *
    * @since 14.0
    */
-  public static <K, V> ListMultimap<K, V> filterKeys(
-      ListMultimap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      ListMultimap<K, V> filterKeys(
+          ListMultimap<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
     if (unfiltered instanceof FilteredKeyListMultimap) {
       FilteredKeyListMultimap<K, V> prev = (FilteredKeyListMultimap<K, V>) unfiltered;
       return new FilteredKeyListMultimap<>(
@@ -2054,8 +2103,9 @@
    *
    * @since 11.0
    */
-  public static <K, V> Multimap<K, V> filterValues(
-      Multimap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      Multimap<K, V> filterValues(
+          Multimap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
 
@@ -2086,8 +2136,9 @@
    *
    * @since 14.0
    */
-  public static <K, V> SetMultimap<K, V> filterValues(
-      SetMultimap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> filterValues(
+          SetMultimap<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
     return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
   }
 
@@ -2116,8 +2167,9 @@
    *
    * @since 11.0
    */
-  public static <K, V> Multimap<K, V> filterEntries(
-      Multimap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      Multimap<K, V> filterEntries(
+          Multimap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(entryPredicate);
     if (unfiltered instanceof SetMultimap) {
       return filterEntries((SetMultimap<K, V>) unfiltered, entryPredicate);
@@ -2152,8 +2204,9 @@
    *
    * @since 14.0
    */
-  public static <K, V> SetMultimap<K, V> filterEntries(
-      SetMultimap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
+  public static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> filterEntries(
+          SetMultimap<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
     checkNotNull(entryPredicate);
     return (unfiltered instanceof FilteredSetMultimap)
         ? filterFiltered((FilteredSetMultimap<K, V>) unfiltered, entryPredicate)
@@ -2166,8 +2219,9 @@
    * lead to a multimap whose removal operations would fail. This method combines the predicates to
    * avoid that problem.
    */
-  private static <K, V> Multimap<K, V> filterFiltered(
-      FilteredMultimap<K, V> multimap, Predicate<? super Entry<K, V>> entryPredicate) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      Multimap<K, V> filterFiltered(
+          FilteredMultimap<K, V> multimap, Predicate<? super Entry<K, V>> entryPredicate) {
     Predicate<Entry<K, V>> predicate =
         Predicates.<Entry<K, V>>and(multimap.entryPredicate(), entryPredicate);
     return new FilteredEntryMultimap<>(multimap.unfiltered(), predicate);
@@ -2179,14 +2233,15 @@
    * lead to a multimap whose removal operations would fail. This method combines the predicates to
    * avoid that problem.
    */
-  private static <K, V> SetMultimap<K, V> filterFiltered(
-      FilteredSetMultimap<K, V> multimap, Predicate<? super Entry<K, V>> entryPredicate) {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      SetMultimap<K, V> filterFiltered(
+          FilteredSetMultimap<K, V> multimap, Predicate<? super Entry<K, V>> entryPredicate) {
     Predicate<Entry<K, V>> predicate =
         Predicates.<Entry<K, V>>and(multimap.entryPredicate(), entryPredicate);
     return new FilteredEntrySetMultimap<>(multimap.unfiltered(), predicate);
   }
 
-  static boolean equalsImpl(Multimap<?, ?> multimap, @Nullable Object object) {
+  static boolean equalsImpl(Multimap<?, ?> multimap, @CheckForNull Object object) {
     if (object == multimap) {
       return true;
     }
diff --git a/guava/src/com/google/common/collect/Multiset.java b/guava/src/com/google/common/collect/Multiset.java
index 7fe885b..e7c7d62 100644
--- a/guava/src/com/google/common/collect/Multiset.java
+++ b/guava/src/com/google/common/collect/Multiset.java
@@ -30,6 +30,7 @@
 import java.util.Spliterator;
 import java.util.function.Consumer;
 import java.util.function.ObjIntConsumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -67,6 +68,10 @@
  * <p>A multiset uses {@link Object#equals} to determine whether two instances should be considered
  * "the same," <i>unless specified otherwise</i> by the implementation.
  *
+ * <p><b>Warning:</b> as with normal {@link Set}s, it is almost always a bad idea to modify an
+ * element (in a way that affects its {@link Object#equals} behavior) while it is contained in a
+ * multiset. Undefined behavior and bugs will result.
+ *
  * <p>Common implementations include {@link ImmutableMultiset}, {@link HashMultiset}, and {@link
  * ConcurrentHashMultiset}.
  *
@@ -82,7 +87,8 @@
  * @since 2.0
  */
 @GwtCompatible
-public interface Multiset<E> extends Collection<E> {
+@ElementTypesAreNonnullByDefault
+public interface Multiset<E extends @Nullable Object> extends Collection<E> {
   // Query Operations
 
   /**
@@ -107,7 +113,7 @@
    * @return the number of occurrences of the element in this multiset; possibly zero but never
    *     negative
    */
-  int count(@Nullable @CompatibleWith("E") Object element);
+  int count(@CompatibleWith("E") @CheckForNull Object element);
 
   // Bulk Operations
 
@@ -130,7 +136,7 @@
    *     return normally.
    */
   @CanIgnoreReturnValue
-  int add(@Nullable E element, int occurrences);
+  int add(@ParametricNullness E element, int occurrences);
 
   /**
    * Adds a single occurrence of the specified element to this multiset.
@@ -153,7 +159,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  boolean add(E element);
+  boolean add(@ParametricNullness E element);
 
   /**
    * Removes a number of occurrences of the specified element from this multiset. If the multiset
@@ -168,7 +174,7 @@
    * @throws IllegalArgumentException if {@code occurrences} is negative
    */
   @CanIgnoreReturnValue
-  int remove(@Nullable @CompatibleWith("E") Object element, int occurrences);
+  int remove(@CompatibleWith("E") @CheckForNull Object element, int occurrences);
 
   /**
    * Removes a <i>single</i> occurrence of the specified element from this multiset, if present.
@@ -184,7 +190,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  boolean remove(@Nullable Object element);
+  boolean remove(@CheckForNull Object element);
 
   /**
    * Adds or removes the necessary occurrences of an element such that the element attains the
@@ -200,7 +206,7 @@
    *     zero instead.
    */
   @CanIgnoreReturnValue
-  int setCount(E element, int count);
+  int setCount(@ParametricNullness E element, int count);
 
   /**
    * Conditionally sets the count of an element to a new value, as described in {@link
@@ -219,7 +225,7 @@
    *     implementor may optionally return {@code true} instead.
    */
   @CanIgnoreReturnValue
-  boolean setCount(E element, int oldCount, int newCount);
+  boolean setCount(@ParametricNullness E element, int oldCount, int newCount);
 
   // Views
 
@@ -265,7 +271,7 @@
    *
    * @since 2.0
    */
-  interface Entry<E> {
+  interface Entry<E extends @Nullable Object> {
 
     /**
      * Returns the multiset element corresponding to this entry. Multiple calls to this method
@@ -273,6 +279,7 @@
      *
      * @return the element corresponding to this entry
      */
+    @ParametricNullness
     E getElement();
 
     /**
@@ -300,7 +307,7 @@
      */
     @Override
     // TODO(kevinb): check this wrt TreeMultiset?
-    boolean equals(Object o);
+    boolean equals(@CheckForNull Object o);
 
     /**
      * {@inheritDoc}
@@ -348,7 +355,7 @@
    */
   @Override
   // TODO(kevinb): caveats about equivalence-relation?
-  boolean equals(@Nullable Object object);
+  boolean equals(@CheckForNull Object object);
 
   /**
    * Returns the hash code for this multiset. This is defined as the sum of
@@ -394,7 +401,7 @@
    * @return {@code true} if this multiset contains at least one occurrence of the element
    */
   @Override
-  boolean contains(@Nullable Object element);
+  boolean contains(@CheckForNull Object element);
 
   /**
    * Returns {@code true} if this multiset contains at least one occurrence of each element in the
diff --git a/guava/src/com/google/common/collect/Multisets.java b/guava/src/com/google/common/collect/Multisets.java
index 36d146e..e3203d2 100644
--- a/guava/src/com/google/common/collect/Multisets.java
+++ b/guava/src/com/google/common/collect/Multisets.java
@@ -20,6 +20,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
 import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -39,7 +40,11 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.Spliterator;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.function.ToIntFunction;
 import java.util.stream.Collector;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -55,6 +60,7 @@
  * @since 2.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Multisets {
   private Multisets() {}
 
@@ -70,22 +76,17 @@
    * <p>Note that {@code stream.collect(toMultiset(function, e -> 1, supplier))} is equivalent to
    * {@code stream.map(function).collect(Collectors.toCollection(supplier))}.
    *
+   * <p>To collect to an {@link ImmutableMultiset}, use {@link
+   * ImmutableMultiset#toImmutableMultiset}.
+   *
    * @since 22.0
    */
-  public static <T, E, M extends Multiset<E>> Collector<T, ?, M> toMultiset(
-      java.util.function.Function<? super T, E> elementFunction,
-      java.util.function.ToIntFunction<? super T> countFunction,
-      java.util.function.Supplier<M> multisetSupplier) {
-    checkNotNull(elementFunction);
-    checkNotNull(countFunction);
-    checkNotNull(multisetSupplier);
-    return Collector.of(
-        multisetSupplier,
-        (ms, t) -> ms.add(elementFunction.apply(t), countFunction.applyAsInt(t)),
-        (ms1, ms2) -> {
-          ms1.addAll(ms2);
-          return ms1;
-        });
+  public static <T extends @Nullable Object, E extends @Nullable Object, M extends Multiset<E>>
+      Collector<T, ?, M> toMultiset(
+          Function<? super T, E> elementFunction,
+          ToIntFunction<? super T> countFunction,
+          Supplier<M> multisetSupplier) {
+    return CollectCollectors.toMultiset(elementFunction, countFunction, multisetSupplier);
   }
 
   /**
@@ -98,7 +99,8 @@
    * @param multiset the multiset for which an unmodifiable view is to be generated
    * @return an unmodifiable view of the multiset
    */
-  public static <E> Multiset<E> unmodifiableMultiset(Multiset<? extends E> multiset) {
+  public static <E extends @Nullable Object> Multiset<E> unmodifiableMultiset(
+      Multiset<? extends E> multiset) {
     if (multiset instanceof UnmodifiableMultiset || multiset instanceof ImmutableMultiset) {
       @SuppressWarnings("unchecked") // Since it's unmodifiable, the covariant cast is safe
       Multiset<E> result = (Multiset<E>) multiset;
@@ -118,7 +120,8 @@
     return checkNotNull(multiset);
   }
 
-  static class UnmodifiableMultiset<E> extends ForwardingMultiset<E> implements Serializable {
+  static class UnmodifiableMultiset<E extends @Nullable Object> extends ForwardingMultiset<E>
+      implements Serializable {
     final Multiset<? extends E> delegate;
 
     UnmodifiableMultiset(Multiset<? extends E> delegate) {
@@ -132,7 +135,7 @@
       return (Multiset<E>) delegate;
     }
 
-    transient @Nullable Set<E> elementSet;
+    @CheckForNull transient Set<E> elementSet;
 
     Set<E> createElementSet() {
       return Collections.<E>unmodifiableSet(delegate.elementSet());
@@ -144,7 +147,7 @@
       return (es == null) ? elementSet = createElementSet() : es;
     }
 
-    transient @Nullable Set<Multiset.Entry<E>> entrySet;
+    @CheckForNull transient Set<Multiset.Entry<E>> entrySet;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -163,12 +166,12 @@
     }
 
     @Override
-    public boolean add(E element) {
+    public boolean add(@ParametricNullness E element) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public int add(E element, int occurences) {
+    public int add(@ParametricNullness E element, int occurrences) {
       throw new UnsupportedOperationException();
     }
 
@@ -178,12 +181,12 @@
     }
 
     @Override
-    public boolean remove(Object element) {
+    public boolean remove(@CheckForNull Object element) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public int remove(Object element, int occurrences) {
+    public int remove(@CheckForNull Object element, int occurrences) {
       throw new UnsupportedOperationException();
     }
 
@@ -203,12 +206,12 @@
     }
 
     @Override
-    public int setCount(E element, int count) {
+    public int setCount(@ParametricNullness E element, int count) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public boolean setCount(E element, int oldCount, int newCount) {
+    public boolean setCount(@ParametricNullness E element, int oldCount, int newCount) {
       throw new UnsupportedOperationException();
     }
 
@@ -227,7 +230,8 @@
    * @since 11.0
    */
   @Beta
-  public static <E> SortedMultiset<E> unmodifiableSortedMultiset(SortedMultiset<E> sortedMultiset) {
+  public static <E extends @Nullable Object> SortedMultiset<E> unmodifiableSortedMultiset(
+      SortedMultiset<E> sortedMultiset) {
     // it's in its own file so it can be emulated for GWT
     return new UnmodifiableSortedMultiset<E>(checkNotNull(sortedMultiset));
   }
@@ -240,22 +244,25 @@
    * @param n the count to be associated with the returned entry
    * @throws IllegalArgumentException if {@code n} is negative
    */
-  public static <E> Multiset.Entry<E> immutableEntry(@Nullable E e, int n) {
+  public static <E extends @Nullable Object> Multiset.Entry<E> immutableEntry(
+      @ParametricNullness E e, int n) {
     return new ImmutableEntry<E>(e, n);
   }
 
-  static class ImmutableEntry<E> extends AbstractEntry<E> implements Serializable {
-    private final @Nullable E element;
+  static class ImmutableEntry<E extends @Nullable Object> extends AbstractEntry<E>
+      implements Serializable {
+    @ParametricNullness private final E element;
     private final int count;
 
-    ImmutableEntry(@Nullable E element, int count) {
+    ImmutableEntry(@ParametricNullness E element, int count) {
       this.element = element;
       this.count = count;
       checkNonnegative(count, "count");
     }
 
     @Override
-    public final @Nullable E getElement() {
+    @ParametricNullness
+    public final E getElement() {
       return element;
     }
 
@@ -264,6 +271,7 @@
       return count;
     }
 
+    @CheckForNull
     public ImmutableEntry<E> nextInBucket() {
       return null;
     }
@@ -297,7 +305,8 @@
    * @since 14.0
    */
   @Beta
-  public static <E> Multiset<E> filter(Multiset<E> unfiltered, Predicate<? super E> predicate) {
+  public static <E extends @Nullable Object> Multiset<E> filter(
+      Multiset<E> unfiltered, Predicate<? super E> predicate) {
     if (unfiltered instanceof FilteredMultiset) {
       // Support clear(), removeAll(), and retainAll() when filtering a filtered
       // collection.
@@ -308,7 +317,7 @@
     return new FilteredMultiset<E>(unfiltered, predicate);
   }
 
-  private static final class FilteredMultiset<E> extends ViewMultiset<E> {
+  private static final class FilteredMultiset<E extends @Nullable Object> extends ViewMultiset<E> {
     final Multiset<E> unfiltered;
     final Predicate<? super E> predicate;
 
@@ -350,7 +359,7 @@
     }
 
     @Override
-    public int count(@Nullable Object element) {
+    public int count(@CheckForNull Object element) {
       int count = unfiltered.count(element);
       if (count > 0) {
         @SuppressWarnings("unchecked") // element is equal to an E
@@ -361,14 +370,14 @@
     }
 
     @Override
-    public int add(@Nullable E element, int occurrences) {
+    public int add(@ParametricNullness E element, int occurrences) {
       checkArgument(
           predicate.apply(element), "Element %s does not match predicate %s", element, predicate);
       return unfiltered.add(element, occurrences);
     }
 
     @Override
-    public int remove(@Nullable Object element, int occurrences) {
+    public int remove(@CheckForNull Object element, int occurrences) {
       checkNonnegative(occurrences, "occurrences");
       if (occurrences == 0) {
         return count(element);
@@ -403,14 +412,14 @@
    * @since 14.0
    */
   @Beta
-  public static <E> Multiset<E> union(
+  public static <E extends @Nullable Object> Multiset<E> union(
       final Multiset<? extends E> multiset1, final Multiset<? extends E> multiset2) {
     checkNotNull(multiset1);
     checkNotNull(multiset2);
 
     return new ViewMultiset<E>() {
       @Override
-      public boolean contains(@Nullable Object element) {
+      public boolean contains(@CheckForNull Object element) {
         return multiset1.contains(element) || multiset2.contains(element);
       }
 
@@ -420,7 +429,7 @@
       }
 
       @Override
-      public int count(Object element) {
+      public int count(@CheckForNull Object element) {
         return Math.max(multiset1.count(element), multiset2.count(element));
       }
 
@@ -441,6 +450,7 @@
         // TODO(lowasser): consider making the entries live views
         return new AbstractIterator<Entry<E>>() {
           @Override
+          @CheckForNull
           protected Entry<E> computeNext() {
             if (iterator1.hasNext()) {
               Entry<? extends E> entry1 = iterator1.next();
@@ -474,14 +484,14 @@
    *
    * @since 2.0
    */
-  public static <E> Multiset<E> intersection(
+  public static <E extends @Nullable Object> Multiset<E> intersection(
       final Multiset<E> multiset1, final Multiset<?> multiset2) {
     checkNotNull(multiset1);
     checkNotNull(multiset2);
 
     return new ViewMultiset<E>() {
       @Override
-      public int count(Object element) {
+      public int count(@CheckForNull Object element) {
         int count1 = multiset1.count(element);
         return (count1 == 0) ? 0 : Math.min(count1, multiset2.count(element));
       }
@@ -502,6 +512,7 @@
         // TODO(lowasser): consider making the entries live views
         return new AbstractIterator<Entry<E>>() {
           @Override
+          @CheckForNull
           protected Entry<E> computeNext() {
             while (iterator1.hasNext()) {
               Entry<E> entry1 = iterator1.next();
@@ -531,7 +542,7 @@
    * @since 14.0
    */
   @Beta
-  public static <E> Multiset<E> sum(
+  public static <E extends @Nullable Object> Multiset<E> sum(
       final Multiset<? extends E> multiset1, final Multiset<? extends E> multiset2) {
     checkNotNull(multiset1);
     checkNotNull(multiset2);
@@ -539,7 +550,7 @@
     // TODO(lowasser): consider making the entries live views
     return new ViewMultiset<E>() {
       @Override
-      public boolean contains(@Nullable Object element) {
+      public boolean contains(@CheckForNull Object element) {
         return multiset1.contains(element) || multiset2.contains(element);
       }
 
@@ -554,7 +565,7 @@
       }
 
       @Override
-      public int count(Object element) {
+      public int count(@CheckForNull Object element) {
         return multiset1.count(element) + multiset2.count(element);
       }
 
@@ -574,6 +585,7 @@
         final Iterator<? extends Entry<? extends E>> iterator2 = multiset2.entrySet().iterator();
         return new AbstractIterator<Entry<E>>() {
           @Override
+          @CheckForNull
           protected Entry<E> computeNext() {
             if (iterator1.hasNext()) {
               Entry<? extends E> entry1 = iterator1.next();
@@ -608,7 +620,7 @@
    * @since 14.0
    */
   @Beta
-  public static <E> Multiset<E> difference(
+  public static <E extends @Nullable Object> Multiset<E> difference(
       final Multiset<E> multiset1, final Multiset<?> multiset2) {
     checkNotNull(multiset1);
     checkNotNull(multiset2);
@@ -616,7 +628,7 @@
     // TODO(lowasser): consider making the entries live views
     return new ViewMultiset<E>() {
       @Override
-      public int count(@Nullable Object element) {
+      public int count(@CheckForNull Object element) {
         int count1 = multiset1.count(element);
         return (count1 == 0) ? 0 : Math.max(0, count1 - multiset2.count(element));
       }
@@ -631,6 +643,7 @@
         final Iterator<Entry<E>> iterator1 = multiset1.entrySet().iterator();
         return new AbstractIterator<E>() {
           @Override
+          @CheckForNull
           protected E computeNext() {
             while (iterator1.hasNext()) {
               Entry<E> entry1 = iterator1.next();
@@ -649,6 +662,7 @@
         final Iterator<Entry<E>> iterator1 = multiset1.entrySet().iterator();
         return new AbstractIterator<Entry<E>>() {
           @Override
+          @CheckForNull
           protected Entry<E> computeNext() {
             while (iterator1.hasNext()) {
               Entry<E> entry1 = iterator1.next();
@@ -712,7 +726,7 @@
   }
 
   /** Delegate implementation which cares about the element type. */
-  private static <E> boolean retainOccurrencesImpl(
+  private static <E extends @Nullable Object> boolean retainOccurrencesImpl(
       Multiset<E> multisetToModify, Multiset<?> occurrencesToRetain) {
     checkNotNull(multisetToModify);
     checkNotNull(occurrencesToRetain);
@@ -820,13 +834,13 @@
    * Implementation of the {@code equals}, {@code hashCode}, and {@code toString} methods of {@link
    * Multiset.Entry}.
    */
-  abstract static class AbstractEntry<E> implements Multiset.Entry<E> {
+  abstract static class AbstractEntry<E extends @Nullable Object> implements Multiset.Entry<E> {
     /**
      * Indicates whether an object equals this entry, following the behavior specified in {@link
      * Multiset.Entry#equals}.
      */
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof Multiset.Entry) {
         Multiset.Entry<?> that = (Multiset.Entry<?>) object;
         return this.getCount() == that.getCount()
@@ -860,7 +874,7 @@
   }
 
   /** An implementation of {@link Multiset#equals}. */
-  static boolean equalsImpl(Multiset<?> multiset, @Nullable Object object) {
+  static boolean equalsImpl(Multiset<?> multiset, @CheckForNull Object object) {
     if (object == multiset) {
       return true;
     }
@@ -886,7 +900,8 @@
   }
 
   /** An implementation of {@link Multiset#addAll}. */
-  static <E> boolean addAllImpl(Multiset<E> self, Collection<? extends E> elements) {
+  static <E extends @Nullable Object> boolean addAllImpl(
+      Multiset<E> self, Collection<? extends E> elements) {
     checkNotNull(self);
     checkNotNull(elements);
     if (elements instanceof Multiset) {
@@ -899,7 +914,8 @@
   }
 
   /** A specialization of {@code addAllImpl} for when {@code elements} is itself a Multiset. */
-  private static <E> boolean addAllImpl(Multiset<E> self, Multiset<? extends E> elements) {
+  private static <E extends @Nullable Object> boolean addAllImpl(
+      Multiset<E> self, Multiset<? extends E> elements) {
     if (elements.isEmpty()) {
       return false;
     }
@@ -929,7 +945,8 @@
   }
 
   /** An implementation of {@link Multiset#setCount(Object, int)}. */
-  static <E> int setCountImpl(Multiset<E> self, E element, int count) {
+  static <E extends @Nullable Object> int setCountImpl(
+      Multiset<E> self, @ParametricNullness E element, int count) {
     checkNonnegative(count, "count");
 
     int oldCount = self.count(element);
@@ -945,7 +962,8 @@
   }
 
   /** An implementation of {@link Multiset#setCount(Object, int, int)}. */
-  static <E> boolean setCountImpl(Multiset<E> self, E element, int oldCount, int newCount) {
+  static <E extends @Nullable Object> boolean setCountImpl(
+      Multiset<E> self, @ParametricNullness E element, int oldCount, int newCount) {
     checkNonnegative(oldCount, "oldCount");
     checkNonnegative(newCount, "newCount");
 
@@ -957,16 +975,18 @@
     }
   }
 
-  static <E> Iterator<E> elementIterator(Iterator<Entry<E>> entryIterator) {
+  static <E extends @Nullable Object> Iterator<E> elementIterator(
+      Iterator<Entry<E>> entryIterator) {
     return new TransformedIterator<Entry<E>, E>(entryIterator) {
       @Override
+      @ParametricNullness
       E transform(Entry<E> entry) {
         return entry.getElement();
       }
     };
   }
 
-  abstract static class ElementSet<E> extends Sets.ImprovedAbstractSet<E> {
+  abstract static class ElementSet<E extends @Nullable Object> extends Sets.ImprovedAbstractSet<E> {
     abstract Multiset<E> multiset();
 
     @Override
@@ -975,7 +995,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       return multiset().contains(o);
     }
 
@@ -993,7 +1013,7 @@
     public abstract Iterator<E> iterator();
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       return multiset().remove(o, Integer.MAX_VALUE) > 0;
     }
 
@@ -1003,11 +1023,12 @@
     }
   }
 
-  abstract static class EntrySet<E> extends Sets.ImprovedAbstractSet<Entry<E>> {
+  abstract static class EntrySet<E extends @Nullable Object>
+      extends Sets.ImprovedAbstractSet<Entry<E>> {
     abstract Multiset<E> multiset();
 
     @Override
-    public boolean contains(@Nullable Object o) {
+    public boolean contains(@CheckForNull Object o) {
       if (o instanceof Entry) {
         /*
          * The GWT compiler wrongly issues a warning here.
@@ -1026,15 +1047,16 @@
     // GWT compiler warning; see contains().
     @SuppressWarnings("cast")
     @Override
-    public boolean remove(Object object) {
+    public boolean remove(@CheckForNull Object object) {
       if (object instanceof Multiset.Entry) {
         Entry<?> entry = (Entry<?>) object;
         Object element = entry.getElement();
         int entryCount = entry.getCount();
         if (entryCount != 0) {
           // Safe as long as we never add a new entry, which we won't.
-          @SuppressWarnings("unchecked")
-          Multiset<Object> multiset = (Multiset<Object>) multiset();
+          // (Presumably it can still throw CCE/NPE but only if the underlying Multiset does.)
+          @SuppressWarnings({"unchecked", "nullness"})
+          Multiset<@Nullable Object> multiset = (Multiset<@Nullable Object>) multiset();
           return multiset.setCount(element, entryCount, 0);
         }
       }
@@ -1048,14 +1070,14 @@
   }
 
   /** An implementation of {@link Multiset#iterator}. */
-  static <E> Iterator<E> iteratorImpl(Multiset<E> multiset) {
+  static <E extends @Nullable Object> Iterator<E> iteratorImpl(Multiset<E> multiset) {
     return new MultisetIteratorImpl<E>(multiset, multiset.entrySet().iterator());
   }
 
-  static final class MultisetIteratorImpl<E> implements Iterator<E> {
+  static final class MultisetIteratorImpl<E extends @Nullable Object> implements Iterator<E> {
     private final Multiset<E> multiset;
     private final Iterator<Entry<E>> entryIterator;
-    private @Nullable Entry<E> currentEntry;
+    @CheckForNull private Entry<E> currentEntry;
 
     /** Count of subsequent elements equal to current element */
     private int laterCount;
@@ -1076,6 +1098,7 @@
     }
 
     @Override
+    @ParametricNullness
     public E next() {
       if (!hasNext()) {
         throw new NoSuchElementException();
@@ -1086,7 +1109,11 @@
       }
       laterCount--;
       canRemove = true;
-      return currentEntry.getElement();
+      /*
+       * requireNonNull is safe because laterCount starts at 0, forcing us to initialize
+       * currentEntry above. After that, we never clear it.
+       */
+      return requireNonNull(currentEntry).getElement();
     }
 
     @Override
@@ -1095,14 +1122,18 @@
       if (totalCount == 1) {
         entryIterator.remove();
       } else {
-        multiset.remove(currentEntry.getElement());
+        /*
+         * requireNonNull is safe because canRemove is set to true only after we initialize
+         * currentEntry (which we never subsequently clear).
+         */
+        multiset.remove(requireNonNull(currentEntry).getElement());
       }
       totalCount--;
       canRemove = false;
     }
   }
 
-  static <E> Spliterator<E> spliteratorImpl(Multiset<E> multiset) {
+  static <E extends @Nullable Object> Spliterator<E> spliteratorImpl(Multiset<E> multiset) {
     Spliterator<Entry<E>> entrySpliterator = multiset.entrySet().spliterator();
     return CollectSpliterators.flatMap(
         entrySpliterator,
@@ -1123,7 +1154,7 @@
   }
 
   /** Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557 */
-  static <T> Multiset<T> cast(Iterable<T> iterable) {
+  static <T extends @Nullable Object> Multiset<T> cast(Iterable<T> iterable) {
     return (Multiset<T>) iterable;
   }
 
@@ -1153,7 +1184,8 @@
    * An {@link AbstractMultiset} with additional default implementations, some of them linear-time
    * implementations in terms of {@code elementSet} and {@code entrySet}.
    */
-  private abstract static class ViewMultiset<E> extends AbstractMultiset<E> {
+  private abstract static class ViewMultiset<E extends @Nullable Object>
+      extends AbstractMultiset<E> {
     @Override
     public int size() {
       return linearTimeSizeImpl(this);
diff --git a/guava/src/com/google/common/collect/MutableClassToInstanceMap.java b/guava/src/com/google/common/collect/MutableClassToInstanceMap.java
index c3ad908..83fbe94 100644
--- a/guava/src/com/google/common/collect/MutableClassToInstanceMap.java
+++ b/guava/src/com/google/common/collect/MutableClassToInstanceMap.java
@@ -28,20 +28,26 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.Spliterator;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A mutable class-to-instance map backed by an arbitrary user-provided map. See also {@link
  * ImmutableClassToInstanceMap}.
  *
  * <p>See the Guava User Guide article on <a href=
- * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#classtoinstancemap"> {@code
+ * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#classtoinstancemap">{@code
  * ClassToInstanceMap}</a>.
  *
+ * <p>This implementation <i>does</i> support null values, despite how it is annotated; see
+ * discussion at {@link ClassToInstanceMap}.
+ *
  * @author Kevin Bourrillion
  * @since 2.0
  */
 @GwtIncompatible
 @SuppressWarnings("serial") // using writeReplace instead of standard serialization
+@ElementTypesAreNonnullByDefault
 public final class MutableClassToInstanceMap<B> extends ForwardingMap<Class<? extends B>, B>
     implements ClassToInstanceMap<B>, Serializable {
 
@@ -119,11 +125,20 @@
 
       @Override
       public Object[] toArray() {
-        return standardToArray();
+        /*
+         * standardToArray returns `@Nullable Object[]` rather than `Object[]` but only because it
+         * can be used with collections that may contain null. This collection is a collection of
+         * non-null Entry objects (Entry objects that might contain null values but are not
+         * themselves null), so we can treat it as a plain `Object[]`.
+         */
+        @SuppressWarnings("nullness")
+        Object[] result = standardToArray();
+        return result;
       }
 
       @Override
-      public <T> T[] toArray(T[] array) {
+      @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+      public <T extends @Nullable Object> T[] toArray(T[] array) {
         return standardToArray(array);
       }
     };
@@ -131,6 +146,7 @@
 
   @Override
   @CanIgnoreReturnValue
+  @CheckForNull
   public B put(Class<? extends B> key, B value) {
     return super.put(key, cast(key, value));
   }
@@ -146,17 +162,20 @@
 
   @CanIgnoreReturnValue
   @Override
+  @CheckForNull
   public <T extends B> T putInstance(Class<T> type, T value) {
     return cast(type, put(type, value));
   }
 
   @Override
+  @CheckForNull
   public <T extends B> T getInstance(Class<T> type) {
     return cast(type, get(type));
   }
 
   @CanIgnoreReturnValue
-  private static <B, T extends B> T cast(Class<T> type, B value) {
+  @CheckForNull
+  private static <B, T extends B> T cast(Class<T> type, @CheckForNull B value) {
     return Primitives.wrap(type).cast(value);
   }
 
diff --git a/guava/src/com/google/common/collect/NaturalOrdering.java b/guava/src/com/google/common/collect/NaturalOrdering.java
index c4b98e3..8cb8aef 100644
--- a/guava/src/com/google/common/collect/NaturalOrdering.java
+++ b/guava/src/com/google/common/collect/NaturalOrdering.java
@@ -20,44 +20,46 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering that uses the natural order of the values. */
 @GwtCompatible(serializable = true)
 @SuppressWarnings({"unchecked", "rawtypes"}) // TODO(kevinb): the right way to explain this??
-final class NaturalOrdering extends Ordering<Comparable> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class NaturalOrdering extends Ordering<Comparable<?>> implements Serializable {
   static final NaturalOrdering INSTANCE = new NaturalOrdering();
 
-  private transient @Nullable Ordering<Comparable> nullsFirst;
-  private transient @Nullable Ordering<Comparable> nullsLast;
+  @CheckForNull private transient Ordering<@Nullable Comparable<?>> nullsFirst;
+  @CheckForNull private transient Ordering<@Nullable Comparable<?>> nullsLast;
 
   @Override
-  public int compare(Comparable left, Comparable right) {
+  public int compare(Comparable<?> left, Comparable<?> right) {
     checkNotNull(left); // for GWT
     checkNotNull(right);
-    return left.compareTo(right);
+    return ((Comparable<Object>) left).compareTo(right);
   }
 
   @Override
-  public <S extends Comparable> Ordering<S> nullsFirst() {
-    Ordering<Comparable> result = nullsFirst;
+  public <S extends Comparable<?>> Ordering<@Nullable S> nullsFirst() {
+    Ordering<@Nullable Comparable<?>> result = nullsFirst;
     if (result == null) {
-      result = nullsFirst = super.nullsFirst();
+      result = nullsFirst = super.<Comparable<?>>nullsFirst();
     }
-    return (Ordering<S>) result;
+    return (Ordering<@Nullable S>) result;
   }
 
   @Override
-  public <S extends Comparable> Ordering<S> nullsLast() {
-    Ordering<Comparable> result = nullsLast;
+  public <S extends Comparable<?>> Ordering<@Nullable S> nullsLast() {
+    Ordering<@Nullable Comparable<?>> result = nullsLast;
     if (result == null) {
-      result = nullsLast = super.nullsLast();
+      result = nullsLast = super.<Comparable<?>>nullsLast();
     }
-    return (Ordering<S>) result;
+    return (Ordering<@Nullable S>) result;
   }
 
   @Override
-  public <S extends Comparable> Ordering<S> reverse() {
+  public <S extends Comparable<?>> Ordering<S> reverse() {
     return (Ordering<S>) ReverseNaturalOrdering.INSTANCE;
   }
 
diff --git a/guava/src/com/google/common/collect/NullnessCasts.java b/guava/src/com/google/common/collect/NullnessCasts.java
new file mode 100644
index 0000000..6ceeda7
--- /dev/null
+++ b/guava/src/com/google/common/collect/NullnessCasts.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.collect;
+
+import com.google.common.annotations.GwtCompatible;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/** A utility method to perform unchecked casts to suppress errors produced by nullness analyses. */
+@GwtCompatible
+@ElementTypesAreNonnullByDefault
+final class NullnessCasts {
+  /**
+   * Accepts a {@code @Nullable T} and returns a plain {@code T}, without performing any check that
+   * that conversion is safe.
+   *
+   * <p>This method is intended to help with usages of type parameters that have {@linkplain
+   * ParametricNullness parametric nullness}. If a type parameter instead ranges over only non-null
+   * types (or if the type is a non-variable type, like {@code String}), then code should almost
+   * never use this method, preferring instead to call {@code requireNonNull} so as to benefit from
+   * its runtime check.
+   *
+   * <p>An example use case for this method is in implementing an {@code Iterator<T>} whose {@code
+   * next} field is lazily initialized. The type of that field would be {@code @Nullable T}, and the
+   * code would be responsible for populating a "real" {@code T} (which might still be the value
+   * {@code null}!) before returning it to callers. Depending on how the code is structured, a
+   * nullness analysis might not understand that the field has been populated. To avoid that problem
+   * without having to add {@code @SuppressWarnings}, the code can call this method.
+   *
+   * <p>Why <i>not</i> just add {@code SuppressWarnings}? The problem is that this method is
+   * typically useful for {@code return} statements. That leaves the code with two options: Either
+   * add the suppression to the whole method (which turns off checking for a large section of code),
+   * or extract a variable, and put the suppression on that. However, a local variable typically
+   * doesn't work: Because nullness analyses typically infer the nullness of local variables,
+   * there's no way to assign a {@code @Nullable T} to a field {@code T foo;} and instruct the
+   * analysis that that means "plain {@code T}" rather than the inferred type {@code @Nullable T}.
+   * (Even if supported added {@code @NonNull}, that would not help, since the problem case
+   * addressed by this method is the case in which {@code T} has parametric nullness -- and thus its
+   * value may be legitimately {@code null}.)
+   */
+  @ParametricNullness
+  @SuppressWarnings("nullness")
+  static <T extends @Nullable Object> T uncheckedCastNullableTToT(@CheckForNull T t) {
+    return t;
+  }
+
+  /** Returns {@code null} as any type, even one that does not include {@code null}. */
+  @SuppressWarnings({"nullness", "TypeParameterUnusedInFormals"})
+  // The warnings are legitimate. Each time we use this method, we document why.
+  @ParametricNullness
+  static <T extends @Nullable Object> T unsafeNull() {
+    return null;
+  }
+
+  private NullnessCasts() {}
+}
diff --git a/guava/src/com/google/common/collect/NullsFirstOrdering.java b/guava/src/com/google/common/collect/NullsFirstOrdering.java
index 5e1dfe9..ce8be2f 100644
--- a/guava/src/com/google/common/collect/NullsFirstOrdering.java
+++ b/guava/src/com/google/common/collect/NullsFirstOrdering.java
@@ -18,11 +18,14 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering that treats {@code null} as less than all other values. */
 @GwtCompatible(serializable = true)
-final class NullsFirstOrdering<T> extends Ordering<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class NullsFirstOrdering<T extends @Nullable Object> extends Ordering<@Nullable T>
+    implements Serializable {
   final Ordering<? super T> ordering;
 
   NullsFirstOrdering(Ordering<? super T> ordering) {
@@ -30,7 +33,7 @@
   }
 
   @Override
-  public int compare(@Nullable T left, @Nullable T right) {
+  public int compare(@CheckForNull T left, @CheckForNull T right) {
     if (left == right) {
       return 0;
     }
@@ -44,24 +47,25 @@
   }
 
   @Override
-  public <S extends T> Ordering<S> reverse() {
+  @SuppressWarnings("nullness") // should be safe, but not sure if we can avoid the warning
+  public <S extends @Nullable T> Ordering<S> reverse() {
     // ordering.reverse() might be optimized, so let it do its thing
     return ordering.reverse().nullsLast();
   }
 
   @SuppressWarnings("unchecked") // still need the right way to explain this
   @Override
-  public <S extends T> Ordering<S> nullsFirst() {
-    return (Ordering<S>) this;
+  public <S extends T> Ordering<@Nullable S> nullsFirst() {
+    return (Ordering<@Nullable S>) this;
   }
 
   @Override
-  public <S extends T> Ordering<S> nullsLast() {
-    return ordering.nullsLast();
+  public <S extends T> Ordering<@Nullable S> nullsLast() {
+    return ordering.<S>nullsLast();
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/collect/NullsLastOrdering.java b/guava/src/com/google/common/collect/NullsLastOrdering.java
index a62e219..6f8f74c 100644
--- a/guava/src/com/google/common/collect/NullsLastOrdering.java
+++ b/guava/src/com/google/common/collect/NullsLastOrdering.java
@@ -18,11 +18,14 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering that treats {@code null} as greater than all other values. */
 @GwtCompatible(serializable = true)
-final class NullsLastOrdering<T> extends Ordering<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class NullsLastOrdering<T extends @Nullable Object> extends Ordering<@Nullable T>
+    implements Serializable {
   final Ordering<? super T> ordering;
 
   NullsLastOrdering(Ordering<? super T> ordering) {
@@ -30,7 +33,7 @@
   }
 
   @Override
-  public int compare(@Nullable T left, @Nullable T right) {
+  public int compare(@CheckForNull T left, @CheckForNull T right) {
     if (left == right) {
       return 0;
     }
@@ -44,24 +47,25 @@
   }
 
   @Override
-  public <S extends T> Ordering<S> reverse() {
+  @SuppressWarnings("nullness") // should be safe, but not sure if we can avoid the warning
+  public <S extends @Nullable T> Ordering<S> reverse() {
     // ordering.reverse() might be optimized, so let it do its thing
     return ordering.reverse().nullsFirst();
   }
 
   @Override
-  public <S extends T> Ordering<S> nullsFirst() {
-    return ordering.nullsFirst();
+  public <S extends T> Ordering<@Nullable S> nullsFirst() {
+    return ordering.<S>nullsFirst();
   }
 
   @SuppressWarnings("unchecked") // still need the right way to explain this
   @Override
-  public <S extends T> Ordering<S> nullsLast() {
-    return (Ordering<S>) this;
+  public <S extends T> Ordering<@Nullable S> nullsLast() {
+    return (Ordering<@Nullable S>) this;
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/collect/ObjectArrays.java b/guava/src/com/google/common/collect/ObjectArrays.java
index cfc9a59..d3b048d 100644
--- a/guava/src/com/google/common/collect/ObjectArrays.java
+++ b/guava/src/com/google/common/collect/ObjectArrays.java
@@ -33,6 +33,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class ObjectArrays {
 
   private ObjectArrays() {}
@@ -55,7 +56,7 @@
    * @param reference any array of the desired type
    * @param length the length of the new array
    */
-  public static <T> T[] newArray(T[] reference, int length) {
+  public static <T extends @Nullable Object> T[] newArray(T[] reference, int length) {
     return Platform.newArray(reference, length);
   }
 
@@ -82,7 +83,7 @@
    * @return an array whose size is one larger than {@code array}, with {@code element} occupying
    *     the first position, and the elements of {@code array} occupying the remaining elements.
    */
-  public static <T> T[] concat(@Nullable T element, T[] array) {
+  public static <T extends @Nullable Object> T[] concat(@ParametricNullness T element, T[] array) {
     T[] result = newArray(array, array.length + 1);
     result[0] = element;
     System.arraycopy(array, 0, result, 1, array.length);
@@ -97,7 +98,7 @@
    * @return an array whose size is one larger than {@code array}, with the same contents as {@code
    *     array}, plus {@code element} occupying the last position.
    */
-  public static <T> T[] concat(T[] array, @Nullable T element) {
+  public static <T extends @Nullable Object> T[] concat(T[] array, @ParametricNullness T element) {
     T[] result = Arrays.copyOf(array, array.length + 1);
     result[array.length] = element;
     return result;
@@ -124,14 +125,15 @@
    * @throws ArrayStoreException if the runtime type of the specified array is not a supertype of
    *     the runtime type of every element in the specified collection
    */
-  static <T> T[] toArrayImpl(Collection<?> c, T[] array) {
+  static <T extends @Nullable Object> T[] toArrayImpl(Collection<?> c, T[] array) {
     int size = c.size();
     if (array.length < size) {
       array = newArray(array, size);
     }
     fillArray(c, array);
     if (array.length > size) {
-      array[size] = null;
+      @Nullable Object[] unsoundlyCovariantArray = array;
+      unsoundlyCovariantArray[size] = null;
     }
     return array;
   }
@@ -147,12 +149,14 @@
    * collection is set to {@code null}. This is useful in determining the length of the collection
    * <i>only</i> if the caller knows that the collection does not contain any null elements.
    */
-  static <T> T[] toArrayImpl(Object[] src, int offset, int len, T[] dst) {
+  static <T extends @Nullable Object> T[] toArrayImpl(
+      @Nullable Object[] src, int offset, int len, T[] dst) {
     checkPositionIndexes(offset, offset + len, src.length);
     if (dst.length < len) {
       dst = newArray(dst, len);
     } else if (dst.length > len) {
-      dst[len] = null;
+      @Nullable Object[] unsoundlyCovariantArray = dst;
+      unsoundlyCovariantArray[len] = null;
     }
     System.arraycopy(src, offset, dst, 0, len);
     return dst;
@@ -170,7 +174,7 @@
    *
    * @param c the collection for which to return an array of elements
    */
-  static Object[] toArrayImpl(Collection<?> c) {
+  static @Nullable Object[] toArrayImpl(Collection<?> c) {
     return fillArray(c, new Object[c.size()]);
   }
 
@@ -178,18 +182,18 @@
    * Returns a copy of the specified subrange of the specified array that is literally an Object[],
    * and not e.g. a {@code String[]}.
    */
-  static Object[] copyAsObjectArray(Object[] elements, int offset, int length) {
+  static @Nullable Object[] copyAsObjectArray(@Nullable Object[] elements, int offset, int length) {
     checkPositionIndexes(offset, offset + length, elements.length);
     if (length == 0) {
       return new Object[0];
     }
-    Object[] result = new Object[length];
+    @Nullable Object[] result = new Object[length];
     System.arraycopy(elements, offset, result, 0, length);
     return result;
   }
 
   @CanIgnoreReturnValue
-  private static Object[] fillArray(Iterable<?> elements, Object[] array) {
+  private static @Nullable Object[] fillArray(Iterable<?> elements, @Nullable Object[] array) {
     int i = 0;
     for (Object element : elements) {
       array[i++] = element;
diff --git a/guava/src/com/google/common/collect/Ordering.java b/guava/src/com/google/common/collect/Ordering.java
index aa51fb6..9bf180f 100644
--- a/guava/src/com/google/common/collect/Ordering.java
+++ b/guava/src/com/google/common/collect/Ordering.java
@@ -38,6 +38,7 @@
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -144,7 +145,8 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class Ordering<T> implements Comparator<T> {
+@ElementTypesAreNonnullByDefault
+public abstract class Ordering<T extends @Nullable Object> implements Comparator<T> {
   // Natural order
 
   /**
@@ -178,7 +180,7 @@
    *     wraps that comparator
    */
   @GwtCompatible(serializable = true)
-  public static <T> Ordering<T> from(Comparator<T> comparator) {
+  public static <T extends @Nullable Object> Ordering<T> from(Comparator<T> comparator) {
     return (comparator instanceof Ordering)
         ? (Ordering<T>) comparator
         : new ComparatorOrdering<T>(comparator);
@@ -191,7 +193,7 @@
    */
   @GwtCompatible(serializable = true)
   @Deprecated
-  public static <T> Ordering<T> from(Ordering<T> ordering) {
+  public static <T extends @Nullable Object> Ordering<T> from(Ordering<T> ordering) {
     return checkNotNull(ordering);
   }
 
@@ -278,7 +280,7 @@
    */
   @GwtCompatible(serializable = true)
   @SuppressWarnings("unchecked")
-  public static Ordering<Object> allEqual() {
+  public static Ordering<@Nullable Object> allEqual() {
     return AllEqualOrdering.INSTANCE;
   }
 
@@ -311,16 +313,16 @@
    * @since 2.0
    */
   // TODO(kevinb): copy to Comparators, etc.
-  public static Ordering<Object> arbitrary() {
+  public static Ordering<@Nullable Object> arbitrary() {
     return ArbitraryOrderingHolder.ARBITRARY_ORDERING;
   }
 
   private static class ArbitraryOrderingHolder {
-    static final Ordering<Object> ARBITRARY_ORDERING = new ArbitraryOrdering();
+    static final Ordering<@Nullable Object> ARBITRARY_ORDERING = new ArbitraryOrdering();
   }
 
   @VisibleForTesting
-  static class ArbitraryOrdering extends Ordering<Object> {
+  static class ArbitraryOrdering extends Ordering<@Nullable Object> {
 
     private final AtomicInteger counter = new AtomicInteger(0);
     private final ConcurrentMap<Object, Integer> uids =
@@ -342,7 +344,7 @@
     }
 
     @Override
-    public int compare(Object left, Object right) {
+    public int compare(@CheckForNull Object left, @CheckForNull Object right) {
       if (left == right) {
         return 0;
       } else if (left == null) {
@@ -414,7 +416,7 @@
   // type parameter <S> lets us avoid the extra <String> in statements like:
   // Ordering<String> o = Ordering.<String>natural().nullsFirst();
   @GwtCompatible(serializable = true)
-  public <S extends T> Ordering<S> nullsFirst() {
+  public <S extends T> Ordering<@Nullable S> nullsFirst() {
     return new NullsFirstOrdering<S>(this);
   }
 
@@ -427,7 +429,7 @@
   // type parameter <S> lets us avoid the extra <String> in statements like:
   // Ordering<String> o = Ordering.<String>natural().nullsLast();
   @GwtCompatible(serializable = true)
-  public <S extends T> Ordering<S> nullsLast() {
+  public <S extends T> Ordering<@Nullable S> nullsLast() {
     return new NullsLastOrdering<S>(this);
   }
 
@@ -445,7 +447,7 @@
    * can omit the comparator if it is the natural order).
    */
   @GwtCompatible(serializable = true)
-  public <F> Ordering<F> onResultOf(Function<F, ? extends T> function) {
+  public <F extends @Nullable Object> Ordering<F> onResultOf(Function<F, ? extends T> function) {
     return new ByFunctionOrdering<>(function, this);
   }
 
@@ -491,7 +493,8 @@
    * @param comparators the comparators to try in order
    */
   @GwtCompatible(serializable = true)
-  public static <T> Ordering<T> compound(Iterable<? extends Comparator<? super T>> comparators) {
+  public static <T extends @Nullable Object> Ordering<T> compound(
+      Iterable<? extends Comparator<? super T>> comparators) {
     return new CompoundOrdering<T>(comparators);
   }
 
@@ -527,10 +530,9 @@
 
   // Regular instance methods
 
-  // Override to add @Nullable
   @CanIgnoreReturnValue // TODO(kak): Consider removing this
   @Override
-  public abstract int compare(@Nullable T left, @Nullable T right);
+  public abstract int compare(@ParametricNullness T left, @ParametricNullness T right);
 
   /**
    * Returns the least of the specified values according to this ordering. If there are multiple
@@ -546,6 +548,7 @@
    *     ordering.
    * @since 11.0
    */
+  @ParametricNullness
   public <E extends T> E min(Iterator<E> iterator) {
     // let this throw NoSuchElementException as necessary
     E minSoFar = iterator.next();
@@ -571,6 +574,7 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
+  @ParametricNullness
   public <E extends T> E min(Iterable<E> iterable) {
     return min(iterable.iterator());
   }
@@ -590,7 +594,8 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
-  public <E extends T> E min(@Nullable E a, @Nullable E b) {
+  @ParametricNullness
+  public <E extends T> E min(@ParametricNullness E a, @ParametricNullness E b) {
     return (compare(a, b) <= 0) ? a : b;
   }
 
@@ -608,7 +613,9 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
-  public <E extends T> E min(@Nullable E a, @Nullable E b, @Nullable E c, E... rest) {
+  @ParametricNullness
+  public <E extends T> E min(
+      @ParametricNullness E a, @ParametricNullness E b, @ParametricNullness E c, E... rest) {
     E minSoFar = min(min(a, b), c);
 
     for (E r : rest) {
@@ -632,6 +639,7 @@
    *     ordering.
    * @since 11.0
    */
+  @ParametricNullness
   public <E extends T> E max(Iterator<E> iterator) {
     // let this throw NoSuchElementException as necessary
     E maxSoFar = iterator.next();
@@ -657,6 +665,7 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
+  @ParametricNullness
   public <E extends T> E max(Iterable<E> iterable) {
     return max(iterable.iterator());
   }
@@ -676,7 +685,8 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
-  public <E extends T> E max(@Nullable E a, @Nullable E b) {
+  @ParametricNullness
+  public <E extends T> E max(@ParametricNullness E a, @ParametricNullness E b) {
     return (compare(a, b) >= 0) ? a : b;
   }
 
@@ -694,7 +704,9 @@
    * @throws ClassCastException if the parameters are not <i>mutually comparable</i> under this
    *     ordering.
    */
-  public <E extends T> E max(@Nullable E a, @Nullable E b, @Nullable E c, E... rest) {
+  @ParametricNullness
+  public <E extends T> E max(
+      @ParametricNullness E a, @ParametricNullness E b, @ParametricNullness E c, E... rest) {
     E maxSoFar = max(max(a, b), c);
 
     for (E r : rest) {
@@ -859,6 +871,7 @@
    * @since 3.0
    */
   // TODO(kevinb): rerun benchmarks including new options
+  @SuppressWarnings("nullness") // unsafe, but there's not much we can do about it now
   public <E extends T> ImmutableList<E> immutableSortedCopy(Iterable<E> elements) {
     return ImmutableList.sortedCopyOf(this, elements);
   }
@@ -920,7 +933,8 @@
    * @deprecated Use {@link Collections#binarySearch(List, Object, Comparator)} directly.
    */
   @Deprecated
-  public int binarySearch(List<? extends T> sortedList, @Nullable T key) {
+  public int binarySearch(
+      List<? extends T> sortedList, @ParametricNullness T key) {
     return Collections.binarySearch(sortedList, key, this);
   }
 
diff --git a/guava/src/com/google/common/collect/ParametricNullness.java b/guava/src/com/google/common/collect/ParametricNullness.java
new file mode 100644
index 0000000..b1cda48
--- /dev/null
+++ b/guava/src/com/google/common/collect/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.collect;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/collect/PeekingIterator.java b/guava/src/com/google/common/collect/PeekingIterator.java
index 5a6c60b..a274fe4 100644
--- a/guava/src/com/google/common/collect/PeekingIterator.java
+++ b/guava/src/com/google/common/collect/PeekingIterator.java
@@ -21,6 +21,7 @@
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An iterator that supports a one-element lookahead while iterating.
@@ -34,7 +35,8 @@
  */
 @DoNotMock("Use Iterators.peekingIterator")
 @GwtCompatible
-public interface PeekingIterator<E> extends Iterator<E> {
+@ElementTypesAreNonnullByDefault
+public interface PeekingIterator<E extends @Nullable Object> extends Iterator<E> {
   /**
    * Returns the next element in the iteration, without advancing the iteration.
    *
@@ -44,6 +46,7 @@
    * @throws NoSuchElementException if the iteration has no more elements according to {@link
    *     #hasNext()}
    */
+  @ParametricNullness
   E peek();
 
   /**
@@ -54,6 +57,7 @@
    */
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   E next();
 
   /**
diff --git a/guava/src/com/google/common/collect/Platform.java b/guava/src/com/google/common/collect/Platform.java
index d4afd32..b1d6b2f 100644
--- a/guava/src/com/google/common/collect/Platform.java
+++ b/guava/src/com/google/common/collect/Platform.java
@@ -21,6 +21,8 @@
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Methods factored out so that they can be emulated differently in GWT.
@@ -28,12 +30,14 @@
  * @author Hayward Chan
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class Platform {
   private static final java.util.logging.Logger logger =
       java.util.logging.Logger.getLogger(Platform.class.getName());
 
   /** Returns the platform preferred implementation of a map based on a hash table. */
-  static <K, V> Map<K, V> newHashMapWithExpectedSize(int expectedSize) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      Map<K, V> newHashMapWithExpectedSize(int expectedSize) {
     return Maps.newHashMapWithExpectedSize(expectedSize);
   }
 
@@ -41,20 +45,26 @@
    * Returns the platform preferred implementation of an insertion ordered map based on a hash
    * table.
    */
-  static <K, V> Map<K, V> newLinkedHashMapWithExpectedSize(int expectedSize) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      Map<K, V> newLinkedHashMapWithExpectedSize(int expectedSize) {
     return Maps.newLinkedHashMapWithExpectedSize(expectedSize);
   }
 
   /** Returns the platform preferred implementation of a set based on a hash table. */
-  static <E> Set<E> newHashSetWithExpectedSize(int expectedSize) {
+  static <E extends @Nullable Object> Set<E> newHashSetWithExpectedSize(int expectedSize) {
     return Sets.newHashSetWithExpectedSize(expectedSize);
   }
 
+  /** Returns the platform preferred implementation of a thread-safe hash set. */
+  static <E> Set<E> newConcurrentHashSet() {
+    return ConcurrentHashMap.newKeySet();
+  }
+
   /**
    * Returns the platform preferred implementation of an insertion ordered set based on a hash
    * table.
    */
-  static <E> Set<E> newLinkedHashSetWithExpectedSize(int expectedSize) {
+  static <E extends @Nullable Object> Set<E> newLinkedHashSetWithExpectedSize(int expectedSize) {
     return Sets.newLinkedHashSetWithExpectedSize(expectedSize);
   }
 
@@ -62,7 +72,8 @@
    * Returns the platform preferred map implementation that preserves insertion order when used only
    * for insertions.
    */
-  static <K, V> Map<K, V> preservesInsertionOrderOnPutsMap() {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      Map<K, V> preservesInsertionOrderOnPutsMap() {
     return Maps.newLinkedHashMap();
   }
 
@@ -70,7 +81,7 @@
    * Returns the platform preferred set implementation that preserves insertion order when used only
    * for insertions.
    */
-  static <E> Set<E> preservesInsertionOrderOnAddsSet() {
+  static <E extends @Nullable Object> Set<E> preservesInsertionOrderOnAddsSet() {
     return Sets.newLinkedHashSet();
   }
 
@@ -80,7 +91,13 @@
    * @param reference any array of the desired type
    * @param length the length of the new array
    */
-  static <T> T[] newArray(T[] reference, int length) {
+  /*
+   * The new array contains nulls, even if the old array did not. If we wanted to be accurate, we
+   * would declare a return type of `@Nullable T[]`. However, we've decided not to think too hard
+   * about arrays for now, as they're a mess. (We previously discussed this in the review of
+   * ObjectArrays, which is the main caller of this method.)
+   */
+  static <T extends @Nullable Object> T[] newArray(T[] reference, int length) {
     Class<?> type = reference.getClass().getComponentType();
 
     // the cast is safe because
@@ -91,7 +108,16 @@
   }
 
   /** Equivalent to Arrays.copyOfRange(source, from, to, arrayOfType.getClass()). */
-  static <T> T[] copy(Object[] source, int from, int to, T[] arrayOfType) {
+  /*
+   * Arrays are a mess from a nullness perspective, and Class instances for object-array types are
+   * even worse. For now, we just suppress and move on with our lives.
+   *
+   * - https://github.com/jspecify/jspecify/issues/65
+   *
+   * - https://github.com/jspecify/jdk/commit/71d826792b8c7ef95d492c50a274deab938f2552
+   */
+  @SuppressWarnings("nullness")
+  static <T extends @Nullable Object> T[] copy(Object[] source, int from, int to, T[] arrayOfType) {
     return Arrays.copyOfRange(source, from, to, (Class<? extends T[]>) arrayOfType.getClass());
   }
 
@@ -131,7 +157,6 @@
             + " warning because you are sending a Guava type over GWT-RPC, which will break. You"
             + " can identify which type by looking at the class name in the attached stack trace.",
         new Throwable());
-
   }
 
   private Platform() {}
diff --git a/guava/src/com/google/common/collect/Queues.java b/guava/src/com/google/common/collect/Queues.java
index 8a69326..a140102 100644
--- a/guava/src/com/google/common/collect/Queues.java
+++ b/guava/src/com/google/common/collect/Queues.java
@@ -32,6 +32,7 @@
 import java.util.concurrent.PriorityBlockingQueue;
 import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.TimeUnit;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static utility methods pertaining to {@link Queue} and {@link Deque} instances. Also see this
@@ -41,6 +42,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Queues {
   private Queues() {}
 
@@ -188,7 +190,8 @@
    * Creates an empty {@code PriorityBlockingQueue} with the ordering given by its elements' natural
    * ordering.
    *
-   * @since 11.0 (requires that {@code E} be {@code Comparable} since 15.0).
+   * @since 11.0 (but the bound of {@code E} was changed from {@code Object} to {@code Comparable}
+   *     in 15.0)
    */
   @GwtIncompatible // PriorityBlockingQueue
   public static <E extends Comparable> PriorityBlockingQueue<E> newPriorityBlockingQueue() {
@@ -201,7 +204,8 @@
    * <p><b>Note:</b> If the specified iterable is a {@code SortedSet} or a {@code PriorityQueue},
    * this priority queue will be ordered according to the same ordering.
    *
-   * @since 11.0 (requires that {@code E} be {@code Comparable} since 15.0).
+   * @since 11.0 (but the bound of {@code E} was changed from {@code Object} to {@code Comparable}
+   *     in 15.0)
    */
   @GwtIncompatible // PriorityBlockingQueue
   public static <E extends Comparable> PriorityBlockingQueue<E> newPriorityBlockingQueue(
@@ -220,7 +224,8 @@
    * Creates an empty {@code PriorityQueue} with the ordering given by its elements' natural
    * ordering.
    *
-   * @since 11.0 (requires that {@code E} be {@code Comparable} since 15.0).
+   * @since 11.0 (but the bound of {@code E} was changed from {@code Object} to {@code Comparable}
+   *     in 15.0)
    */
   public static <E extends Comparable> PriorityQueue<E> newPriorityQueue() {
     return new PriorityQueue<E>();
@@ -232,7 +237,8 @@
    * <p><b>Note:</b> If the specified iterable is a {@code SortedSet} or a {@code PriorityQueue},
    * this priority queue will be ordered according to the same ordering.
    *
-   * @since 11.0 (requires that {@code E} be {@code Comparable} since 15.0).
+   * @since 11.0 (but the bound of {@code E} was changed from {@code Object} to {@code Comparable}
+   *     in 15.0)
    */
   public static <E extends Comparable> PriorityQueue<E> newPriorityQueue(
       Iterable<? extends E> elements) {
@@ -432,7 +438,7 @@
    * @return a synchronized view of the specified queue
    * @since 14.0
    */
-  public static <E> Queue<E> synchronizedQueue(Queue<E> queue) {
+  public static <E extends @Nullable Object> Queue<E> synchronizedQueue(Queue<E> queue) {
     return Synchronized.queue(queue, null);
   }
 
@@ -465,7 +471,7 @@
    * @return a synchronized view of the specified deque
    * @since 15.0
    */
-  public static <E> Deque<E> synchronizedDeque(Deque<E> deque) {
+  public static <E extends @Nullable Object> Deque<E> synchronizedDeque(Deque<E> deque) {
     return Synchronized.deque(deque, null);
   }
 }
diff --git a/guava/src/com/google/common/collect/Range.java b/guava/src/com/google/common/collect/Range.java
index 1c6002e..ab5c077 100644
--- a/guava/src/com/google/common/collect/Range.java
+++ b/guava/src/com/google/common/collect/Range.java
@@ -27,7 +27,7 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.SortedSet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A range (or "interval") defines the <i>boundaries</i> around a contiguous span of values of some
@@ -117,6 +117,7 @@
  */
 @GwtCompatible
 @SuppressWarnings("rawtypes")
+@ElementTypesAreNonnullByDefault
 public final class Range<C extends Comparable> extends RangeGwtSerializationDependencies
     implements Predicate<C>, Serializable {
 
@@ -329,7 +330,7 @@
   public static <C extends Comparable<?>> Range<C> encloseAll(Iterable<C> values) {
     checkNotNull(values);
     if (values instanceof SortedSet) {
-      SortedSet<? extends C> set = cast(values);
+      SortedSet<C> set = (SortedSet<C>) values;
       Comparator<?> comparator = set.comparator();
       if (Ordering.natural().equals(comparator) || comparator == null) {
         return closed(set.first(), set.last());
@@ -456,7 +457,7 @@
 
     // this optimizes testing equality of two range-backed sets
     if (values instanceof SortedSet) {
-      SortedSet<? extends C> set = cast(values);
+      SortedSet<? extends C> set = (SortedSet<? extends C>) values;
       Comparator<?> comparator = set.comparator();
       if (Ordering.natural().equals(comparator) || comparator == null) {
         return contains(set.first()) && contains(set.last());
@@ -663,7 +664,7 @@
    * {@code [3..3)}, {@code (3..3]}, {@code (4..4]} are all unequal.
    */
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Range) {
       Range<?> other = (Range<?>) object;
       return lowerBound.equals(other.lowerBound) && upperBound.equals(other.upperBound);
@@ -694,11 +695,6 @@
     return sb.toString();
   }
 
-  /** Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557 */
-  private static <T> SortedSet<T> cast(Iterable<T> iterable) {
-    return (SortedSet<T>) iterable;
-  }
-
   Object readResolve() {
     if (this.equals(ALL)) {
       return all();
diff --git a/guava/src/com/google/common/collect/RangeMap.java b/guava/src/com/google/common/collect/RangeMap.java
index 0b319bd..99e7b97 100644
--- a/guava/src/com/google/common/collect/RangeMap.java
+++ b/guava/src/com/google/common/collect/RangeMap.java
@@ -24,6 +24,7 @@
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.function.BiFunction;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -39,21 +40,27 @@
 @Beta
 @DoNotMock("Use ImmutableRangeMap or TreeRangeMap")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface RangeMap<K extends Comparable, V> {
+  /*
+   * TODO(cpovirk): These docs sometimes say "map" and sometimes say "range map." Pick one, or at
+   * least decide on a policy for when to use which.
+   */
+
   /**
    * Returns the value associated with the specified key, or {@code null} if there is no such value.
    *
    * <p>Specifically, if any range in this range map contains the specified key, the value
    * associated with that range is returned.
    */
-  @Nullable
+  @CheckForNull
   V get(K key);
 
   /**
    * Returns the range containing this key and its associated value, if such a range is present in
    * the range map, or {@code null} otherwise.
    */
-  @Nullable
+  @CheckForNull
   Entry<Range<K>, V> getEntry(K key);
 
   /**
@@ -111,25 +118,27 @@
   void remove(Range<K> range);
 
   /**
-   * Merges a value into the map over a range by applying a remapping function.
+   * Merges a value into a part of the map by applying a remapping function.
    *
-   * <p>If any parts of the range are already present in this range map, those parts are mapped to
-   * new values by applying the remapping function. Any parts of the range not already present in
-   * this range map are mapped to the specified value, unless the value is {@code null}.
+   * <p>If any parts of the range are already present in this map, those parts are mapped to new
+   * values by applying the remapping function. The remapping function accepts the map's existing
+   * value for that part of the range and the given value. It returns the value to be associated
+   * with that part of the map, or it returns {@code null} to clear that part of the map.
    *
-   * <p>Any existing map entry spanning either range boundary may be split at the boundary, even if
-   * the merge does not affect its value.
+   * <p>Any parts of the range not already present in this map are mapped to the specified value,
+   * unless the value is {@code null}.
    *
-   * <p>For example, if {@code rangeMap} had one entry {@code [1, 5] => 3} then {@code
-   * rangeMap.merge(Range.closed(0,2), 3, Math::max)} could yield a range map with the entries
-   * {@code [0, 1) => 3, [1, 2] => 3, (2, 5] => 3}.
+   * <p>Any existing entry spanning either range boundary may be split at the boundary, even if the
+   * merge does not affect its value. For example, if {@code rangeMap} had one entry {@code [1, 5]
+   * => 3} then {@code rangeMap.merge(Range.closed(0,2), 3, Math::max)} could yield a map with the
+   * entries {@code [0, 1) => 3, [1, 2] => 3, (2, 5] => 3}.
    *
    * @since 28.1
    */
   void merge(
       Range<K> range,
-      @Nullable V value,
-      BiFunction<? super V, ? super V, ? extends V> remappingFunction);
+      @CheckForNull V value,
+      BiFunction<? super V, ? super @Nullable V, ? extends @Nullable V> remappingFunction);
 
   /**
    * Returns a view of this range map as an unmodifiable {@code Map<Range<K>, V>}. Modifications to
@@ -168,6 +177,7 @@
    * <p>The returned range map will throw an {@link IllegalArgumentException} on an attempt to
    * insert a range not {@linkplain Range#encloses(Range) enclosed} by {@code range}.
    */
+  // TODO(cpovirk): Consider documenting that IAE on the various methods that can throw it.
   RangeMap<K, V> subRangeMap(Range<K> range);
 
   /**
@@ -175,7 +185,7 @@
    * #asMapOfRanges()}.
    */
   @Override
-  boolean equals(@Nullable Object o);
+  boolean equals(@CheckForNull Object o);
 
   /** Returns {@code asMapOfRanges().hashCode()}. */
   @Override
diff --git a/guava/src/com/google/common/collect/RangeSet.java b/guava/src/com/google/common/collect/RangeSet.java
index 4805108..1fb7b10 100644
--- a/guava/src/com/google/common/collect/RangeSet.java
+++ b/guava/src/com/google/common/collect/RangeSet.java
@@ -15,11 +15,11 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.Beta;
-import com.google.errorprone.annotations.DoNotMock;
 import com.google.common.annotations.GwtIncompatible;
+import com.google.errorprone.annotations.DoNotMock;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A set comprising zero or more {@linkplain Range#isEmpty nonempty}, {@linkplain
@@ -52,6 +52,7 @@
 @Beta
 @DoNotMock("Use ImmutableRangeSet or TreeRangeSet")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface RangeSet<C extends Comparable> {
   // TODO(lowasser): consider adding default implementations of some of these methods
 
@@ -64,6 +65,7 @@
    * Returns the unique range from this range set that {@linkplain Range#contains contains} {@code
    * value}, or {@code null} if this range set does not contain {@code value}.
    */
+  @CheckForNull
   Range<C> rangeContaining(C value);
 
   /**
@@ -262,7 +264,7 @@
    * according to {@link Range#equals(Object)}.
    */
   @Override
-  boolean equals(@Nullable Object obj);
+  boolean equals(@CheckForNull Object obj);
 
   /** Returns {@code asRanges().hashCode()}. */
   @Override
diff --git a/guava/src/com/google/common/collect/RegularContiguousSet.java b/guava/src/com/google/common/collect/RegularContiguousSet.java
index 8497585..913e2d7 100644
--- a/guava/src/com/google/common/collect/RegularContiguousSet.java
+++ b/guava/src/com/google/common/collect/RegularContiguousSet.java
@@ -18,12 +18,13 @@
 import static com.google.common.base.Preconditions.checkElementIndex;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.BoundType.CLOSED;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import java.io.Serializable;
 import java.util.Collection;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link ContiguousSet} that contains one or more elements.
@@ -32,6 +33,7 @@
  */
 @GwtCompatible(emulated = true)
 @SuppressWarnings("unchecked") // allow ungenerified Comparable types
+@ElementTypesAreNonnullByDefault
 final class RegularContiguousSet<C extends Comparable> extends ContiguousSet<C> {
   private final Range<C> range;
 
@@ -71,8 +73,9 @@
 
   @GwtIncompatible // not used by GWT emulation
   @Override
-  int indexOf(Object target) {
-    return contains(target) ? (int) domain.distance(first(), (C) target) : -1;
+  int indexOf(@CheckForNull Object target) {
+    // requireNonNull is safe because of the contains check.
+    return contains(target) ? (int) domain.distance(first(), (C) requireNonNull(target)) : -1;
   }
 
   @Override
@@ -81,6 +84,7 @@
       final C last = last();
 
       @Override
+      @CheckForNull
       protected C computeNext(C previous) {
         return equalsOrThrow(previous, last) ? null : domain.next(previous);
       }
@@ -94,13 +98,14 @@
       final C first = first();
 
       @Override
+      @CheckForNull
       protected C computeNext(C previous) {
         return equalsOrThrow(previous, first) ? null : domain.previous(previous);
       }
     };
   }
 
-  private static boolean equalsOrThrow(Comparable<?> left, @Nullable Comparable<?> right) {
+  private static boolean equalsOrThrow(Comparable<?> left, @CheckForNull Comparable<?> right) {
     return right != null && Range.compareOrThrow(left, right) == 0;
   }
 
@@ -111,12 +116,14 @@
 
   @Override
   public C first() {
-    return range.lowerBound.leastValueAbove(domain);
+    // requireNonNull is safe because we checked the range is not empty in ContiguousSet.create.
+    return requireNonNull(range.lowerBound.leastValueAbove(domain));
   }
 
   @Override
   public C last() {
-    return range.upperBound.greatestValueBelow(domain);
+    // requireNonNull is safe because we checked the range is not empty in ContiguousSet.create.
+    return requireNonNull(range.upperBound.greatestValueBelow(domain));
   }
 
   @Override
@@ -146,7 +153,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object object) {
+  public boolean contains(@CheckForNull Object object) {
     if (object == null) {
       return false;
     }
@@ -195,7 +202,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     } else if (object instanceof RegularContiguousSet) {
diff --git a/guava/src/com/google/common/collect/RegularImmutableAsList.java b/guava/src/com/google/common/collect/RegularImmutableAsList.java
index df17b6e..0e3fe4e 100644
--- a/guava/src/com/google/common/collect/RegularImmutableAsList.java
+++ b/guava/src/com/google/common/collect/RegularImmutableAsList.java
@@ -19,6 +19,8 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import java.util.function.Consumer;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An {@link ImmutableAsList} implementation specialized for when the delegate collection is already
@@ -28,6 +30,7 @@
  */
 @GwtCompatible(emulated = true)
 @SuppressWarnings("serial") // uses writeReplace, not default serialization
+@ElementTypesAreNonnullByDefault
 class RegularImmutableAsList<E> extends ImmutableAsList<E> {
   private final ImmutableCollection<E> delegate;
   private final ImmutableList<? extends E> delegateList;
@@ -64,11 +67,12 @@
 
   @GwtIncompatible // not present in emulated superclass
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     return delegateList.copyIntoArray(dst, offset);
   }
 
   @Override
+  @CheckForNull
   Object[] internalArray() {
     return delegateList.internalArray();
   }
diff --git a/guava/src/com/google/common/collect/RegularImmutableBiMap.java b/guava/src/com/google/common/collect/RegularImmutableBiMap.java
index f5b8988..60d22e2 100644
--- a/guava/src/com/google/common/collect/RegularImmutableBiMap.java
+++ b/guava/src/com/google/common/collect/RegularImmutableBiMap.java
@@ -21,6 +21,7 @@
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 import static com.google.common.collect.ImmutableMapEntry.createEntryArray;
 import static com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -31,6 +32,7 @@
 import java.io.Serializable;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -40,6 +42,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+@ElementTypesAreNonnullByDefault
 class RegularImmutableBiMap<K, V> extends ImmutableBiMap<K, V> {
   static final RegularImmutableBiMap<Object, Object> EMPTY =
       new RegularImmutableBiMap<>(
@@ -47,8 +50,8 @@
 
   static final double MAX_LOAD_FACTOR = 1.2;
 
-  private final transient ImmutableMapEntry<K, V>[] keyTable;
-  private final transient ImmutableMapEntry<K, V>[] valueTable;
+  @CheckForNull private final transient @Nullable ImmutableMapEntry<K, V>[] keyTable;
+  @CheckForNull private final transient @Nullable ImmutableMapEntry<K, V>[] valueTable;
   @VisibleForTesting final transient Entry<K, V>[] entries;
   private final transient int mask;
   private final transient int hashCode;
@@ -57,23 +60,25 @@
     return fromEntryArray(entries.length, entries);
   }
 
-  static <K, V> ImmutableBiMap<K, V> fromEntryArray(int n, Entry<K, V>[] entryArray) {
+  static <K, V> ImmutableBiMap<K, V> fromEntryArray(int n, @Nullable Entry<K, V>[] entryArray) {
     checkPositionIndex(n, entryArray.length);
     int tableSize = Hashing.closedTableSize(n, MAX_LOAD_FACTOR);
     int mask = tableSize - 1;
-    ImmutableMapEntry<K, V>[] keyTable = createEntryArray(tableSize);
-    ImmutableMapEntry<K, V>[] valueTable = createEntryArray(tableSize);
-    Entry<K, V>[] entries;
-    if (n == entryArray.length) {
-      entries = entryArray;
-    } else {
-      entries = createEntryArray(n);
-    }
+    @Nullable ImmutableMapEntry<K, V>[] keyTable = createEntryArray(tableSize);
+    @Nullable ImmutableMapEntry<K, V>[] valueTable = createEntryArray(tableSize);
+    /*
+     * The cast is safe: n==entryArray.length means that we have filled the whole array with Entry
+     * instances, in which case it is safe to cast it from an array of nullable entries to an array
+     * of non-null entries.
+     */
+    @SuppressWarnings("nullness")
+    Entry<K, V>[] entries =
+        (n == entryArray.length) ? (Entry<K, V>[]) entryArray : createEntryArray(n);
     int hashCode = 0;
 
     for (int i = 0; i < n; i++) {
-      @SuppressWarnings("unchecked")
-      Entry<K, V> entry = entryArray[i];
+      // requireNonNull is safe because the first `n` elements have been filled in.
+      Entry<K, V> entry = requireNonNull(entryArray[i]);
       K key = entry.getKey();
       V value = entry.getValue();
       checkEntryNotNull(key, value);
@@ -104,8 +109,8 @@
   }
 
   private RegularImmutableBiMap(
-      ImmutableMapEntry<K, V>[] keyTable,
-      ImmutableMapEntry<K, V>[] valueTable,
+      @CheckForNull @Nullable ImmutableMapEntry<K, V>[] keyTable,
+      @CheckForNull @Nullable ImmutableMapEntry<K, V>[] valueTable,
       Entry<K, V>[] entries,
       int mask,
       int hashCode) {
@@ -124,7 +129,7 @@
    */
   @CanIgnoreReturnValue
   private static int checkNoConflictInValueBucket(
-      Object value, Entry<?, ?> entry, @Nullable ImmutableMapEntry<?, ?> valueBucketHead) {
+      Object value, Entry<?, ?> entry, @CheckForNull ImmutableMapEntry<?, ?> valueBucketHead) {
     int bucketSize = 0;
     for (; valueBucketHead != null; valueBucketHead = valueBucketHead.getNextInValueBucket()) {
       checkNoConflict(!value.equals(valueBucketHead.getValue()), "value", entry, valueBucketHead);
@@ -134,8 +139,9 @@
   }
 
   @Override
-  public @Nullable V get(@Nullable Object key) {
-    return (keyTable == null) ? null : RegularImmutableMap.get(key, keyTable, mask);
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
+    return RegularImmutableMap.get(key, keyTable, mask);
   }
 
   @Override
@@ -178,7 +184,7 @@
     return entries.length;
   }
 
-  @LazyInit @RetainedWith private transient ImmutableBiMap<V, K> inverse;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableBiMap<V, K> inverse;
 
   @Override
   public ImmutableBiMap<V, K> inverse() {
@@ -208,7 +214,8 @@
     }
 
     @Override
-    public K get(@Nullable Object value) {
+    @CheckForNull
+    public K get(@CheckForNull Object value) {
       if (value == null || valueTable == null) {
         return null;
       }
diff --git a/guava/src/com/google/common/collect/RegularImmutableList.java b/guava/src/com/google/common/collect/RegularImmutableList.java
index 47f42d5..397147d 100644
--- a/guava/src/com/google/common/collect/RegularImmutableList.java
+++ b/guava/src/com/google/common/collect/RegularImmutableList.java
@@ -20,6 +20,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import java.util.Spliterator;
 import java.util.Spliterators;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link ImmutableList} backed by a simple array.
@@ -28,6 +29,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+@ElementTypesAreNonnullByDefault
 class RegularImmutableList<E> extends ImmutableList<E> {
   static final ImmutableList<Object> EMPTY = new RegularImmutableList<>(new Object[0]);
 
@@ -63,7 +65,7 @@
   }
 
   @Override
-  int copyIntoArray(Object[] dst, int dstOff) {
+  int copyIntoArray(@Nullable Object[] dst, int dstOff) {
     System.arraycopy(array, 0, dst, dstOff, array.length);
     return dstOff + array.length;
   }
diff --git a/guava/src/com/google/common/collect/RegularImmutableMap.java b/guava/src/com/google/common/collect/RegularImmutableMap.java
index 9efda84..43425b2 100644
--- a/guava/src/com/google/common/collect/RegularImmutableMap.java
+++ b/guava/src/com/google/common/collect/RegularImmutableMap.java
@@ -20,6 +20,7 @@
 import static com.google.common.base.Preconditions.checkPositionIndex;
 import static com.google.common.collect.CollectPreconditions.checkEntryNotNull;
 import static com.google.common.collect.ImmutableMapEntry.createEntryArray;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -28,6 +29,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.Serializable;
 import java.util.function.BiConsumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -38,6 +40,7 @@
  * @author Gregory Kick
  */
 @GwtCompatible(serializable = true, emulated = true)
+@ElementTypesAreNonnullByDefault
 final class RegularImmutableMap<K, V> extends ImmutableMap<K, V> {
   @SuppressWarnings("unchecked")
   static final ImmutableMap<Object, Object> EMPTY =
@@ -65,7 +68,7 @@
   // entries in insertion order
   @VisibleForTesting final transient Entry<K, V>[] entries;
   // array of linked lists of entries
-  private final transient ImmutableMapEntry<K, V>[] table;
+  @CheckForNull private final transient @Nullable ImmutableMapEntry<K, V>[] table;
   // 'and' with an int to get a table index
   private final transient int mask;
 
@@ -78,27 +81,30 @@
    * the entries in entryArray with its own entry objects (though they will have the same key/value
    * contents), and may take ownership of entryArray.
    */
-  static <K, V> ImmutableMap<K, V> fromEntryArray(int n, Entry<K, V>[] entryArray) {
+  static <K, V> ImmutableMap<K, V> fromEntryArray(int n, @Nullable Entry<K, V>[] entryArray) {
     checkPositionIndex(n, entryArray.length);
     if (n == 0) {
       return (RegularImmutableMap<K, V>) EMPTY;
     }
-    Entry<K, V>[] entries;
-    if (n == entryArray.length) {
-      entries = entryArray;
-    } else {
-      entries = createEntryArray(n);
-    }
+    /*
+     * The cast is safe: n==entryArray.length means that we have filled the whole array with Entry
+     * instances, in which case it is safe to cast it from an array of nullable entries to an array
+     * of non-null entries.
+     */
+    @SuppressWarnings("nullness")
+    Entry<K, V>[] entries =
+        (n == entryArray.length) ? (Entry<K, V>[]) entryArray : createEntryArray(n);
     int tableSize = Hashing.closedTableSize(n, MAX_LOAD_FACTOR);
-    ImmutableMapEntry<K, V>[] table = createEntryArray(tableSize);
+    @Nullable ImmutableMapEntry<K, V>[] table = createEntryArray(tableSize);
     int mask = tableSize - 1;
     for (int entryIndex = 0; entryIndex < n; entryIndex++) {
-      Entry<K, V> entry = entryArray[entryIndex];
+      // requireNonNull is safe because the first `n` elements have been filled in.
+      Entry<K, V> entry = requireNonNull(entryArray[entryIndex]);
       K key = entry.getKey();
       V value = entry.getValue();
       checkEntryNotNull(key, value);
       int tableIndex = Hashing.smear(key.hashCode()) & mask;
-      @Nullable ImmutableMapEntry<K, V> existing = table[tableIndex];
+      ImmutableMapEntry<K, V> existing = table[tableIndex];
       // prepend, not append, so the entries can be immutable
       ImmutableMapEntry<K, V> newEntry =
           (existing == null)
@@ -128,7 +134,8 @@
     return makeImmutable(entry, entry.getKey(), entry.getValue());
   }
 
-  private RegularImmutableMap(Entry<K, V>[] entries, ImmutableMapEntry<K, V>[] table, int mask) {
+  private RegularImmutableMap(
+      Entry<K, V>[] entries, @CheckForNull @Nullable ImmutableMapEntry<K, V>[] table, int mask) {
     this.entries = entries;
     this.table = table;
     this.mask = mask;
@@ -140,7 +147,7 @@
    */
   @CanIgnoreReturnValue
   static int checkNoConflictInKeyBucket(
-      Object key, Entry<?, ?> entry, @Nullable ImmutableMapEntry<?, ?> keyBucketHead) {
+      Object key, Entry<?, ?> entry, @CheckForNull ImmutableMapEntry<?, ?> keyBucketHead) {
     int bucketSize = 0;
     for (; keyBucketHead != null; keyBucketHead = keyBucketHead.getNextInKeyBucket()) {
       checkNoConflict(!key.equals(keyBucketHead.getKey()), "key", entry, keyBucketHead);
@@ -150,12 +157,16 @@
   }
 
   @Override
-  public V get(@Nullable Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     return get(key, table, mask);
   }
 
-  static <V> @Nullable V get(
-      @Nullable Object key, ImmutableMapEntry<?, V> @Nullable [] keyTable, int mask) {
+  @CheckForNull
+  static <V> V get(
+      @CheckForNull Object key,
+      @CheckForNull @Nullable ImmutableMapEntry<?, V>[] keyTable,
+      int mask) {
     if (key == null || keyTable == null) {
       return null;
     }
@@ -220,7 +231,7 @@
     }
 
     @Override
-    public boolean contains(Object object) {
+    public boolean contains(@CheckForNull Object object) {
       return map.containsKey(object);
     }
 
diff --git a/guava/src/com/google/common/collect/RegularImmutableMultiset.java b/guava/src/com/google/common/collect/RegularImmutableMultiset.java
index 93843da..026919e 100644
--- a/guava/src/com/google/common/collect/RegularImmutableMultiset.java
+++ b/guava/src/com/google/common/collect/RegularImmutableMultiset.java
@@ -24,6 +24,7 @@
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import java.util.Arrays;
 import java.util.Collection;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -34,38 +35,41 @@
  */
 @GwtCompatible(emulated = true, serializable = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+@ElementTypesAreNonnullByDefault
 class RegularImmutableMultiset<E> extends ImmutableMultiset<E> {
+  private static final ImmutableEntry<?>[] EMPTY_ARRAY = new ImmutableEntry<?>[0];
   static final ImmutableMultiset<Object> EMPTY = create(ImmutableList.<Entry<Object>>of());
 
   static <E> ImmutableMultiset<E> create(Collection<? extends Entry<? extends E>> entries) {
     int distinct = entries.size();
-    @SuppressWarnings("unchecked")
-    Multisets.ImmutableEntry<E>[] entryArray = new Multisets.ImmutableEntry[distinct];
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    ImmutableEntry<E>[] entryArray = new ImmutableEntry[distinct];
     if (distinct == 0) {
-      return new RegularImmutableMultiset<>(entryArray, null, 0, 0, ImmutableSet.of());
+      return new RegularImmutableMultiset<>(entryArray, EMPTY_ARRAY, 0, 0, ImmutableSet.of());
     }
     int tableSize = Hashing.closedTableSize(distinct, MAX_LOAD_FACTOR);
     int mask = tableSize - 1;
-    @SuppressWarnings("unchecked")
-    Multisets.ImmutableEntry<E>[] hashTable = new Multisets.ImmutableEntry[tableSize];
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    @Nullable
+    ImmutableEntry<E>[] hashTable = new @Nullable ImmutableEntry[tableSize];
 
     int index = 0;
     int hashCode = 0;
     long size = 0;
-    for (Entry<? extends E> entry : entries) {
+    for (Entry<? extends E> entryWithWildcard : entries) {
+      @SuppressWarnings("unchecked") // safe because we only read from it
+      Entry<E> entry = (Entry<E>) entryWithWildcard;
       E element = checkNotNull(entry.getElement());
       int count = entry.getCount();
       int hash = element.hashCode();
       int bucket = Hashing.smear(hash) & mask;
-      Multisets.ImmutableEntry<E> bucketHead = hashTable[bucket];
-      Multisets.ImmutableEntry<E> newEntry;
+      ImmutableEntry<E> bucketHead = hashTable[bucket];
+      ImmutableEntry<E> newEntry;
       if (bucketHead == null) {
         boolean canReuseEntry =
-            entry instanceof Multisets.ImmutableEntry && !(entry instanceof NonTerminalEntry);
+            entry instanceof ImmutableEntry && !(entry instanceof NonTerminalEntry);
         newEntry =
-            canReuseEntry
-                ? (Multisets.ImmutableEntry<E>) entry
-                : new Multisets.ImmutableEntry<E>(element, count);
+            canReuseEntry ? (ImmutableEntry<E>) entry : new ImmutableEntry<E>(element, count);
       } else {
         newEntry = new NonTerminalEntry<E>(element, count, bucketHead);
       }
@@ -81,12 +85,10 @@
             entryArray, hashTable, Ints.saturatedCast(size), hashCode, null);
   }
 
-  private static boolean hashFloodingDetected(Multisets.ImmutableEntry<?>[] hashTable) {
+  private static boolean hashFloodingDetected(@Nullable ImmutableEntry<?>[] hashTable) {
     for (int i = 0; i < hashTable.length; i++) {
       int bucketLength = 0;
-      for (Multisets.ImmutableEntry<?> entry = hashTable[i];
-          entry != null;
-          entry = entry.nextInBucket()) {
+      for (ImmutableEntry<?> entry = hashTable[i]; entry != null; entry = entry.nextInBucket()) {
         bucketLength++;
         if (bucketLength > MAX_HASH_BUCKET_LENGTH) {
           return true;
@@ -115,19 +117,19 @@
    */
   @VisibleForTesting static final int MAX_HASH_BUCKET_LENGTH = 9;
 
-  private final transient Multisets.ImmutableEntry<E>[] entries;
-  private final transient Multisets.ImmutableEntry<E> @Nullable [] hashTable;
+  private final transient ImmutableEntry<E>[] entries;
+  private final transient @Nullable ImmutableEntry<?>[] hashTable;
   private final transient int size;
   private final transient int hashCode;
 
-  @LazyInit private transient ImmutableSet<E> elementSet;
+  @LazyInit @CheckForNull private transient ImmutableSet<E> elementSet;
 
   private RegularImmutableMultiset(
       ImmutableEntry<E>[] entries,
-      ImmutableEntry<E>[] hashTable,
+      @Nullable ImmutableEntry<?>[] hashTable,
       int size,
       int hashCode,
-      ImmutableSet<E> elementSet) {
+      @CheckForNull ImmutableSet<E> elementSet) {
     this.entries = entries;
     this.hashTable = hashTable;
     this.size = size;
@@ -135,8 +137,8 @@
     this.elementSet = elementSet;
   }
 
-  private static final class NonTerminalEntry<E> extends Multisets.ImmutableEntry<E> {
-    private final Multisets.ImmutableEntry<E> nextInBucket;
+  private static final class NonTerminalEntry<E> extends ImmutableEntry<E> {
+    private final ImmutableEntry<E> nextInBucket;
 
     NonTerminalEntry(E element, int count, ImmutableEntry<E> nextInBucket) {
       super(element, count);
@@ -155,14 +157,14 @@
   }
 
   @Override
-  public int count(@Nullable Object element) {
-    Multisets.ImmutableEntry<E>[] hashTable = this.hashTable;
-    if (element == null || hashTable == null) {
+  public int count(@CheckForNull Object element) {
+    @Nullable ImmutableEntry<?>[] hashTable = this.hashTable;
+    if (element == null || hashTable.length == 0) {
       return 0;
     }
     int hash = Hashing.smearedHash(element);
     int mask = hashTable.length - 1;
-    for (Multisets.ImmutableEntry<E> entry = hashTable[hash & mask];
+    for (ImmutableEntry<?> entry = hashTable[hash & mask];
         entry != null;
         entry = entry.nextInBucket()) {
       if (Objects.equal(element, entry.getElement())) {
diff --git a/guava/src/com/google/common/collect/RegularImmutableSet.java b/guava/src/com/google/common/collect/RegularImmutableSet.java
index d4d2f20..211c893 100644
--- a/guava/src/com/google/common/collect/RegularImmutableSet.java
+++ b/guava/src/com/google/common/collect/RegularImmutableSet.java
@@ -20,6 +20,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import java.util.Spliterator;
 import java.util.Spliterators;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -29,28 +30,30 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
-final class RegularImmutableSet<E> extends ImmutableSet<E> {
+@ElementTypesAreNonnullByDefault
+final class RegularImmutableSet<E> extends ImmutableSet.CachingAsList<E> {
+  private static final Object[] EMPTY_ARRAY = new Object[0];
   static final RegularImmutableSet<Object> EMPTY =
-      new RegularImmutableSet<>(new Object[0], 0, null, 0);
+      new RegularImmutableSet<>(EMPTY_ARRAY, 0, EMPTY_ARRAY, 0);
 
   private final transient Object[] elements;
-  // the same elements in hashed positions (plus nulls)
-  @VisibleForTesting final transient Object[] table;
+  private final transient int hashCode;
+  // the same values as `elements` in hashed positions (plus nulls)
+  @VisibleForTesting final transient @Nullable Object[] table;
   // 'and' with an int to get a valid table index.
   private final transient int mask;
-  private final transient int hashCode;
 
-  RegularImmutableSet(Object[] elements, int hashCode, Object[] table, int mask) {
+  RegularImmutableSet(Object[] elements, int hashCode, @Nullable Object[] table, int mask) {
     this.elements = elements;
+    this.hashCode = hashCode;
     this.table = table;
     this.mask = mask;
-    this.hashCode = hashCode;
   }
 
   @Override
-  public boolean contains(@Nullable Object target) {
-    Object[] table = this.table;
-    if (target == null || table == null) {
+  public boolean contains(@CheckForNull Object target) {
+    @Nullable Object[] table = this.table;
+    if (target == null || table.length == 0) {
       return false;
     }
     for (int i = Hashing.smearedHash(target); ; i++) {
@@ -95,14 +98,16 @@
   }
 
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     System.arraycopy(elements, 0, dst, offset, elements.length);
     return offset + elements.length;
   }
 
   @Override
   ImmutableList<E> createAsList() {
-    return (table == null) ? ImmutableList.<E>of() : new RegularImmutableAsList<E>(this, elements);
+    return (table.length == 0)
+        ? ImmutableList.<E>of()
+        : new RegularImmutableAsList<E>(this, elements);
   }
 
   @Override
diff --git a/guava/src/com/google/common/collect/RegularImmutableSortedMultiset.java b/guava/src/com/google/common/collect/RegularImmutableSortedMultiset.java
index 3056d56..4b7ba87 100644
--- a/guava/src/com/google/common/collect/RegularImmutableSortedMultiset.java
+++ b/guava/src/com/google/common/collect/RegularImmutableSortedMultiset.java
@@ -23,7 +23,7 @@
 import com.google.common.primitives.Ints;
 import java.util.Comparator;
 import java.util.function.ObjIntConsumer;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable sorted multiset with one or more distinct elements.
@@ -32,6 +32,7 @@
  */
 @SuppressWarnings("serial") // uses writeReplace, not default serialization
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class RegularImmutableSortedMultiset<E> extends ImmutableSortedMultiset<E> {
   private static final long[] ZERO_CUMULATIVE_COUNTS = {0};
 
@@ -76,17 +77,19 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     return isEmpty() ? null : getEntry(0);
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     return isEmpty() ? null : getEntry(length - 1);
   }
 
   @Override
-  public int count(@Nullable Object element) {
+  public int count(@CheckForNull Object element) {
     int index = elementSet.indexOf(element);
     return (index >= 0) ? getCount(index) : 0;
   }
diff --git a/guava/src/com/google/common/collect/RegularImmutableSortedSet.java b/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
index c659ada..fcb683f 100644
--- a/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
+++ b/guava/src/com/google/common/collect/RegularImmutableSortedSet.java
@@ -28,7 +28,7 @@
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.function.Consumer;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable sorted set with one or more elements. TODO(jlevy): Consider separate class for a
@@ -39,6 +39,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings({"serial", "rawtypes"})
+@ElementTypesAreNonnullByDefault
 final class RegularImmutableSortedSet<E> extends ImmutableSortedSet<E> {
   static final RegularImmutableSortedSet<Comparable> NATURAL_EMPTY_SET =
       new RegularImmutableSortedSet<>(ImmutableList.<Comparable>of(), Ordering.natural());
@@ -51,6 +52,7 @@
   }
 
   @Override
+  @CheckForNull
   Object[] internalArray() {
     return elements.internalArray();
   }
@@ -92,7 +94,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object o) {
+  public boolean contains(@CheckForNull Object o) {
     try {
       return o != null && unsafeBinarySearch(o) >= 0;
     } catch (ClassCastException e) {
@@ -167,7 +169,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
@@ -220,24 +222,28 @@
   }
 
   @Override
+  @CheckForNull
   public E lower(E element) {
     int index = headIndex(element, false) - 1;
     return (index == -1) ? null : elements.get(index);
   }
 
   @Override
+  @CheckForNull
   public E floor(E element) {
     int index = headIndex(element, true) - 1;
     return (index == -1) ? null : elements.get(index);
   }
 
   @Override
+  @CheckForNull
   public E ceiling(E element) {
     int index = tailIndex(element, true);
     return (index == size()) ? null : elements.get(index);
   }
 
   @Override
+  @CheckForNull
   public E higher(E element) {
     int index = tailIndex(element, false);
     return (index == size()) ? null : elements.get(index);
@@ -297,7 +303,7 @@
   }
 
   @Override
-  int indexOf(@Nullable Object target) {
+  int indexOf(@CheckForNull Object target) {
     if (target == null) {
       return -1;
     }
diff --git a/guava/src/com/google/common/collect/RegularImmutableTable.java b/guava/src/com/google/common/collect/RegularImmutableTable.java
index 1511fa2..24434c5 100644
--- a/guava/src/com/google/common/collect/RegularImmutableTable.java
+++ b/guava/src/com/google/common/collect/RegularImmutableTable.java
@@ -24,7 +24,7 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link ImmutableTable} holding an arbitrary number of cells.
@@ -32,6 +32,7 @@
  * @author Gregory Kick
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 abstract class RegularImmutableTable<R, C, V> extends ImmutableTable<R, C, V> {
   RegularImmutableTable() {}
 
@@ -55,7 +56,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object object) {
+    public boolean contains(@CheckForNull Object object) {
       if (object instanceof Cell) {
         Cell<?, ?, ?> cell = (Cell<?, ?, ?>) object;
         Object value = RegularImmutableTable.this.get(cell.getRowKey(), cell.getColumnKey());
@@ -97,8 +98,8 @@
 
   static <R, C, V> RegularImmutableTable<R, C, V> forCells(
       List<Cell<R, C, V>> cells,
-      final @Nullable Comparator<? super R> rowComparator,
-      final @Nullable Comparator<? super C> columnComparator) {
+      @CheckForNull final Comparator<? super R> rowComparator,
+      @CheckForNull final Comparator<? super C> columnComparator) {
     checkNotNull(cells);
     if (rowComparator != null || columnComparator != null) {
       /*
@@ -135,8 +136,8 @@
 
   private static <R, C, V> RegularImmutableTable<R, C, V> forCellsInternal(
       Iterable<Cell<R, C, V>> cells,
-      @Nullable Comparator<? super R> rowComparator,
-      @Nullable Comparator<? super C> columnComparator) {
+      @CheckForNull Comparator<? super R> rowComparator,
+      @CheckForNull Comparator<? super C> columnComparator) {
     Set<R> rowSpaceBuilder = new LinkedHashSet<>();
     Set<C> columnSpaceBuilder = new LinkedHashSet<>();
     ImmutableList<Cell<R, C, V>> cellList = ImmutableList.copyOf(cells);
@@ -174,7 +175,7 @@
    * We could have declared this method 'static' but the additional compile-time checks achieved by
    * referencing the type variables seem worthwhile.
    */
-  final void checkNoDuplicate(R rowKey, C columnKey, V existingValue, V newValue) {
+  final void checkNoDuplicate(R rowKey, C columnKey, @CheckForNull V existingValue, V newValue) {
     checkArgument(
         existingValue == null,
         "Duplicate key: (row=%s, column=%s), values: [%s, %s].",
diff --git a/guava/src/com/google/common/collect/ReverseNaturalOrdering.java b/guava/src/com/google/common/collect/ReverseNaturalOrdering.java
index 612d846..f0c40cb 100644
--- a/guava/src/com/google/common/collect/ReverseNaturalOrdering.java
+++ b/guava/src/com/google/common/collect/ReverseNaturalOrdering.java
@@ -25,63 +25,64 @@
 /** An ordering that uses the reverse of the natural order of the values. */
 @GwtCompatible(serializable = true)
 @SuppressWarnings({"unchecked", "rawtypes"}) // TODO(kevinb): the right way to explain this??
-final class ReverseNaturalOrdering extends Ordering<Comparable> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class ReverseNaturalOrdering extends Ordering<Comparable<?>> implements Serializable {
   static final ReverseNaturalOrdering INSTANCE = new ReverseNaturalOrdering();
 
   @Override
-  public int compare(Comparable left, Comparable right) {
+  public int compare(Comparable<?> left, Comparable<?> right) {
     checkNotNull(left); // right null is caught later
     if (left == right) {
       return 0;
     }
 
-    return right.compareTo(left);
+    return ((Comparable<Object>) right).compareTo(left);
   }
 
   @Override
-  public <S extends Comparable> Ordering<S> reverse() {
+  public <S extends Comparable<?>> Ordering<S> reverse() {
     return Ordering.natural();
   }
 
   // Override the min/max methods to "hoist" delegation outside loops
 
   @Override
-  public <E extends Comparable> E min(E a, E b) {
+  public <E extends Comparable<?>> E min(E a, E b) {
     return NaturalOrdering.INSTANCE.max(a, b);
   }
 
   @Override
-  public <E extends Comparable> E min(E a, E b, E c, E... rest) {
+  public <E extends Comparable<?>> E min(E a, E b, E c, E... rest) {
     return NaturalOrdering.INSTANCE.max(a, b, c, rest);
   }
 
   @Override
-  public <E extends Comparable> E min(Iterator<E> iterator) {
+  public <E extends Comparable<?>> E min(Iterator<E> iterator) {
     return NaturalOrdering.INSTANCE.max(iterator);
   }
 
   @Override
-  public <E extends Comparable> E min(Iterable<E> iterable) {
+  public <E extends Comparable<?>> E min(Iterable<E> iterable) {
     return NaturalOrdering.INSTANCE.max(iterable);
   }
 
   @Override
-  public <E extends Comparable> E max(E a, E b) {
+  public <E extends Comparable<?>> E max(E a, E b) {
     return NaturalOrdering.INSTANCE.min(a, b);
   }
 
   @Override
-  public <E extends Comparable> E max(E a, E b, E c, E... rest) {
+  public <E extends Comparable<?>> E max(E a, E b, E c, E... rest) {
     return NaturalOrdering.INSTANCE.min(a, b, c, rest);
   }
 
   @Override
-  public <E extends Comparable> E max(Iterator<E> iterator) {
+  public <E extends Comparable<?>> E max(Iterator<E> iterator) {
     return NaturalOrdering.INSTANCE.min(iterator);
   }
 
   @Override
-  public <E extends Comparable> E max(Iterable<E> iterable) {
+  public <E extends Comparable<?>> E max(Iterable<E> iterable) {
     return NaturalOrdering.INSTANCE.min(iterable);
   }
 
diff --git a/guava/src/com/google/common/collect/ReverseOrdering.java b/guava/src/com/google/common/collect/ReverseOrdering.java
index ab9c3ac..6c1e74d 100644
--- a/guava/src/com/google/common/collect/ReverseOrdering.java
+++ b/guava/src/com/google/common/collect/ReverseOrdering.java
@@ -21,11 +21,14 @@
 import com.google.common.annotations.GwtCompatible;
 import java.io.Serializable;
 import java.util.Iterator;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** An ordering that uses the reverse of a given order. */
 @GwtCompatible(serializable = true)
-final class ReverseOrdering<T> extends Ordering<T> implements Serializable {
+@ElementTypesAreNonnullByDefault
+final class ReverseOrdering<T extends @Nullable Object> extends Ordering<T>
+    implements Serializable {
   final Ordering<? super T> forwardOrder;
 
   ReverseOrdering(Ordering<? super T> forwardOrder) {
@@ -33,7 +36,7 @@
   }
 
   @Override
-  public int compare(T a, T b) {
+  public int compare(@ParametricNullness T a, @ParametricNullness T b) {
     return forwardOrder.compare(b, a);
   }
 
@@ -46,12 +49,13 @@
   // Override the min/max methods to "hoist" delegation outside loops
 
   @Override
-  public <E extends T> E min(E a, E b) {
+  public <E extends T> E min(@ParametricNullness E a, @ParametricNullness E b) {
     return forwardOrder.max(a, b);
   }
 
   @Override
-  public <E extends T> E min(E a, E b, E c, E... rest) {
+  public <E extends T> E min(
+      @ParametricNullness E a, @ParametricNullness E b, @ParametricNullness E c, E... rest) {
     return forwardOrder.max(a, b, c, rest);
   }
 
@@ -66,12 +70,13 @@
   }
 
   @Override
-  public <E extends T> E max(E a, E b) {
+  public <E extends T> E max(@ParametricNullness E a, @ParametricNullness E b) {
     return forwardOrder.min(a, b);
   }
 
   @Override
-  public <E extends T> E max(E a, E b, E c, E... rest) {
+  public <E extends T> E max(
+      @ParametricNullness E a, @ParametricNullness E b, @ParametricNullness E c, E... rest) {
     return forwardOrder.min(a, b, c, rest);
   }
 
@@ -91,7 +96,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/collect/RowSortedTable.java b/guava/src/com/google/common/collect/RowSortedTable.java
index 9cdae79..2c2d773 100644
--- a/guava/src/com/google/common/collect/RowSortedTable.java
+++ b/guava/src/com/google/common/collect/RowSortedTable.java
@@ -21,6 +21,7 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Interface that extends {@code Table} and whose rows are sorted.
@@ -33,7 +34,10 @@
  * @since 8.0
  */
 @GwtCompatible
-public interface RowSortedTable<R, C, V> extends Table<R, C, V> {
+@ElementTypesAreNonnullByDefault
+public interface RowSortedTable<
+        R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+    extends Table<R, C, V> {
   /**
    * {@inheritDoc}
    *
diff --git a/guava/src/com/google/common/collect/Serialization.java b/guava/src/com/google/common/collect/Serialization.java
index 929a48f..5e88067 100644
--- a/guava/src/com/google/common/collect/Serialization.java
+++ b/guava/src/com/google/common/collect/Serialization.java
@@ -23,6 +23,7 @@
 import java.lang.reflect.Field;
 import java.util.Collection;
 import java.util.Map;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides static methods for serializing collection classes.
@@ -33,6 +34,7 @@
  * @author Jared Levy
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class Serialization {
   private Serialization() {}
 
@@ -54,7 +56,8 @@
    * <p>The serialized output consists of the number of entries, first key, first value, second key,
    * second value, and so on.
    */
-  static <K, V> void writeMap(Map<K, V> map, ObjectOutputStream stream) throws IOException {
+  static <K extends @Nullable Object, V extends @Nullable Object> void writeMap(
+      Map<K, V> map, ObjectOutputStream stream) throws IOException {
     stream.writeInt(map.size());
     for (Map.Entry<K, V> entry : map.entrySet()) {
       stream.writeObject(entry.getKey());
@@ -66,8 +69,8 @@
    * Populates a map by reading an input stream, as part of deserialization. See {@link #writeMap}
    * for the data format.
    */
-  static <K, V> void populateMap(Map<K, V> map, ObjectInputStream stream)
-      throws IOException, ClassNotFoundException {
+  static <K extends @Nullable Object, V extends @Nullable Object> void populateMap(
+      Map<K, V> map, ObjectInputStream stream) throws IOException, ClassNotFoundException {
     int size = stream.readInt();
     populateMap(map, stream, size);
   }
@@ -76,7 +79,8 @@
    * Populates a map by reading an input stream, as part of deserialization. See {@link #writeMap}
    * for the data format. The size is determined by a prior call to {@link #readCount}.
    */
-  static <K, V> void populateMap(Map<K, V> map, ObjectInputStream stream, int size)
+  static <K extends @Nullable Object, V extends @Nullable Object> void populateMap(
+      Map<K, V> map, ObjectInputStream stream, int size)
       throws IOException, ClassNotFoundException {
     for (int i = 0; i < size; i++) {
       @SuppressWarnings("unchecked") // reading data stored by writeMap
@@ -94,8 +98,8 @@
    * <p>The serialized output consists of the number of distinct elements, the first element, its
    * count, the second element, its count, and so on.
    */
-  static <E> void writeMultiset(Multiset<E> multiset, ObjectOutputStream stream)
-      throws IOException {
+  static <E extends @Nullable Object> void writeMultiset(
+      Multiset<E> multiset, ObjectOutputStream stream) throws IOException {
     int entryCount = multiset.entrySet().size();
     stream.writeInt(entryCount);
     for (Multiset.Entry<E> entry : multiset.entrySet()) {
@@ -108,8 +112,8 @@
    * Populates a multiset by reading an input stream, as part of deserialization. See {@link
    * #writeMultiset} for the data format.
    */
-  static <E> void populateMultiset(Multiset<E> multiset, ObjectInputStream stream)
-      throws IOException, ClassNotFoundException {
+  static <E extends @Nullable Object> void populateMultiset(
+      Multiset<E> multiset, ObjectInputStream stream) throws IOException, ClassNotFoundException {
     int distinctElements = stream.readInt();
     populateMultiset(multiset, stream, distinctElements);
   }
@@ -119,7 +123,7 @@
    * #writeMultiset} for the data format. The number of distinct elements is determined by a prior
    * call to {@link #readCount}.
    */
-  static <E> void populateMultiset(
+  static <E extends @Nullable Object> void populateMultiset(
       Multiset<E> multiset, ObjectInputStream stream, int distinctElements)
       throws IOException, ClassNotFoundException {
     for (int i = 0; i < distinctElements; i++) {
@@ -138,8 +142,8 @@
    * <p>The serialized output consists of the number of distinct keys, and then for each distinct
    * key: the key, the number of values for that key, and the key's values.
    */
-  static <K, V> void writeMultimap(Multimap<K, V> multimap, ObjectOutputStream stream)
-      throws IOException {
+  static <K extends @Nullable Object, V extends @Nullable Object> void writeMultimap(
+      Multimap<K, V> multimap, ObjectOutputStream stream) throws IOException {
     stream.writeInt(multimap.asMap().size());
     for (Map.Entry<K, Collection<V>> entry : multimap.asMap().entrySet()) {
       stream.writeObject(entry.getKey());
@@ -154,7 +158,8 @@
    * Populates a multimap by reading an input stream, as part of deserialization. See {@link
    * #writeMultimap} for the data format.
    */
-  static <K, V> void populateMultimap(Multimap<K, V> multimap, ObjectInputStream stream)
+  static <K extends @Nullable Object, V extends @Nullable Object> void populateMultimap(
+      Multimap<K, V> multimap, ObjectInputStream stream)
       throws IOException, ClassNotFoundException {
     int distinctKeys = stream.readInt();
     populateMultimap(multimap, stream, distinctKeys);
@@ -165,7 +170,7 @@
    * #writeMultimap} for the data format. The number of distinct keys is determined by a prior call
    * to {@link #readCount}.
    */
-  static <K, V> void populateMultimap(
+  static <K extends @Nullable Object, V extends @Nullable Object> void populateMultimap(
       Multimap<K, V> multimap, ObjectInputStream stream, int distinctKeys)
       throws IOException, ClassNotFoundException {
     for (int i = 0; i < distinctKeys; i++) {
diff --git a/guava/src/com/google/common/collect/SetMultimap.java b/guava/src/com/google/common/collect/SetMultimap.java
index 90e6e1b..216533e 100644
--- a/guava/src/com/google/common/collect/SetMultimap.java
+++ b/guava/src/com/google/common/collect/SetMultimap.java
@@ -22,6 +22,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -41,6 +42,9 @@
  * {@code equals} comparisons. Use caution if mutable objects are used as keys or values in a {@code
  * SetMultimap}.
  *
+ * <p><b>Warning:</b> Do not modify either a key <i>or a value</i> of a {@code SetMultimap} in a way
+ * that affects its {@link Object#equals} behavior. Undefined behavior and bugs will result.
+ *
  * <p>See the Guava User Guide article on <a href=
  * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
  * Multimap}</a>.
@@ -49,7 +53,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public interface SetMultimap<K, V> extends Multimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface SetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends Multimap<K, V> {
   /**
    * {@inheritDoc}
    *
@@ -58,7 +64,7 @@
    * interface.
    */
   @Override
-  Set<V> get(@Nullable K key);
+  Set<V> get(@ParametricNullness K key);
 
   /**
    * {@inheritDoc}
@@ -69,7 +75,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  Set<V> removeAll(@Nullable Object key);
+  Set<V> removeAll(@CheckForNull Object key);
 
   /**
    * {@inheritDoc}
@@ -82,7 +88,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  Set<V> replaceValues(K key, Iterable<? extends V> values);
+  Set<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values);
 
   /**
    * {@inheritDoc}
@@ -114,5 +120,5 @@
    * empty {@code ListMultimap}.
    */
   @Override
-  boolean equals(@Nullable Object obj);
+  boolean equals(@CheckForNull Object obj);
 }
diff --git a/guava/src/com/google/common/collect/Sets.java b/guava/src/com/google/common/collect/Sets.java
index 3ad0f9d..5338bd2 100644
--- a/guava/src/com/google/common/collect/Sets.java
+++ b/guava/src/com/google/common/collect/Sets.java
@@ -28,6 +28,7 @@
 import com.google.common.collect.Collections2.FilteredCollection;
 import com.google.common.math.IntMath;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import java.io.Serializable;
 import java.util.AbstractSet;
 import java.util.Arrays;
@@ -51,6 +52,7 @@
 import java.util.function.Consumer;
 import java.util.stream.Collector;
 import java.util.stream.Stream;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -66,6 +68,7 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Sets {
   private Sets() {}
 
@@ -73,7 +76,7 @@
    * {@link AbstractSet} substitute without the potentially-quadratic {@code removeAll}
    * implementation.
    */
-  abstract static class ImprovedAbstractSet<E> extends AbstractSet<E> {
+  abstract static class ImprovedAbstractSet<E extends @Nullable Object> extends AbstractSet<E> {
     @Override
     public boolean removeAll(Collection<?> c) {
       return removeAllImpl(this, c);
@@ -137,42 +140,6 @@
     }
   }
 
-  private static final class Accumulator<E extends Enum<E>> {
-    static final Collector<Enum<?>, ?, ImmutableSet<? extends Enum<?>>> TO_IMMUTABLE_ENUM_SET =
-        (Collector)
-            Collector.<Enum, Accumulator, ImmutableSet<?>>of(
-                Accumulator::new,
-                Accumulator::add,
-                Accumulator::combine,
-                Accumulator::toImmutableSet,
-                Collector.Characteristics.UNORDERED);
-
-    private @Nullable EnumSet<E> set;
-
-    void add(E e) {
-      if (set == null) {
-        set = EnumSet.of(e);
-      } else {
-        set.add(e);
-      }
-    }
-
-    Accumulator<E> combine(Accumulator<E> other) {
-      if (this.set == null) {
-        return other;
-      } else if (other.set == null) {
-        return this;
-      } else {
-        this.set.addAll(other.set);
-        return this;
-      }
-    }
-
-    ImmutableSet<E> toImmutableSet() {
-      return (set == null) ? ImmutableSet.<E>of() : ImmutableEnumSet.asImmutable(set);
-    }
-  }
-
   /**
    * Returns a {@code Collector} that accumulates the input elements into a new {@code ImmutableSet}
    * with an implementation specialized for enums. Unlike {@link ImmutableSet#toImmutableSet}, the
@@ -181,7 +148,7 @@
    * @since 21.0
    */
   public static <E extends Enum<E>> Collector<E, ?, ImmutableSet<E>> toImmutableEnumSet() {
-    return (Collector) Accumulator.TO_IMMUTABLE_ENUM_SET;
+    return CollectCollectors.toImmutableEnumSet();
   }
 
   /**
@@ -210,7 +177,7 @@
    * deprecated. Instead, use the {@code HashSet} constructor directly, taking advantage of the new
    * <a href="http://goo.gl/iz2Wi">"diamond" syntax</a>.
    */
-  public static <E> HashSet<E> newHashSet() {
+  public static <E extends @Nullable Object> HashSet<E> newHashSet() {
     return new HashSet<E>();
   }
 
@@ -227,7 +194,7 @@
    * asList}{@code (...))}, or for creating an empty set then calling {@link Collections#addAll}.
    * This method is not actually very useful and will likely be deprecated in the future.
    */
-  public static <E> HashSet<E> newHashSet(E... elements) {
+  public static <E extends @Nullable Object> HashSet<E> newHashSet(E... elements) {
     HashSet<E> set = newHashSetWithExpectedSize(elements.length);
     Collections.addAll(set, elements);
     return set;
@@ -251,7 +218,7 @@
    *
    * <p>Overall, this method is not very useful and will likely be deprecated in the future.
    */
-  public static <E> HashSet<E> newHashSet(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> HashSet<E> newHashSet(Iterable<? extends E> elements) {
     return (elements instanceof Collection)
         ? new HashSet<E>((Collection<? extends E>) elements)
         : newHashSet(elements.iterator());
@@ -269,7 +236,7 @@
    *
    * <p>Overall, this method is not very useful and will likely be deprecated in the future.
    */
-  public static <E> HashSet<E> newHashSet(Iterator<? extends E> elements) {
+  public static <E extends @Nullable Object> HashSet<E> newHashSet(Iterator<? extends E> elements) {
     HashSet<E> set = newHashSet();
     Iterators.addAll(set, elements);
     return set;
@@ -287,7 +254,8 @@
    *     without resizing
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    */
-  public static <E> HashSet<E> newHashSetWithExpectedSize(int expectedSize) {
+  public static <E extends @Nullable Object> HashSet<E> newHashSetWithExpectedSize(
+      int expectedSize) {
     return new HashSet<E>(Maps.capacity(expectedSize));
   }
 
@@ -302,7 +270,7 @@
    * @since 15.0
    */
   public static <E> Set<E> newConcurrentHashSet() {
-    return Collections.newSetFromMap(new ConcurrentHashMap<E, Boolean>());
+    return Platform.newConcurrentHashSet();
   }
 
   /**
@@ -337,7 +305,7 @@
    *
    * @return a new, empty {@code LinkedHashSet}
    */
-  public static <E> LinkedHashSet<E> newLinkedHashSet() {
+  public static <E extends @Nullable Object> LinkedHashSet<E> newLinkedHashSet() {
     return new LinkedHashSet<E>();
   }
 
@@ -356,7 +324,8 @@
    * @param elements the elements that the set should contain, in order
    * @return a new {@code LinkedHashSet} containing those elements (minus duplicates)
    */
-  public static <E> LinkedHashSet<E> newLinkedHashSet(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> LinkedHashSet<E> newLinkedHashSet(
+      Iterable<? extends E> elements) {
     if (elements instanceof Collection) {
       return new LinkedHashSet<E>((Collection<? extends E>) elements);
     }
@@ -377,7 +346,8 @@
    * @throws IllegalArgumentException if {@code expectedSize} is negative
    * @since 11.0
    */
-  public static <E> LinkedHashSet<E> newLinkedHashSetWithExpectedSize(int expectedSize) {
+  public static <E extends @Nullable Object> LinkedHashSet<E> newLinkedHashSetWithExpectedSize(
+      int expectedSize) {
     return new LinkedHashSet<E>(Maps.capacity(expectedSize));
   }
 
@@ -442,7 +412,8 @@
    * @return a new, empty {@code TreeSet}
    * @throws NullPointerException if {@code comparator} is null
    */
-  public static <E> TreeSet<E> newTreeSet(Comparator<? super E> comparator) {
+  public static <E extends @Nullable Object> TreeSet<E> newTreeSet(
+      Comparator<? super E> comparator) {
     return new TreeSet<E>(checkNotNull(comparator));
   }
 
@@ -455,7 +426,7 @@
    *
    * @since 8.0
    */
-  public static <E> Set<E> newIdentityHashSet() {
+  public static <E extends @Nullable Object> Set<E> newIdentityHashSet() {
     return Collections.newSetFromMap(Maps.<E, Boolean>newIdentityHashMap());
   }
 
@@ -469,7 +440,7 @@
    * @since 12.0
    */
   @GwtIncompatible // CopyOnWriteArraySet
-  public static <E> CopyOnWriteArraySet<E> newCopyOnWriteArraySet() {
+  public static <E extends @Nullable Object> CopyOnWriteArraySet<E> newCopyOnWriteArraySet() {
     return new CopyOnWriteArraySet<E>();
   }
 
@@ -481,7 +452,8 @@
    * @since 12.0
    */
   @GwtIncompatible // CopyOnWriteArraySet
-  public static <E> CopyOnWriteArraySet<E> newCopyOnWriteArraySet(Iterable<? extends E> elements) {
+  public static <E extends @Nullable Object> CopyOnWriteArraySet<E> newCopyOnWriteArraySet(
+      Iterable<? extends E> elements) {
     // We copy elements to an ArrayList first, rather than incurring the
     // quadratic cost of adding them to the COWAS directly.
     Collection<? extends E> elementsCollection =
@@ -569,7 +541,8 @@
    * @deprecated Use {@link Collections#newSetFromMap} instead.
    */
   @Deprecated
-  public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
+  public static <E extends @Nullable Object> Set<E> newSetFromMap(
+      Map<E, Boolean> map) {
     return Collections.newSetFromMap(map);
   }
 
@@ -582,7 +555,7 @@
    *
    * @since 2.0
    */
-  public abstract static class SetView<E> extends AbstractSet<E> {
+  public abstract static class SetView<E extends @Nullable Object> extends AbstractSet<E> {
     private SetView() {} // no subclasses but our own
 
     /**
@@ -593,6 +566,7 @@
      * nonstandard notion of equivalence, for example if it is a {@link TreeSet} using a comparator
      * that is inconsistent with {@link Object#equals(Object)}.
      */
+    @SuppressWarnings("nullness") // Unsafe, but we can't fix it now.
     public ImmutableSet<E> immutableCopy() {
       return ImmutableSet.copyOf(this);
     }
@@ -621,7 +595,8 @@
     @CanIgnoreReturnValue
     @Deprecated
     @Override
-    public final boolean add(E e) {
+    @DoNotCall("Always throws UnsupportedOperationException")
+    public final boolean add(@ParametricNullness E e) {
       throw new UnsupportedOperationException();
     }
 
@@ -634,7 +609,8 @@
     @CanIgnoreReturnValue
     @Deprecated
     @Override
-    public final boolean remove(Object object) {
+    @DoNotCall("Always throws UnsupportedOperationException")
+    public final boolean remove(@CheckForNull Object object) {
       throw new UnsupportedOperationException();
     }
 
@@ -647,6 +623,7 @@
     @CanIgnoreReturnValue
     @Deprecated
     @Override
+    @DoNotCall("Always throws UnsupportedOperationException")
     public final boolean addAll(Collection<? extends E> newElements) {
       throw new UnsupportedOperationException();
     }
@@ -660,6 +637,7 @@
     @CanIgnoreReturnValue
     @Deprecated
     @Override
+    @DoNotCall("Always throws UnsupportedOperationException")
     public final boolean removeAll(Collection<?> oldElements) {
       throw new UnsupportedOperationException();
     }
@@ -673,6 +651,7 @@
     @CanIgnoreReturnValue
     @Deprecated
     @Override
+    @DoNotCall("Always throws UnsupportedOperationException")
     public final boolean removeIf(java.util.function.Predicate<? super E> filter) {
       throw new UnsupportedOperationException();
     }
@@ -686,6 +665,7 @@
     @CanIgnoreReturnValue
     @Deprecated
     @Override
+    @DoNotCall("Always throws UnsupportedOperationException")
     public final boolean retainAll(Collection<?> elementsToKeep) {
       throw new UnsupportedOperationException();
     }
@@ -698,6 +678,7 @@
      */
     @Deprecated
     @Override
+    @DoNotCall("Always throws UnsupportedOperationException")
     public final void clear() {
       throw new UnsupportedOperationException();
     }
@@ -718,10 +699,11 @@
    * that is not contained in {@code set1}.
    *
    * <p>Results are undefined if {@code set1} and {@code set2} are sets based on different
-   * equivalence relations (as {@link HashSet}, {@link TreeSet}, and the {@link Map#keySet} of an
-   * {@code IdentityHashMap} all are).
+   * equivalence relations, for example if {@code set1} is a {@link HashSet} and {@code set2} is a
+   * {@link TreeSet} or the {@link Map#keySet} of an {@code IdentityHashMap}.
    */
-  public static <E> SetView<E> union(final Set<? extends E> set1, final Set<? extends E> set2) {
+  public static <E extends @Nullable Object> SetView<E> union(
+      final Set<? extends E> set1, final Set<? extends E> set2) {
     checkNotNull(set1, "set1");
     checkNotNull(set2, "set2");
 
@@ -749,6 +731,7 @@
           final Iterator<? extends E> itr2 = set2.iterator();
 
           @Override
+          @CheckForNull
           protected E computeNext() {
             if (itr1.hasNext()) {
               return itr1.next();
@@ -766,7 +749,7 @@
 
       @Override
       public Stream<E> stream() {
-        return Stream.concat(set1.stream(), set2.stream().filter(e -> !set1.contains(e)));
+        return Stream.concat(set1.stream(), set2.stream().filter((E e) -> !set1.contains(e)));
       }
 
       @Override
@@ -775,7 +758,7 @@
       }
 
       @Override
-      public boolean contains(Object object) {
+      public boolean contains(@CheckForNull Object object) {
         return set1.contains(object) || set2.contains(object);
       }
 
@@ -787,6 +770,7 @@
       }
 
       @Override
+      @SuppressWarnings("nullness") // see supertype
       public ImmutableSet<E> immutableCopy() {
         return new ImmutableSet.Builder<E>().addAll(set1).addAll(set2).build();
       }
@@ -799,8 +783,8 @@
    * matches that of {@code set1}.
    *
    * <p>Results are undefined if {@code set1} and {@code set2} are sets based on different
-   * equivalence relations (as {@code HashSet}, {@code TreeSet}, and the keySet of an {@code
-   * IdentityHashMap} all are).
+   * equivalence relations, for example if {@code set1} is a {@link HashSet} and {@code set2} is a
+   * {@link TreeSet} or the {@link Map#keySet} of an {@code IdentityHashMap}.
    *
    * <p><b>Note:</b> The returned view performs slightly better when {@code set1} is the smaller of
    * the two sets. If you have reason to believe one of your sets will generally be smaller than the
@@ -820,7 +804,8 @@
    *
    * <p>This is unfortunate, but should come up only very rarely.
    */
-  public static <E> SetView<E> intersection(final Set<E> set1, final Set<?> set2) {
+  public static <E extends @Nullable Object> SetView<E> intersection(
+      final Set<E> set1, final Set<?> set2) {
     checkNotNull(set1, "set1");
     checkNotNull(set2, "set2");
 
@@ -831,6 +816,7 @@
           final Iterator<E> itr = set1.iterator();
 
           @Override
+          @CheckForNull
           protected E computeNext() {
             while (itr.hasNext()) {
               E e = itr.next();
@@ -870,7 +856,7 @@
       }
 
       @Override
-      public boolean contains(Object object) {
+      public boolean contains(@CheckForNull Object object) {
         return set1.contains(object) && set2.contains(object);
       }
 
@@ -888,10 +874,11 @@
    * order of the returned set matches that of {@code set1}.
    *
    * <p>Results are undefined if {@code set1} and {@code set2} are sets based on different
-   * equivalence relations (as {@code HashSet}, {@code TreeSet}, and the keySet of an {@code
-   * IdentityHashMap} all are).
+   * equivalence relations, for example if {@code set1} is a {@link HashSet} and {@code set2} is a
+   * {@link TreeSet} or the {@link Map#keySet} of an {@code IdentityHashMap}.
    */
-  public static <E> SetView<E> difference(final Set<E> set1, final Set<?> set2) {
+  public static <E extends @Nullable Object> SetView<E> difference(
+      final Set<E> set1, final Set<?> set2) {
     checkNotNull(set1, "set1");
     checkNotNull(set2, "set2");
 
@@ -902,6 +889,7 @@
           final Iterator<E> itr = set1.iterator();
 
           @Override
+          @CheckForNull
           protected E computeNext() {
             while (itr.hasNext()) {
               E e = itr.next();
@@ -941,7 +929,7 @@
       }
 
       @Override
-      public boolean contains(Object element) {
+      public boolean contains(@CheckForNull Object element) {
         return set1.contains(element) && !set2.contains(element);
       }
     };
@@ -953,12 +941,12 @@
    * both. The iteration order of the returned set is undefined.
    *
    * <p>Results are undefined if {@code set1} and {@code set2} are sets based on different
-   * equivalence relations (as {@code HashSet}, {@code TreeSet}, and the keySet of an {@code
-   * IdentityHashMap} all are).
+   * equivalence relations, for example if {@code set1} is a {@link HashSet} and {@code set2} is a
+   * {@link TreeSet} or the {@link Map#keySet} of an {@code IdentityHashMap}.
    *
    * @since 3.0
    */
-  public static <E> SetView<E> symmetricDifference(
+  public static <E extends @Nullable Object> SetView<E> symmetricDifference(
       final Set<? extends E> set1, final Set<? extends E> set2) {
     checkNotNull(set1, "set1");
     checkNotNull(set2, "set2");
@@ -970,6 +958,7 @@
         final Iterator<? extends E> itr2 = set2.iterator();
         return new AbstractIterator<E>() {
           @Override
+          @CheckForNull
           public E computeNext() {
             while (itr1.hasNext()) {
               E elem1 = itr1.next();
@@ -1010,7 +999,7 @@
       }
 
       @Override
-      public boolean contains(Object element) {
+      public boolean contains(@CheckForNull Object element) {
         return set1.contains(element) ^ set2.contains(element);
       }
     };
@@ -1043,7 +1032,8 @@
    * you to migrate to streams.
    */
   // TODO(kevinb): how to omit that last sentence when building GWT javadoc?
-  public static <E> Set<E> filter(Set<E> unfiltered, Predicate<? super E> predicate) {
+  public static <E extends @Nullable Object> Set<E> filter(
+      Set<E> unfiltered, Predicate<? super E> predicate) {
     if (unfiltered instanceof SortedSet) {
       return filter((SortedSet<E>) unfiltered, predicate);
     }
@@ -1082,7 +1072,8 @@
    *
    * @since 11.0
    */
-  public static <E> SortedSet<E> filter(SortedSet<E> unfiltered, Predicate<? super E> predicate) {
+  public static <E extends @Nullable Object> SortedSet<E> filter(
+      SortedSet<E> unfiltered, Predicate<? super E> predicate) {
     if (unfiltered instanceof FilteredSet) {
       // Support clear(), removeAll(), and retainAll() when filtering a filtered
       // collection.
@@ -1120,7 +1111,7 @@
    */
   @GwtIncompatible // NavigableSet
   @SuppressWarnings("unchecked")
-  public static <E> NavigableSet<E> filter(
+  public static <E extends @Nullable Object> NavigableSet<E> filter(
       NavigableSet<E> unfiltered, Predicate<? super E> predicate) {
     if (unfiltered instanceof FilteredSet) {
       // Support clear(), removeAll(), and retainAll() when filtering a filtered
@@ -1133,13 +1124,14 @@
     return new FilteredNavigableSet<E>(checkNotNull(unfiltered), checkNotNull(predicate));
   }
 
-  private static class FilteredSet<E> extends FilteredCollection<E> implements Set<E> {
+  private static class FilteredSet<E extends @Nullable Object> extends FilteredCollection<E>
+      implements Set<E> {
     FilteredSet(Set<E> unfiltered, Predicate<? super E> predicate) {
       super(unfiltered, predicate);
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       return equalsImpl(this, object);
     }
 
@@ -1149,39 +1141,43 @@
     }
   }
 
-  private static class FilteredSortedSet<E> extends FilteredSet<E> implements SortedSet<E> {
+  private static class FilteredSortedSet<E extends @Nullable Object> extends FilteredSet<E>
+      implements SortedSet<E> {
 
     FilteredSortedSet(SortedSet<E> unfiltered, Predicate<? super E> predicate) {
       super(unfiltered, predicate);
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super E> comparator() {
       return ((SortedSet<E>) unfiltered).comparator();
     }
 
     @Override
-    public SortedSet<E> subSet(E fromElement, E toElement) {
+    public SortedSet<E> subSet(@ParametricNullness E fromElement, @ParametricNullness E toElement) {
       return new FilteredSortedSet<E>(
           ((SortedSet<E>) unfiltered).subSet(fromElement, toElement), predicate);
     }
 
     @Override
-    public SortedSet<E> headSet(E toElement) {
+    public SortedSet<E> headSet(@ParametricNullness E toElement) {
       return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).headSet(toElement), predicate);
     }
 
     @Override
-    public SortedSet<E> tailSet(E fromElement) {
+    public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
       return new FilteredSortedSet<E>(((SortedSet<E>) unfiltered).tailSet(fromElement), predicate);
     }
 
     @Override
+    @ParametricNullness
     public E first() {
       return Iterators.find(unfiltered.iterator(), predicate);
     }
 
     @Override
+    @ParametricNullness
     public E last() {
       SortedSet<E> sortedUnfiltered = (SortedSet<E>) unfiltered;
       while (true) {
@@ -1195,7 +1191,7 @@
   }
 
   @GwtIncompatible // NavigableSet
-  private static class FilteredNavigableSet<E> extends FilteredSortedSet<E>
+  private static class FilteredNavigableSet<E extends @Nullable Object> extends FilteredSortedSet<E>
       implements NavigableSet<E> {
     FilteredNavigableSet(NavigableSet<E> unfiltered, Predicate<? super E> predicate) {
       super(unfiltered, predicate);
@@ -1206,31 +1202,37 @@
     }
 
     @Override
-    public @Nullable E lower(E e) {
+    @CheckForNull
+    public E lower(@ParametricNullness E e) {
       return Iterators.find(unfiltered().headSet(e, false).descendingIterator(), predicate, null);
     }
 
     @Override
-    public @Nullable E floor(E e) {
+    @CheckForNull
+    public E floor(@ParametricNullness E e) {
       return Iterators.find(unfiltered().headSet(e, true).descendingIterator(), predicate, null);
     }
 
     @Override
-    public E ceiling(E e) {
+    @CheckForNull
+    public E ceiling(@ParametricNullness E e) {
       return Iterables.find(unfiltered().tailSet(e, true), predicate, null);
     }
 
     @Override
-    public E higher(E e) {
+    @CheckForNull
+    public E higher(@ParametricNullness E e) {
       return Iterables.find(unfiltered().tailSet(e, false), predicate, null);
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       return Iterables.removeFirstMatching(unfiltered(), predicate);
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       return Iterables.removeFirstMatching(unfiltered().descendingSet(), predicate);
     }
@@ -1246,24 +1248,28 @@
     }
 
     @Override
+    @ParametricNullness
     public E last() {
       return Iterators.find(unfiltered().descendingIterator(), predicate);
     }
 
     @Override
     public NavigableSet<E> subSet(
-        E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+        @ParametricNullness E fromElement,
+        boolean fromInclusive,
+        @ParametricNullness E toElement,
+        boolean toInclusive) {
       return filter(
           unfiltered().subSet(fromElement, fromInclusive, toElement, toInclusive), predicate);
     }
 
     @Override
-    public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+    public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
       return filter(unfiltered().headSet(toElement, inclusive), predicate);
     }
 
     @Override
-    public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+    public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
       return filter(unfiltered().tailSet(fromElement, inclusive), predicate);
     }
   }
@@ -1429,7 +1435,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object object) {
+    public boolean contains(@CheckForNull Object object) {
       if (!(object instanceof List)) {
         return false;
       }
@@ -1448,7 +1454,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       // Warning: this is broken if size() == 0, so it is critical that we
       // substitute an empty ImmutableSet to the user in place of this
       if (object instanceof CartesianSet) {
@@ -1548,7 +1554,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object o) {
+    public boolean contains(@CheckForNull Object o) {
       Integer index = inputSet.get(o);
       return index != null && (mask & (1 << index)) != 0;
     }
@@ -1584,7 +1590,7 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object obj) {
+    public boolean contains(@CheckForNull Object obj) {
       if (obj instanceof Set) {
         Set<?> set = (Set<?>) obj;
         return inputSet.keySet().containsAll(set);
@@ -1593,7 +1599,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof PowerSet) {
         PowerSet<?> that = (PowerSet<?>) obj;
         return inputSet.keySet().equals(that.inputSet.keySet());
@@ -1653,7 +1659,7 @@
     }
     return new AbstractSet<Set<E>>() {
       @Override
-      public boolean contains(@Nullable Object o) {
+      public boolean contains(@CheckForNull Object o) {
         if (o instanceof Set) {
           Set<?> s = (Set<?>) o;
           return s.size() == size && index.keySet().containsAll(s);
@@ -1667,6 +1673,7 @@
           final BitSet bits = new BitSet(index.size());
 
           @Override
+          @CheckForNull
           protected Set<E> computeNext() {
             if (bits.isEmpty()) {
               bits.set(0, size);
@@ -1698,7 +1705,7 @@
             final BitSet copy = (BitSet) bits.clone();
             return new AbstractSet<E>() {
               @Override
-              public boolean contains(@Nullable Object o) {
+              public boolean contains(@CheckForNull Object o) {
                 Integer i = index.get(o);
                 return i != null && copy.get(i);
               }
@@ -1709,6 +1716,7 @@
                   int i = -1;
 
                   @Override
+                  @CheckForNull
                   protected E computeNext() {
                     i = copy.nextSetBit(i + 1);
                     if (i == -1) {
@@ -1753,7 +1761,7 @@
   }
 
   /** An implementation for {@link Set#equals(Object)}. */
-  static boolean equalsImpl(Set<?> s, @Nullable Object object) {
+  static boolean equalsImpl(Set<?> s, @CheckForNull Object object) {
     if (s == object) {
       return true;
     }
@@ -1782,15 +1790,16 @@
    * @return an unmodifiable view of the specified navigable set
    * @since 12.0
    */
-  public static <E> NavigableSet<E> unmodifiableNavigableSet(NavigableSet<E> set) {
+  public static <E extends @Nullable Object> NavigableSet<E> unmodifiableNavigableSet(
+      NavigableSet<E> set) {
     if (set instanceof ImmutableCollection || set instanceof UnmodifiableNavigableSet) {
       return set;
     }
     return new UnmodifiableNavigableSet<E>(set);
   }
 
-  static final class UnmodifiableNavigableSet<E> extends ForwardingSortedSet<E>
-      implements NavigableSet<E>, Serializable {
+  static final class UnmodifiableNavigableSet<E extends @Nullable Object>
+      extends ForwardingSortedSet<E> implements NavigableSet<E>, Serializable {
     private final NavigableSet<E> delegate;
     private final SortedSet<E> unmodifiableDelegate;
 
@@ -1827,36 +1836,42 @@
     }
 
     @Override
-    public E lower(E e) {
+    @CheckForNull
+    public E lower(@ParametricNullness E e) {
       return delegate.lower(e);
     }
 
     @Override
-    public E floor(E e) {
+    @CheckForNull
+    public E floor(@ParametricNullness E e) {
       return delegate.floor(e);
     }
 
     @Override
-    public E ceiling(E e) {
+    @CheckForNull
+    public E ceiling(@ParametricNullness E e) {
       return delegate.ceiling(e);
     }
 
     @Override
-    public E higher(E e) {
+    @CheckForNull
+    public E higher(@ParametricNullness E e) {
       return delegate.higher(e);
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       throw new UnsupportedOperationException();
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       throw new UnsupportedOperationException();
     }
 
-    private transient @Nullable UnmodifiableNavigableSet<E> descendingSet;
+    @CheckForNull private transient UnmodifiableNavigableSet<E> descendingSet;
 
     @Override
     public NavigableSet<E> descendingSet() {
@@ -1875,18 +1890,21 @@
 
     @Override
     public NavigableSet<E> subSet(
-        E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+        @ParametricNullness E fromElement,
+        boolean fromInclusive,
+        @ParametricNullness E toElement,
+        boolean toInclusive) {
       return unmodifiableNavigableSet(
           delegate.subSet(fromElement, fromInclusive, toElement, toInclusive));
     }
 
     @Override
-    public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+    public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
       return unmodifiableNavigableSet(delegate.headSet(toElement, inclusive));
     }
 
     @Override
-    public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+    public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
       return unmodifiableNavigableSet(delegate.tailSet(fromElement, inclusive));
     }
 
@@ -1939,7 +1957,8 @@
    * @since 13.0
    */
   @GwtIncompatible // NavigableSet
-  public static <E> NavigableSet<E> synchronizedNavigableSet(NavigableSet<E> navigableSet) {
+  public static <E extends @Nullable Object> NavigableSet<E> synchronizedNavigableSet(
+      NavigableSet<E> navigableSet) {
     return Synchronized.navigableSet(navigableSet);
   }
 
@@ -1972,7 +1991,7 @@
   }
 
   @GwtIncompatible // NavigableSet
-  static class DescendingSet<E> extends ForwardingNavigableSet<E> {
+  static class DescendingSet<E extends @Nullable Object> extends ForwardingNavigableSet<E> {
     private final NavigableSet<E> forward;
 
     DescendingSet(NavigableSet<E> forward) {
@@ -1985,31 +2004,37 @@
     }
 
     @Override
-    public E lower(E e) {
+    @CheckForNull
+    public E lower(@ParametricNullness E e) {
       return forward.higher(e);
     }
 
     @Override
-    public E floor(E e) {
+    @CheckForNull
+    public E floor(@ParametricNullness E e) {
       return forward.ceiling(e);
     }
 
     @Override
-    public E ceiling(E e) {
+    @CheckForNull
+    public E ceiling(@ParametricNullness E e) {
       return forward.floor(e);
     }
 
     @Override
-    public E higher(E e) {
+    @CheckForNull
+    public E higher(@ParametricNullness E e) {
       return forward.lower(e);
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       return forward.pollLast();
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       return forward.pollFirst();
     }
@@ -2026,32 +2051,35 @@
 
     @Override
     public NavigableSet<E> subSet(
-        E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+        @ParametricNullness E fromElement,
+        boolean fromInclusive,
+        @ParametricNullness E toElement,
+        boolean toInclusive) {
       return forward.subSet(toElement, toInclusive, fromElement, fromInclusive).descendingSet();
     }
 
     @Override
-    public SortedSet<E> subSet(E fromElement, E toElement) {
+    public SortedSet<E> subSet(@ParametricNullness E fromElement, @ParametricNullness E toElement) {
       return standardSubSet(fromElement, toElement);
     }
 
     @Override
-    public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+    public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
       return forward.tailSet(toElement, inclusive).descendingSet();
     }
 
     @Override
-    public SortedSet<E> headSet(E toElement) {
+    public SortedSet<E> headSet(@ParametricNullness E toElement) {
       return standardHeadSet(toElement);
     }
 
     @Override
-    public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+    public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
       return forward.headSet(fromElement, inclusive).descendingSet();
     }
 
     @Override
-    public SortedSet<E> tailSet(E fromElement) {
+    public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
       return standardTailSet(fromElement);
     }
 
@@ -2067,16 +2095,18 @@
     }
 
     // If we inline this, we get a javac error.
-    private static <T> Ordering<T> reverse(Comparator<T> forward) {
+    private static <T extends @Nullable Object> Ordering<T> reverse(Comparator<T> forward) {
       return Ordering.from(forward).reverse();
     }
 
     @Override
+    @ParametricNullness
     public E first() {
       return forward.last();
     }
 
     @Override
+    @ParametricNullness
     public E last() {
       return forward.first();
     }
@@ -2087,12 +2117,13 @@
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       return standardToArray();
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       return standardToArray(array);
     }
 
diff --git a/guava/src/com/google/common/collect/SingletonImmutableBiMap.java b/guava/src/com/google/common/collect/SingletonImmutableBiMap.java
index ea6f275..c5fb2b2 100644
--- a/guava/src/com/google/common/collect/SingletonImmutableBiMap.java
+++ b/guava/src/com/google/common/collect/SingletonImmutableBiMap.java
@@ -23,7 +23,7 @@
 import com.google.errorprone.annotations.concurrent.LazyInit;
 import com.google.j2objc.annotations.RetainedWith;
 import java.util.function.BiConsumer;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@link ImmutableMap} with exactly one entry.
@@ -33,6 +33,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+@ElementTypesAreNonnullByDefault
 final class SingletonImmutableBiMap<K, V> extends ImmutableBiMap<K, V> {
 
   final transient K singleKey;
@@ -52,7 +53,8 @@
   }
 
   @Override
-  public V get(@Nullable Object key) {
+  @CheckForNull
+  public V get(@CheckForNull Object key) {
     return singleKey.equals(key) ? singleValue : null;
   }
 
@@ -67,12 +69,12 @@
   }
 
   @Override
-  public boolean containsKey(@Nullable Object key) {
+  public boolean containsKey(@CheckForNull Object key) {
     return singleKey.equals(key);
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return singleValue.equals(value);
   }
 
@@ -91,8 +93,8 @@
     return ImmutableSet.of(singleKey);
   }
 
-  private final transient @Nullable ImmutableBiMap<V, K> inverse;
-  @LazyInit @RetainedWith private transient @Nullable ImmutableBiMap<V, K> lazyInverse;
+  @CheckForNull private final transient ImmutableBiMap<V, K> inverse;
+  @LazyInit @RetainedWith @CheckForNull private transient ImmutableBiMap<V, K> lazyInverse;
 
   @Override
   public ImmutableBiMap<V, K> inverse() {
diff --git a/guava/src/com/google/common/collect/SingletonImmutableList.java b/guava/src/com/google/common/collect/SingletonImmutableList.java
index eec0daa..a7ac8b3 100644
--- a/guava/src/com/google/common/collect/SingletonImmutableList.java
+++ b/guava/src/com/google/common/collect/SingletonImmutableList.java
@@ -30,6 +30,7 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+@ElementTypesAreNonnullByDefault
 final class SingletonImmutableList<E> extends ImmutableList<E> {
 
   final transient E element;
diff --git a/guava/src/com/google/common/collect/SingletonImmutableSet.java b/guava/src/com/google/common/collect/SingletonImmutableSet.java
index 0f882b3..088cb80 100644
--- a/guava/src/com/google/common/collect/SingletonImmutableSet.java
+++ b/guava/src/com/google/common/collect/SingletonImmutableSet.java
@@ -18,7 +18,8 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Preconditions;
-import com.google.errorprone.annotations.concurrent.LazyInit;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Implementation of {@link ImmutableSet} with exactly one element.
@@ -28,35 +29,24 @@
  */
 @GwtCompatible(serializable = true, emulated = true)
 @SuppressWarnings("serial") // uses writeReplace(), not default serialization
+@ElementTypesAreNonnullByDefault
 final class SingletonImmutableSet<E> extends ImmutableSet<E> {
+  // We deliberately avoid caching the asList and hashCode here, to ensure that with
+  // compressed oops, a SingletonImmutableSet packs all the way down to the optimal 16 bytes.
 
   final transient E element;
-  // This is transient because it will be recalculated on the first
-  // call to hashCode().
-  //
-  // A race condition is avoided since threads will either see that the value
-  // is zero and recalculate it themselves, or two threads will see it at
-  // the same time, and both recalculate it.  If the cachedHashCode is 0,
-  // it will always be recalculated, unfortunately.
-  @LazyInit private transient int cachedHashCode;
 
   SingletonImmutableSet(E element) {
     this.element = Preconditions.checkNotNull(element);
   }
 
-  SingletonImmutableSet(E element, int hashCode) {
-    // Guaranteed to be non-null by the presence of the pre-computed hash code.
-    this.element = element;
-    cachedHashCode = hashCode;
-  }
-
   @Override
   public int size() {
     return 1;
   }
 
   @Override
-  public boolean contains(Object target) {
+  public boolean contains(@CheckForNull Object target) {
     return element.equals(target);
   }
 
@@ -66,7 +56,7 @@
   }
 
   @Override
-  ImmutableList<E> createAsList() {
+  public ImmutableList<E> asList() {
     return ImmutableList.of(element);
   }
 
@@ -76,24 +66,14 @@
   }
 
   @Override
-  int copyIntoArray(Object[] dst, int offset) {
+  int copyIntoArray(@Nullable Object[] dst, int offset) {
     dst[offset] = element;
     return offset + 1;
   }
 
   @Override
   public final int hashCode() {
-    // Racy single-check.
-    int code = cachedHashCode;
-    if (code == 0) {
-      cachedHashCode = code = element.hashCode();
-    }
-    return code;
-  }
-
-  @Override
-  boolean isHashCodeFast() {
-    return cachedHashCode != 0;
+    return element.hashCode();
   }
 
   @Override
diff --git a/guava/src/com/google/common/collect/SingletonImmutableTable.java b/guava/src/com/google/common/collect/SingletonImmutableTable.java
index 58a182c..cfaeadb 100644
--- a/guava/src/com/google/common/collect/SingletonImmutableTable.java
+++ b/guava/src/com/google/common/collect/SingletonImmutableTable.java
@@ -27,6 +27,7 @@
  * @author Gregory Kick
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 class SingletonImmutableTable<R, C, V> extends ImmutableTable<R, C, V> {
   final R singleRowKey;
   final C singleColumnKey;
diff --git a/guava/src/com/google/common/collect/SortedIterable.java b/guava/src/com/google/common/collect/SortedIterable.java
index d46e8af..64ec08e 100644
--- a/guava/src/com/google/common/collect/SortedIterable.java
+++ b/guava/src/com/google/common/collect/SortedIterable.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.Iterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An {@code Iterable} whose elements are sorted relative to a {@code Comparator}, typically
@@ -25,7 +26,8 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-interface SortedIterable<T> extends Iterable<T> {
+@ElementTypesAreNonnullByDefault
+interface SortedIterable<T extends @Nullable Object> extends Iterable<T> {
   /**
    * Returns the {@code Comparator} by which the elements of this iterable are ordered, or {@code
    * Ordering.natural()} if the elements are ordered by their natural ordering.
diff --git a/guava/src/com/google/common/collect/SortedIterables.java b/guava/src/com/google/common/collect/SortedIterables.java
index 2c0aa7c..68b231a 100644
--- a/guava/src/com/google/common/collect/SortedIterables.java
+++ b/guava/src/com/google/common/collect/SortedIterables.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import java.util.Comparator;
 import java.util.SortedSet;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Utilities for dealing with sorted collections of all types.
@@ -26,6 +27,7 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class SortedIterables {
   private SortedIterables() {}
 
@@ -49,7 +51,8 @@
 
   @SuppressWarnings("unchecked")
   // if sortedSet.comparator() is null, the set must be naturally ordered
-  public static <E> Comparator<? super E> comparator(SortedSet<E> sortedSet) {
+  public static <E extends @Nullable Object> Comparator<? super E> comparator(
+      SortedSet<E> sortedSet) {
     Comparator<? super E> result = sortedSet.comparator();
     if (result == null) {
       result = (Comparator<? super E>) Ordering.natural();
diff --git a/guava/src/com/google/common/collect/SortedLists.java b/guava/src/com/google/common/collect/SortedLists.java
index 339e7fc..0ebaab2 100644
--- a/guava/src/com/google/common/collect/SortedLists.java
+++ b/guava/src/com/google/common/collect/SortedLists.java
@@ -35,29 +35,38 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-@Beta final class SortedLists {
+@Beta
+@ElementTypesAreNonnullByDefault
+final class SortedLists {
   private SortedLists() {}
 
   /**
    * A specification for which index to return if the list contains at least one element that
    * compares as equal to the key.
-   */ enum KeyPresentBehavior {
+   */
+  enum KeyPresentBehavior {
     /**
      * Return the index of any list element that compares as equal to the key. No guarantees are
      * made as to which index is returned, if more than one element compares as equal to the key.
      */
     ANY_PRESENT {
       @Override
-      <E> int resultIndex(
-          Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex) {
+      <E extends @Nullable Object> int resultIndex(
+          Comparator<? super E> comparator,
+          @ParametricNullness E key,
+          List<? extends E> list,
+          int foundIndex) {
         return foundIndex;
       }
     },
     /** Return the index of the last list element that compares as equal to the key. */
     LAST_PRESENT {
       @Override
-      <E> int resultIndex(
-          Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex) {
+      <E extends @Nullable Object> int resultIndex(
+          Comparator<? super E> comparator,
+          @ParametricNullness E key,
+          List<? extends E> list,
+          int foundIndex) {
         // Of course, we have to use binary search to find the precise
         // breakpoint...
         int lower = foundIndex;
@@ -78,8 +87,11 @@
     /** Return the index of the first list element that compares as equal to the key. */
     FIRST_PRESENT {
       @Override
-      <E> int resultIndex(
-          Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex) {
+      <E extends @Nullable Object> int resultIndex(
+          Comparator<? super E> comparator,
+          @ParametricNullness E key,
+          List<? extends E> list,
+          int foundIndex) {
         // Of course, we have to use binary search to find the precise
         // breakpoint...
         int lower = 0;
@@ -104,8 +116,11 @@
      */
     FIRST_AFTER {
       @Override
-      public <E> int resultIndex(
-          Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex) {
+      public <E extends @Nullable Object> int resultIndex(
+          Comparator<? super E> comparator,
+          @ParametricNullness E key,
+          List<? extends E> list,
+          int foundIndex) {
         return LAST_PRESENT.resultIndex(comparator, key, list, foundIndex) + 1;
       }
     },
@@ -115,20 +130,27 @@
      */
     LAST_BEFORE {
       @Override
-      public <E> int resultIndex(
-          Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex) {
+      public <E extends @Nullable Object> int resultIndex(
+          Comparator<? super E> comparator,
+          @ParametricNullness E key,
+          List<? extends E> list,
+          int foundIndex) {
         return FIRST_PRESENT.resultIndex(comparator, key, list, foundIndex) - 1;
       }
     };
 
-    abstract <E> int resultIndex(
-        Comparator<? super E> comparator, E key, List<? extends E> list, int foundIndex);
+    abstract <E extends @Nullable Object> int resultIndex(
+        Comparator<? super E> comparator,
+        @ParametricNullness E key,
+        List<? extends E> list,
+        int foundIndex);
   }
 
   /**
    * A specification for which index to return if the list contains no elements that compare as
    * equal to the key.
-   */ enum KeyAbsentBehavior {
+   */
+  enum KeyAbsentBehavior {
     /**
      * Return the index of the next lower element in the list, or {@code -1} if there is no such
      * element.
@@ -193,12 +215,13 @@
    * <p>Equivalent to {@link #binarySearch(List, Function, Object, Comparator, KeyPresentBehavior,
    * KeyAbsentBehavior)} using {@link Ordering#natural}.
    */
-  public static <E, K extends Comparable> int binarySearch(
+  public static <E extends @Nullable Object, K extends Comparable> int binarySearch(
       List<E> list,
       Function<? super E, K> keyFunction,
-      @Nullable K key,
+      K key,
       KeyPresentBehavior presentBehavior,
       KeyAbsentBehavior absentBehavior) {
+    checkNotNull(key);
     return binarySearch(
         list, keyFunction, key, Ordering.natural(), presentBehavior, absentBehavior);
   }
@@ -210,10 +233,10 @@
    * KeyAbsentBehavior)} using {@link Lists#transform(List, Function) Lists.transform(list,
    * keyFunction)}.
    */
-  public static <E, K> int binarySearch(
+  public static <E extends @Nullable Object, K extends @Nullable Object> int binarySearch(
       List<E> list,
       Function<? super E, K> keyFunction,
-      @Nullable K key,
+      @ParametricNullness K key,
       Comparator<? super K> keyComparator,
       KeyPresentBehavior presentBehavior,
       KeyAbsentBehavior absentBehavior) {
@@ -244,9 +267,9 @@
    * @return the index determined by the {@code KeyPresentBehavior}, if the key is in the list;
    *     otherwise the index determined by the {@code KeyAbsentBehavior}.
    */
-  public static <E> int binarySearch(
+  public static <E extends @Nullable Object> int binarySearch(
       List<? extends E> list,
-      @Nullable E key,
+      @ParametricNullness E key,
       Comparator<? super E> comparator,
       KeyPresentBehavior presentBehavior,
       KeyAbsentBehavior absentBehavior) {
diff --git a/guava/src/com/google/common/collect/SortedMapDifference.java b/guava/src/com/google/common/collect/SortedMapDifference.java
index 4715e93..46cac8a 100644
--- a/guava/src/com/google/common/collect/SortedMapDifference.java
+++ b/guava/src/com/google/common/collect/SortedMapDifference.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.SortedMap;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An object representing the differences between two sorted maps.
@@ -26,7 +27,9 @@
  * @since 8.0
  */
 @GwtCompatible
-public interface SortedMapDifference<K, V> extends MapDifference<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface SortedMapDifference<K extends @Nullable Object, V extends @Nullable Object>
+    extends MapDifference<K, V> {
 
   @Override
   SortedMap<K, V> entriesOnlyOnLeft();
diff --git a/guava/src/com/google/common/collect/SortedMultiset.java b/guava/src/com/google/common/collect/SortedMultiset.java
index 2635b37..68932f5 100644
--- a/guava/src/com/google/common/collect/SortedMultiset.java
+++ b/guava/src/com/google/common/collect/SortedMultiset.java
@@ -22,6 +22,8 @@
 import java.util.Iterator;
 import java.util.NavigableSet;
 import java.util.Set;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Multiset} which maintains the ordering of its elements, according to either their
@@ -42,7 +44,9 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
-public interface SortedMultiset<E> extends SortedMultisetBridge<E>, SortedIterable<E> {
+@ElementTypesAreNonnullByDefault
+public interface SortedMultiset<E extends @Nullable Object>
+    extends SortedMultisetBridge<E>, SortedIterable<E> {
   /**
    * Returns the comparator that orders this multiset, or {@link Ordering#natural()} if the natural
    * ordering of the elements is used.
@@ -54,24 +58,28 @@
    * Returns the entry of the first element in this multiset, or {@code null} if this multiset is
    * empty.
    */
+  @CheckForNull
   Entry<E> firstEntry();
 
   /**
    * Returns the entry of the last element in this multiset, or {@code null} if this multiset is
    * empty.
    */
+  @CheckForNull
   Entry<E> lastEntry();
 
   /**
    * Returns and removes the entry associated with the lowest element in this multiset, or returns
    * {@code null} if this multiset is empty.
    */
+  @CheckForNull
   Entry<E> pollFirstEntry();
 
   /**
    * Returns and removes the entry associated with the greatest element in this multiset, or returns
    * {@code null} if this multiset is empty.
    */
+  @CheckForNull
   Entry<E> pollLastEntry();
 
   /**
@@ -115,7 +123,7 @@
    * <p>The returned multiset will throw an {@link IllegalArgumentException} on attempts to add
    * elements outside its range.
    */
-  SortedMultiset<E> headMultiset(E upperBound, BoundType boundType);
+  SortedMultiset<E> headMultiset(@ParametricNullness E upperBound, BoundType boundType);
 
   /**
    * Returns a view of this multiset restricted to the range between {@code lowerBound} and {@code
@@ -130,7 +138,10 @@
    * lowerBoundType).headMultiset(upperBound, upperBoundType)}.
    */
   SortedMultiset<E> subMultiset(
-      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType);
+      @ParametricNullness E lowerBound,
+      BoundType lowerBoundType,
+      @ParametricNullness E upperBound,
+      BoundType upperBoundType);
 
   /**
    * Returns a view of this multiset restricted to the elements greater than {@code lowerBound},
@@ -141,5 +152,5 @@
    * <p>The returned multiset will throw an {@link IllegalArgumentException} on attempts to add
    * elements outside its range.
    */
-  SortedMultiset<E> tailMultiset(E lowerBound, BoundType boundType);
+  SortedMultiset<E> tailMultiset(@ParametricNullness E lowerBound, BoundType boundType);
 }
diff --git a/guava/src/com/google/common/collect/SortedMultisetBridge.java b/guava/src/com/google/common/collect/SortedMultisetBridge.java
index 064cb75..72d50be 100644
--- a/guava/src/com/google/common/collect/SortedMultisetBridge.java
+++ b/guava/src/com/google/common/collect/SortedMultisetBridge.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.GwtIncompatible;
 import java.util.SortedSet;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Superinterface of {@link SortedMultiset} to introduce a bridge method for {@code elementSet()},
@@ -27,7 +28,8 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
-interface SortedMultisetBridge<E> extends Multiset<E> {
+@ElementTypesAreNonnullByDefault
+interface SortedMultisetBridge<E extends @Nullable Object> extends Multiset<E> {
   @Override
   SortedSet<E> elementSet();
 }
diff --git a/guava/src/com/google/common/collect/SortedMultisets.java b/guava/src/com/google/common/collect/SortedMultisets.java
index a928959..1d1940c 100644
--- a/guava/src/com/google/common/collect/SortedMultisets.java
+++ b/guava/src/com/google/common/collect/SortedMultisets.java
@@ -28,6 +28,7 @@
 import java.util.NavigableSet;
 import java.util.NoSuchElementException;
 import java.util.SortedSet;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -36,11 +37,14 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class SortedMultisets {
   private SortedMultisets() {}
 
   /** A skeleton implementation for {@link SortedMultiset#elementSet}. */
-  static class ElementSet<E> extends Multisets.ElementSet<E> implements SortedSet<E> {
+  @SuppressWarnings("JdkObsolete") // TODO(b/6160855): Switch GWT emulations to NavigableSet.
+  static class ElementSet<E extends @Nullable Object> extends Multisets.ElementSet<E>
+      implements SortedSet<E> {
     @Weak private final SortedMultiset<E> multiset;
 
     ElementSet(SortedMultiset<E> multiset) {
@@ -63,26 +67,28 @@
     }
 
     @Override
-    public SortedSet<E> subSet(E fromElement, E toElement) {
+    public SortedSet<E> subSet(@ParametricNullness E fromElement, @ParametricNullness E toElement) {
       return multiset().subMultiset(fromElement, CLOSED, toElement, OPEN).elementSet();
     }
 
     @Override
-    public SortedSet<E> headSet(E toElement) {
+    public SortedSet<E> headSet(@ParametricNullness E toElement) {
       return multiset().headMultiset(toElement, OPEN).elementSet();
     }
 
     @Override
-    public SortedSet<E> tailSet(E fromElement) {
+    public SortedSet<E> tailSet(@ParametricNullness E fromElement) {
       return multiset().tailMultiset(fromElement, CLOSED).elementSet();
     }
 
     @Override
+    @ParametricNullness
     public E first() {
       return getElementOrThrow(multiset().firstEntry());
     }
 
     @Override
+    @ParametricNullness
     public E last() {
       return getElementOrThrow(multiset().lastEntry());
     }
@@ -90,28 +96,33 @@
 
   /** A skeleton navigable implementation for {@link SortedMultiset#elementSet}. */
   @GwtIncompatible // Navigable
-  static class NavigableElementSet<E> extends ElementSet<E> implements NavigableSet<E> {
+  static class NavigableElementSet<E extends @Nullable Object> extends ElementSet<E>
+      implements NavigableSet<E> {
     NavigableElementSet(SortedMultiset<E> multiset) {
       super(multiset);
     }
 
     @Override
-    public E lower(E e) {
+    @CheckForNull
+    public E lower(@ParametricNullness E e) {
       return getElementOrNull(multiset().headMultiset(e, OPEN).lastEntry());
     }
 
     @Override
-    public E floor(E e) {
+    @CheckForNull
+    public E floor(@ParametricNullness E e) {
       return getElementOrNull(multiset().headMultiset(e, CLOSED).lastEntry());
     }
 
     @Override
-    public E ceiling(E e) {
+    @CheckForNull
+    public E ceiling(@ParametricNullness E e) {
       return getElementOrNull(multiset().tailMultiset(e, CLOSED).firstEntry());
     }
 
     @Override
-    public E higher(E e) {
+    @CheckForNull
+    public E higher(@ParametricNullness E e) {
       return getElementOrNull(multiset().tailMultiset(e, OPEN).firstEntry());
     }
 
@@ -126,18 +137,23 @@
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       return getElementOrNull(multiset().pollFirstEntry());
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       return getElementOrNull(multiset().pollLastEntry());
     }
 
     @Override
     public NavigableSet<E> subSet(
-        E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
+        @ParametricNullness E fromElement,
+        boolean fromInclusive,
+        @ParametricNullness E toElement,
+        boolean toInclusive) {
       return new NavigableElementSet<E>(
           multiset()
               .subMultiset(
@@ -146,26 +162,27 @@
     }
 
     @Override
-    public NavigableSet<E> headSet(E toElement, boolean inclusive) {
+    public NavigableSet<E> headSet(@ParametricNullness E toElement, boolean inclusive) {
       return new NavigableElementSet<E>(
           multiset().headMultiset(toElement, BoundType.forBoolean(inclusive)));
     }
 
     @Override
-    public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
+    public NavigableSet<E> tailSet(@ParametricNullness E fromElement, boolean inclusive) {
       return new NavigableElementSet<E>(
           multiset().tailMultiset(fromElement, BoundType.forBoolean(inclusive)));
     }
   }
 
-  private static <E> E getElementOrThrow(Entry<E> entry) {
+  private static <E extends @Nullable Object> E getElementOrThrow(@CheckForNull Entry<E> entry) {
     if (entry == null) {
       throw new NoSuchElementException();
     }
     return entry.getElement();
   }
 
-  private static <E> E getElementOrNull(@Nullable Entry<E> entry) {
+  @CheckForNull
+  private static <E extends @Nullable Object> E getElementOrNull(@CheckForNull Entry<E> entry) {
     return (entry == null) ? null : entry.getElement();
   }
 }
diff --git a/guava/src/com/google/common/collect/SortedSetMultimap.java b/guava/src/com/google/common/collect/SortedSetMultimap.java
index 9f073bf..8449014 100644
--- a/guava/src/com/google/common/collect/SortedSetMultimap.java
+++ b/guava/src/com/google/common/collect/SortedSetMultimap.java
@@ -24,6 +24,7 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -37,6 +38,10 @@
  * Though the method signature doesn't say so explicitly, the map returned by {@link #asMap} has
  * {@code SortedSet} values.
  *
+ * <p><b>Warning:</b> As in all {@link SetMultimap}s, do not modify either a key <i>or a value</i>
+ * of a {@code SortedSetMultimap} in a way that affects its {@link Object#equals} behavior (or its
+ * position in the order of the values). Undefined behavior and bugs will result.
+ *
  * <p>See the Guava User Guide article on <a href=
  * "https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap"> {@code
  * Multimap}</a>.
@@ -45,7 +50,9 @@
  * @since 2.0
  */
 @GwtCompatible
-public interface SortedSetMultimap<K, V> extends SetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public interface SortedSetMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends SetMultimap<K, V> {
   // Following Javadoc copied from Multimap.
 
   /**
@@ -59,7 +66,7 @@
    * {@link Multimap} interface.
    */
   @Override
-  SortedSet<V> get(@Nullable K key);
+  SortedSet<V> get(@ParametricNullness K key);
 
   /**
    * Removes all values associated with a given key.
@@ -70,7 +77,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  SortedSet<V> removeAll(@Nullable Object key);
+  SortedSet<V> removeAll(@CheckForNull Object key);
 
   /**
    * Stores a collection of values with the same key, replacing any existing values for that key.
@@ -83,7 +90,7 @@
    */
   @CanIgnoreReturnValue
   @Override
-  SortedSet<V> replaceValues(K key, Iterable<? extends V> values);
+  SortedSet<V> replaceValues(@ParametricNullness K key, Iterable<? extends V> values);
 
   /**
    * Returns a map view that associates each key with the corresponding values in the multimap.
@@ -109,5 +116,6 @@
    * Returns the comparator that orders the multimap values, with {@code null} indicating that
    * natural ordering is used.
    */
+  @CheckForNull
   Comparator<? super V> valueComparator();
 }
diff --git a/guava/src/com/google/common/collect/SparseImmutableTable.java b/guava/src/com/google/common/collect/SparseImmutableTable.java
index a7fe85d..b314f7b 100644
--- a/guava/src/com/google/common/collect/SparseImmutableTable.java
+++ b/guava/src/com/google/common/collect/SparseImmutableTable.java
@@ -14,6 +14,8 @@
 
 package com.google.common.collect;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.GwtCompatible;
 import com.google.errorprone.annotations.Immutable;
 import java.util.LinkedHashMap;
@@ -23,6 +25,7 @@
 /** A {@code RegularImmutableTable} optimized for sparse data. */
 @GwtCompatible
 @Immutable(containerOf = {"R", "C", "V"})
+@ElementTypesAreNonnullByDefault
 final class SparseImmutableTable<R, C, V> extends RegularImmutableTable<R, C, V> {
   static final ImmutableTable<Object, Object, Object> EMPTY =
       new SparseImmutableTable<>(
@@ -61,12 +64,16 @@
       C columnKey = cell.getColumnKey();
       V value = cell.getValue();
 
-      cellRowIndices[i] = rowIndex.get(rowKey);
-      Map<C, V> thisRow = rows.get(rowKey);
+      /*
+       * These requireNonNull calls are safe because we construct the maps to hold all the provided
+       * cells.
+       */
+      cellRowIndices[i] = requireNonNull(rowIndex.get(rowKey));
+      Map<C, V> thisRow = requireNonNull(rows.get(rowKey));
       cellColumnInRowIndices[i] = thisRow.size();
       V oldValue = thisRow.put(columnKey, value);
       checkNoDuplicate(rowKey, columnKey, oldValue, value);
-      columns.get(columnKey).put(rowKey, value);
+      requireNonNull(columns.get(columnKey)).put(rowKey, value);
     }
     this.cellRowIndices = cellRowIndices;
     this.cellColumnInRowIndices = cellColumnInRowIndices;
@@ -128,7 +135,8 @@
     int[] cellColumnIndices = new int[cellSet().size()];
     int i = 0;
     for (Cell<R, C, V> cell : cellSet()) {
-      cellColumnIndices[i++] = columnKeyToIndex.get(cell.getColumnKey());
+      // requireNonNull is safe because the cell exists in the table.
+      cellColumnIndices[i++] = requireNonNull(columnKeyToIndex.get(cell.getColumnKey()));
     }
     return SerializedForm.create(this, cellRowIndices, cellColumnIndices);
   }
diff --git a/guava/src/com/google/common/collect/StandardRowSortedTable.java b/guava/src/com/google/common/collect/StandardRowSortedTable.java
index 19a14c3..bea5b7b 100644
--- a/guava/src/com/google/common/collect/StandardRowSortedTable.java
+++ b/guava/src/com/google/common/collect/StandardRowSortedTable.java
@@ -26,6 +26,7 @@
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@code Table} whose iteration ordering across row keys is sorted by their
@@ -45,6 +46,7 @@
  * @author Jared Levy
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 class StandardRowSortedTable<R, C, V> extends StandardTable<R, C, V>
     implements RowSortedTable<R, C, V> {
   /*
@@ -102,6 +104,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super R> comparator() {
       return sortedBackingMap().comparator();
     }
diff --git a/guava/src/com/google/common/collect/StandardTable.java b/guava/src/com/google/common/collect/StandardTable.java
index 6adc4dc..06defb0 100644
--- a/guava/src/com/google/common/collect/StandardTable.java
+++ b/guava/src/com/google/common/collect/StandardTable.java
@@ -23,6 +23,8 @@
 import static com.google.common.base.Predicates.not;
 import static com.google.common.collect.Maps.safeContainsKey;
 import static com.google.common.collect.Maps.safeGet;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Function;
@@ -42,7 +44,7 @@
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.Spliterators;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * {@link Table} implementation backed by a map that associates row keys with column key / value
@@ -64,6 +66,7 @@
  * @author Jared Levy
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 class StandardTable<R, C, V> extends AbstractTable<R, C, V> implements Serializable {
   @GwtTransient final Map<R, Map<C, V>> backingMap;
   @GwtTransient final Supplier<? extends Map<C, V>> factory;
@@ -76,12 +79,12 @@
   // Accessors
 
   @Override
-  public boolean contains(@Nullable Object rowKey, @Nullable Object columnKey) {
+  public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return rowKey != null && columnKey != null && super.contains(rowKey, columnKey);
   }
 
   @Override
-  public boolean containsColumn(@Nullable Object columnKey) {
+  public boolean containsColumn(@CheckForNull Object columnKey) {
     if (columnKey == null) {
       return false;
     }
@@ -94,17 +97,18 @@
   }
 
   @Override
-  public boolean containsRow(@Nullable Object rowKey) {
+  public boolean containsRow(@CheckForNull Object rowKey) {
     return rowKey != null && safeContainsKey(backingMap, rowKey);
   }
 
   @Override
-  public boolean containsValue(@Nullable Object value) {
+  public boolean containsValue(@CheckForNull Object value) {
     return value != null && super.containsValue(value);
   }
 
   @Override
-  public V get(@Nullable Object rowKey, @Nullable Object columnKey) {
+  @CheckForNull
+  public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     return (rowKey == null || columnKey == null) ? null : super.get(rowKey, columnKey);
   }
 
@@ -140,6 +144,7 @@
 
   @CanIgnoreReturnValue
   @Override
+  @CheckForNull
   public V put(R rowKey, C columnKey, V value) {
     checkNotNull(rowKey);
     checkNotNull(columnKey);
@@ -149,7 +154,8 @@
 
   @CanIgnoreReturnValue
   @Override
-  public V remove(@Nullable Object rowKey, @Nullable Object columnKey) {
+  @CheckForNull
+  public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
     if ((rowKey == null) || (columnKey == null)) {
       return null;
     }
@@ -165,7 +171,7 @@
   }
 
   @CanIgnoreReturnValue
-  private Map<R, V> removeColumn(Object column) {
+  private Map<R, V> removeColumn(@CheckForNull Object column) {
     Map<R, V> output = new LinkedHashMap<>();
     Iterator<Entry<R, Map<C, V>>> iterator = backingMap.entrySet().iterator();
     while (iterator.hasNext()) {
@@ -181,12 +187,14 @@
     return output;
   }
 
-  private boolean containsMapping(Object rowKey, Object columnKey, Object value) {
+  private boolean containsMapping(
+      @CheckForNull Object rowKey, @CheckForNull Object columnKey, @CheckForNull Object value) {
     return value != null && value.equals(get(rowKey, columnKey));
   }
 
   /** Remove a row key / column key / value mapping, if present. */
-  private boolean removeMapping(Object rowKey, Object columnKey, Object value) {
+  private boolean removeMapping(
+      @CheckForNull Object rowKey, @CheckForNull Object columnKey, @CheckForNull Object value) {
     if (containsMapping(rowKey, columnKey, value)) {
       remove(rowKey, columnKey);
       return true;
@@ -234,7 +242,7 @@
 
   private class CellIterator implements Iterator<Cell<R, C, V>> {
     final Iterator<Entry<R, Map<C, V>>> rowIterator = backingMap.entrySet().iterator();
-    @Nullable Entry<R, Map<C, V>> rowEntry;
+    @CheckForNull Entry<R, Map<C, V>> rowEntry;
     Iterator<Entry<C, V>> columnIterator = Iterators.emptyModifiableIterator();
 
     @Override
@@ -248,6 +256,20 @@
         rowEntry = rowIterator.next();
         columnIterator = rowEntry.getValue().entrySet().iterator();
       }
+      /*
+       * requireNonNull is safe because:
+       *
+       * - columnIterator started off pointing to an empty iterator, so we must have entered the
+       *   `if` body above at least once. Thus, if we got this far, that `if` body initialized
+       *   rowEntry at least once.
+       *
+       * - The only case in which rowEntry is cleared (during remove() below) happens only if the
+       *   caller removed every element from columnIterator. During that process, we would have had
+       *   to iterate it to exhaustion. Then we can apply the logic above about an empty
+       *   columnIterator. (This assumes no concurrent modification, but behavior under concurrent
+       *   modification is undefined, anyway.)
+       */
+      requireNonNull(rowEntry);
       Entry<C, V> columnEntry = columnIterator.next();
       return Tables.immutableCell(rowEntry.getKey(), columnEntry.getKey(), columnEntry.getValue());
     }
@@ -255,7 +277,17 @@
     @Override
     public void remove() {
       columnIterator.remove();
-      if (rowEntry.getValue().isEmpty()) {
+      /*
+       * requireNonNull is safe because:
+       *
+       * - columnIterator.remove() succeeded, so it must have returned a value, so it must have been
+       * initialized by next() -- which initializes rowEntry, too.
+       *
+       * - rowEntry isn't cleared except below. If it was cleared below, then either
+       *   columnIterator.remove() would have failed above (if the user hasn't called next() since
+       *   then) or rowEntry would have been initialized by next() (as discussed above).
+       */
+      if (requireNonNull(rowEntry).getValue().isEmpty()) {
         rowIterator.remove();
         rowEntry = null;
       }
@@ -288,39 +320,43 @@
       this.rowKey = checkNotNull(rowKey);
     }
 
-    @Nullable Map<C, V> backingRowMap;
+    @CheckForNull Map<C, V> backingRowMap;
 
-    Map<C, V> backingRowMap() {
-      return (backingRowMap == null || (backingRowMap.isEmpty() && backingMap.containsKey(rowKey)))
-          ? backingRowMap = computeBackingRowMap()
-          : backingRowMap;
+    final void updateBackingRowMapField() {
+      if (backingRowMap == null || (backingRowMap.isEmpty() && backingMap.containsKey(rowKey))) {
+        backingRowMap = computeBackingRowMap();
+      }
     }
 
+    @CheckForNull
     Map<C, V> computeBackingRowMap() {
       return backingMap.get(rowKey);
     }
 
     // Call this every time we perform a removal.
     void maintainEmptyInvariant() {
-      if (backingRowMap() != null && backingRowMap.isEmpty()) {
+      updateBackingRowMapField();
+      if (backingRowMap != null && backingRowMap.isEmpty()) {
         backingMap.remove(rowKey);
         backingRowMap = null;
       }
     }
 
     @Override
-    public boolean containsKey(Object key) {
-      Map<C, V> backingRowMap = backingRowMap();
+    public boolean containsKey(@CheckForNull Object key) {
+      updateBackingRowMapField();
       return (key != null && backingRowMap != null) && Maps.safeContainsKey(backingRowMap, key);
     }
 
     @Override
-    public V get(Object key) {
-      Map<C, V> backingRowMap = backingRowMap();
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
+      updateBackingRowMapField();
       return (key != null && backingRowMap != null) ? Maps.safeGet(backingRowMap, key) : null;
     }
 
     @Override
+    @CheckForNull
     public V put(C key, V value) {
       checkNotNull(key);
       checkNotNull(value);
@@ -331,8 +367,9 @@
     }
 
     @Override
-    public V remove(Object key) {
-      Map<C, V> backingRowMap = backingRowMap();
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
+      updateBackingRowMapField();
       if (backingRowMap == null) {
         return null;
       }
@@ -343,7 +380,7 @@
 
     @Override
     public void clear() {
-      Map<C, V> backingRowMap = backingRowMap();
+      updateBackingRowMapField();
       if (backingRowMap != null) {
         backingRowMap.clear();
       }
@@ -352,17 +389,17 @@
 
     @Override
     public int size() {
-      Map<C, V> map = backingRowMap();
-      return (map == null) ? 0 : map.size();
+      updateBackingRowMapField();
+      return (backingRowMap == null) ? 0 : backingRowMap.size();
     }
 
     @Override
     Iterator<Entry<C, V>> entryIterator() {
-      final Map<C, V> map = backingRowMap();
-      if (map == null) {
+      updateBackingRowMapField();
+      if (backingRowMap == null) {
         return Iterators.emptyModifiableIterator();
       }
-      final Iterator<Entry<C, V>> iterator = map.entrySet().iterator();
+      final Iterator<Entry<C, V>> iterator = backingRowMap.entrySet().iterator();
       return new Iterator<Entry<C, V>>() {
         @Override
         public boolean hasNext() {
@@ -384,11 +421,11 @@
 
     @Override
     Spliterator<Entry<C, V>> entrySpliterator() {
-      Map<C, V> map = backingRowMap();
-      if (map == null) {
+      updateBackingRowMapField();
+      if (backingRowMap == null) {
         return Spliterators.emptySpliterator();
       }
-      return CollectSpliterators.map(map.entrySet().spliterator(), this::wrapEntry);
+      return CollectSpliterators.map(backingRowMap.entrySet().spliterator(), this::wrapEntry);
     }
 
     Entry<C, V> wrapEntry(final Entry<C, V> entry) {
@@ -404,7 +441,7 @@
         }
 
         @Override
-        public boolean equals(Object object) {
+        public boolean equals(@CheckForNull Object object) {
           // TODO(lowasser): identify why this affects GWT tests
           return standardEquals(object);
         }
@@ -430,22 +467,25 @@
     }
 
     @Override
+    @CheckForNull
     public V put(R key, V value) {
       return StandardTable.this.put(key, columnKey, value);
     }
 
     @Override
-    public V get(Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       return StandardTable.this.get(key, columnKey);
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return StandardTable.this.contains(key, columnKey);
     }
 
     @Override
-    public V remove(Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       return StandardTable.this.remove(key, columnKey);
     }
 
@@ -503,7 +543,7 @@
       }
 
       @Override
-      public boolean contains(Object o) {
+      public boolean contains(@CheckForNull Object o) {
         if (o instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) o;
           return containsMapping(entry.getKey(), columnKey, entry.getValue());
@@ -512,7 +552,7 @@
       }
 
       @Override
-      public boolean remove(Object obj) {
+      public boolean remove(@CheckForNull Object obj) {
         if (obj instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) obj;
           return removeMapping(entry.getKey(), columnKey, entry.getValue());
@@ -530,6 +570,7 @@
       final Iterator<Entry<R, Map<C, V>>> iterator = backingMap.entrySet().iterator();
 
       @Override
+      @CheckForNull
       protected Entry<R, V> computeNext() {
         while (iterator.hasNext()) {
           final Entry<R, Map<C, V>> entry = iterator.next();
@@ -548,7 +589,22 @@
 
               @Override
               public V setValue(V value) {
-                return entry.getValue().put(columnKey, checkNotNull(value));
+                /*
+                 * The cast is safe because of the containsKey check above. (Well, it's possible for
+                 * the map to change between that call and this one. But if that happens, the
+                 * behavior is undefined because of the concurrent mutation.)
+                 *
+                 * (Our prototype checker happens to be "smart" enough to understand this for the
+                 * *get* call in getValue but not for the *put* call here.)
+                 *
+                 * (Arguably we should use requireNonNull rather than uncheckedCastNullableTToT: We
+                 * know that V is a non-null type because that's the only kind of value type that
+                 * StandardTable supports. Thus, requireNonNull is safe as long as the cell is still
+                 * present. (And if it's not present, behavior is undefined.) However, that's a
+                 * behavior change relative to the old code, so it didn't seem worth risking.)
+                 */
+                return uncheckedCastNullableTToT(
+                    entry.getValue().put(columnKey, checkNotNull(value)));
               }
             }
             return new EntryImpl();
@@ -570,12 +626,12 @@
       }
 
       @Override
-      public boolean contains(Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         return StandardTable.this.contains(obj, columnKey);
       }
 
       @Override
-      public boolean remove(Object obj) {
+      public boolean remove(@CheckForNull Object obj) {
         return StandardTable.this.remove(obj, columnKey) != null;
       }
 
@@ -597,7 +653,7 @@
       }
 
       @Override
-      public boolean remove(Object obj) {
+      public boolean remove(@CheckForNull Object obj) {
         return obj != null && removeFromColumnIf(Maps.<V>valuePredicateOnEntries(equalTo(obj)));
       }
 
@@ -618,7 +674,7 @@
     return rowMap().keySet();
   }
 
-  private transient @Nullable Set<C> columnKeySet;
+  @CheckForNull private transient Set<C> columnKeySet;
 
   /**
    * {@inheritDoc}
@@ -647,7 +703,7 @@
     }
 
     @Override
-    public boolean remove(Object obj) {
+    public boolean remove(@CheckForNull Object obj) {
       if (obj == null) {
         return false;
       }
@@ -702,7 +758,7 @@
     }
 
     @Override
-    public boolean contains(Object obj) {
+    public boolean contains(@CheckForNull Object obj) {
       return containsColumn(obj);
     }
   }
@@ -720,6 +776,7 @@
     Iterator<Entry<C, V>> entryIterator = Iterators.emptyIterator();
 
     @Override
+    @CheckForNull
     protected C computeNext() {
       while (true) {
         if (entryIterator.hasNext()) {
@@ -748,7 +805,7 @@
     return super.values();
   }
 
-  private transient @Nullable Map<R, Map<C, V>> rowMap;
+  @CheckForNull private transient Map<R, Map<C, V>> rowMap;
 
   @Override
   public Map<R, Map<C, V>> rowMap() {
@@ -763,19 +820,22 @@
   @WeakOuter
   class RowMap extends ViewCachingAbstractMap<R, Map<C, V>> {
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return containsRow(key);
     }
 
     // performing cast only when key is in backing map and has the correct type
     @SuppressWarnings("unchecked")
     @Override
-    public Map<C, V> get(Object key) {
-      return containsRow(key) ? row((R) key) : null;
+    @CheckForNull
+    public Map<C, V> get(@CheckForNull Object key) {
+      // requireNonNull is safe because of the containsRow check.
+      return containsRow(key) ? row((R) requireNonNull(key)) : null;
     }
 
     @Override
-    public Map<C, V> remove(Object key) {
+    @CheckForNull
+    public Map<C, V> remove(@CheckForNull Object key) {
       return (key == null) ? null : backingMap.remove(key);
     }
 
@@ -804,7 +864,7 @@
       }
 
       @Override
-      public boolean contains(Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         if (obj instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) obj;
           return entry.getKey() != null
@@ -815,7 +875,7 @@
       }
 
       @Override
-      public boolean remove(Object obj) {
+      public boolean remove(@CheckForNull Object obj) {
         if (obj instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) obj;
           return entry.getKey() != null
@@ -827,7 +887,7 @@
     }
   }
 
-  private transient @Nullable ColumnMap columnMap;
+  @CheckForNull private transient ColumnMap columnMap;
 
   @Override
   public Map<C, Map<R, V>> columnMap() {
@@ -841,17 +901,20 @@
     // has the correct type.
     @SuppressWarnings("unchecked")
     @Override
-    public Map<R, V> get(Object key) {
-      return containsColumn(key) ? column((C) key) : null;
+    @CheckForNull
+    public Map<R, V> get(@CheckForNull Object key) {
+      // requireNonNull is safe because of the containsColumn check.
+      return containsColumn(key) ? column((C) requireNonNull(key)) : null;
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return containsColumn(key);
     }
 
     @Override
-    public Map<R, V> remove(Object key) {
+    @CheckForNull
+    public Map<R, V> remove(@CheckForNull Object key) {
       return containsColumn(key) ? removeColumn(key) : null;
     }
 
@@ -890,23 +953,24 @@
       }
 
       @Override
-      public boolean contains(Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         if (obj instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) obj;
           if (containsColumn(entry.getKey())) {
-            // The cast to C occurs only when the key is in the map, implying
-            // that it has the correct type.
-            @SuppressWarnings("unchecked")
-            C columnKey = (C) entry.getKey();
-            return get(columnKey).equals(entry.getValue());
+            // requireNonNull is safe because of the containsColumn check.
+            return requireNonNull(get(entry.getKey())).equals(entry.getValue());
           }
         }
         return false;
       }
 
       @Override
-      public boolean remove(Object obj) {
-        if (contains(obj)) {
+      public boolean remove(@CheckForNull Object obj) {
+        /*
+         * `o instanceof Entry` is guaranteed by `contains`, but we check it here to satisfy our
+         * nullness checker.
+         */
+        if (contains(obj) && obj instanceof Entry) {
           Entry<?, ?> entry = (Entry<?, ?>) obj;
           removeColumn(entry.getKey());
           return true;
@@ -947,7 +1011,7 @@
       }
 
       @Override
-      public boolean remove(Object obj) {
+      public boolean remove(@CheckForNull Object obj) {
         for (Entry<C, Map<R, V>> entry : ColumnMap.this.entrySet()) {
           if (entry.getValue().equals(obj)) {
             removeColumn(entry.getKey());
diff --git a/guava/src/com/google/common/collect/Streams.java b/guava/src/com/google/common/collect/Streams.java
index 333fc2a..3bf8382 100644
--- a/guava/src/com/google/common/collect/Streams.java
+++ b/guava/src/com/google/common/collect/Streams.java
@@ -17,11 +17,14 @@
 package com.google.common.collect;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.math.LongMath;
+import com.google.errorprone.annotations.InlineMe;
+import com.google.errorprone.annotations.InlineMeValidationDisabled;
 import java.util.ArrayDeque;
 import java.util.Collection;
 import java.util.Deque;
@@ -45,6 +48,7 @@
 import java.util.stream.LongStream;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -53,12 +57,13 @@
  * @since 21.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Streams {
   /**
    * Returns a sequential {@link Stream} of the contents of {@code iterable}, delegating to {@link
    * Collection#stream} if possible.
    */
-  public static <T> Stream<T> stream(Iterable<T> iterable) {
+  public static <T extends @Nullable Object> Stream<T> stream(Iterable<T> iterable) {
     return (iterable instanceof Collection)
         ? ((Collection<T>) iterable).stream()
         : StreamSupport.stream(iterable.spliterator(), false);
@@ -71,7 +76,8 @@
    */
   @Beta
   @Deprecated
-  public static <T> Stream<T> stream(Collection<T> collection) {
+  @InlineMe(replacement = "collection.stream()")
+  public static <T extends @Nullable Object> Stream<T> stream(Collection<T> collection) {
     return collection.stream();
   }
 
@@ -80,7 +86,7 @@
    * {@code iterator} directly after passing it to this method.
    */
   @Beta
-  public static <T> Stream<T> stream(Iterator<T> iterator) {
+  public static <T extends @Nullable Object> Stream<T> stream(Iterator<T> iterator) {
     return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false);
   }
 
@@ -100,6 +106,8 @@
    * <p><b>Java 9 users:</b> use {@code optional.stream()} instead.
    */
   @Beta
+  @InlineMe(replacement = "optional.stream()")
+  @InlineMeValidationDisabled("Java 9+ API only")
   public static <T> Stream<T> stream(java.util.Optional<T> optional) {
     return optional.isPresent() ? Stream.of(optional.get()) : Stream.empty();
   }
@@ -111,6 +119,8 @@
    * <p><b>Java 9 users:</b> use {@code optional.stream()} instead.
    */
   @Beta
+  @InlineMe(replacement = "optional.stream()")
+  @InlineMeValidationDisabled("Java 9+ API only")
   public static IntStream stream(OptionalInt optional) {
     return optional.isPresent() ? IntStream.of(optional.getAsInt()) : IntStream.empty();
   }
@@ -122,6 +132,8 @@
    * <p><b>Java 9 users:</b> use {@code optional.stream()} instead.
    */
   @Beta
+  @InlineMe(replacement = "optional.stream()")
+  @InlineMeValidationDisabled("Java 9+ API only")
   public static LongStream stream(OptionalLong optional) {
     return optional.isPresent() ? LongStream.of(optional.getAsLong()) : LongStream.empty();
   }
@@ -133,6 +145,8 @@
    * <p><b>Java 9 users:</b> use {@code optional.stream()} instead.
    */
   @Beta
+  @InlineMe(replacement = "optional.stream()")
+  @InlineMeValidationDisabled("Java 9+ API only")
   public static DoubleStream stream(OptionalDouble optional) {
     return optional.isPresent() ? DoubleStream.of(optional.getAsDouble()) : DoubleStream.empty();
   }
@@ -154,7 +168,7 @@
    * @see Stream#concat(Stream, Stream)
    */
   @SafeVarargs
-  public static <T> Stream<T> concat(Stream<? extends T>... streams) {
+  public static <T extends @Nullable Object> Stream<T> concat(Stream<? extends T>... streams) {
     // TODO(lowasser): consider an implementation that can support SUBSIZED
     boolean isParallel = false;
     int characteristics = Spliterator.ORDERED | Spliterator.SIZED | Spliterator.NONNULL;
@@ -300,8 +314,9 @@
    * This may harm parallel performance.
    */
   @Beta
-  public static <A, B, R> Stream<R> zip(
-      Stream<A> streamA, Stream<B> streamB, BiFunction<? super A, ? super B, R> function) {
+  public static <A extends @Nullable Object, B extends @Nullable Object, R extends @Nullable Object>
+      Stream<R> zip(
+          Stream<A> streamA, Stream<B> streamB, BiFunction<? super A, ? super B, R> function) {
     checkNotNull(streamA);
     checkNotNull(streamB);
     checkNotNull(function);
@@ -362,7 +377,7 @@
    * @since 22.0
    */
   @Beta
-  public static <A, B> void forEachPair(
+  public static <A extends @Nullable Object, B extends @Nullable Object> void forEachPair(
       Stream<A> streamA, Stream<B> streamB, BiConsumer<? super A, ? super B> consumer) {
     checkNotNull(consumer);
 
@@ -378,11 +393,11 @@
   }
 
   // Use this carefully - it doesn't implement value semantics
-  private static class TemporaryPair<A, B> {
-    final A a;
-    final B b;
+  private static class TemporaryPair<A extends @Nullable Object, B extends @Nullable Object> {
+    @ParametricNullness final A a;
+    @ParametricNullness final B b;
 
-    TemporaryPair(A a, B b) {
+    TemporaryPair(@ParametricNullness A a, @ParametricNullness B b) {
       this.a = a;
       this.b = b;
     }
@@ -411,7 +426,7 @@
    * was defined.
    */
   @Beta
-  public static <T, R> Stream<R> mapWithIndex(
+  public static <T extends @Nullable Object, R extends @Nullable Object> Stream<R> mapWithIndex(
       Stream<T> stream, FunctionWithIndex<? super T, ? extends R> function) {
     checkNotNull(stream);
     checkNotNull(function);
@@ -439,14 +454,14 @@
           .onClose(stream::close);
     }
     class Splitr extends MapWithIndexSpliterator<Spliterator<T>, R, Splitr> implements Consumer<T> {
-      @Nullable T holder;
+      @CheckForNull T holder;
 
       Splitr(Spliterator<T> splitr, long index) {
         super(splitr, index);
       }
 
       @Override
-      public void accept(@Nullable T t) {
+      public void accept(@ParametricNullness T t) {
         this.holder = t;
       }
 
@@ -454,7 +469,8 @@
       public boolean tryAdvance(Consumer<? super R> action) {
         if (fromSpliterator.tryAdvance(this)) {
           try {
-            action.accept(function.apply(holder, index++));
+            // The cast is safe because tryAdvance puts a T into `holder`.
+            action.accept(function.apply(uncheckedCastNullableTToT(holder), index++));
             return true;
           } finally {
             holder = null;
@@ -494,7 +510,8 @@
    * was defined.
    */
   @Beta
-  public static <R> Stream<R> mapWithIndex(IntStream stream, IntFunctionWithIndex<R> function) {
+  public static <R extends @Nullable Object> Stream<R> mapWithIndex(
+      IntStream stream, IntFunctionWithIndex<R> function) {
     checkNotNull(stream);
     checkNotNull(function);
     boolean isParallel = stream.isParallel();
@@ -573,7 +590,8 @@
    * was defined.
    */
   @Beta
-  public static <R> Stream<R> mapWithIndex(LongStream stream, LongFunctionWithIndex<R> function) {
+  public static <R extends @Nullable Object> Stream<R> mapWithIndex(
+      LongStream stream, LongFunctionWithIndex<R> function) {
     checkNotNull(stream);
     checkNotNull(function);
     boolean isParallel = stream.isParallel();
@@ -652,7 +670,7 @@
    * was defined.
    */
   @Beta
-  public static <R> Stream<R> mapWithIndex(
+  public static <R extends @Nullable Object> Stream<R> mapWithIndex(
       DoubleStream stream, DoubleFunctionWithIndex<R> function) {
     checkNotNull(stream);
     checkNotNull(function);
@@ -718,13 +736,16 @@
    * @since 21.0
    */
   @Beta
-  public interface FunctionWithIndex<T, R> {
+  public interface FunctionWithIndex<T extends @Nullable Object, R extends @Nullable Object> {
     /** Applies this function to the given argument and its index within a stream. */
-    R apply(T from, long index);
+    @ParametricNullness
+    R apply(@ParametricNullness T from, long index);
   }
 
   private abstract static class MapWithIndexSpliterator<
-          F extends Spliterator<?>, R, S extends MapWithIndexSpliterator<F, R, S>>
+          F extends Spliterator<?>,
+          R extends @Nullable Object,
+          S extends MapWithIndexSpliterator<F, R, S>>
       implements Spliterator<R> {
     final F fromSpliterator;
     long index;
@@ -737,12 +758,14 @@
     abstract S createSplit(F from, long i);
 
     @Override
+    @CheckForNull
     public S trySplit() {
-      @SuppressWarnings("unchecked")
-      F split = (F) fromSpliterator.trySplit();
-      if (split == null) {
+      Spliterator<?> splitOrNull = fromSpliterator.trySplit();
+      if (splitOrNull == null) {
         return null;
       }
+      @SuppressWarnings("unchecked")
+      F split = (F) splitOrNull;
       S result = createSplit(split, index);
       this.index += split.getExactSizeIfKnown();
       return result;
@@ -769,8 +792,9 @@
    * @since 21.0
    */
   @Beta
-  public interface IntFunctionWithIndex<R> {
+  public interface IntFunctionWithIndex<R extends @Nullable Object> {
     /** Applies this function to the given argument and its index within a stream. */
+    @ParametricNullness
     R apply(int from, long index);
   }
 
@@ -783,8 +807,9 @@
    * @since 21.0
    */
   @Beta
-  public interface LongFunctionWithIndex<R> {
+  public interface LongFunctionWithIndex<R extends @Nullable Object> {
     /** Applies this function to the given argument and its index within a stream. */
+    @ParametricNullness
     R apply(long from, long index);
   }
 
@@ -797,8 +822,9 @@
    * @since 21.0
    */
   @Beta
-  public interface DoubleFunctionWithIndex<R> {
+  public interface DoubleFunctionWithIndex<R extends @Nullable Object> {
     /** Applies this function to the given argument and its index within a stream. */
+    @ParametricNullness
     R apply(double from, long index);
   }
 
@@ -817,20 +843,34 @@
    * @see Stream#findFirst()
    * @throws NullPointerException if the last element of the stream is null
    */
+  /*
+   * By declaring <T> instead of <T extends @Nullable Object>, we declare this method as requiring a
+   * stream whose elements are non-null. However, the method goes out of its way to still handle
+   * nulls in the stream. This means that the method can safely be used with a stream that contains
+   * nulls as long as the *last* element is *not* null.
+   *
+   * (To "go out of its way," the method tracks a `set` bit so that it can distinguish "the final
+   * split has a last element of null, so throw NPE" from "the final split was empty, so look for an
+   * element in the prior one.")
+   */
   @Beta
   public static <T> java.util.Optional<T> findLast(Stream<T> stream) {
     class OptionalState {
       boolean set = false;
-      T value = null;
+      @CheckForNull T value = null;
 
-      void set(@Nullable T value) {
+      void set(T value) {
         this.set = true;
         this.value = value;
       }
 
       T get() {
-        checkState(set);
-        return value;
+        /*
+         * requireNonNull is safe because we call get() only if we've previously called set().
+         *
+         * (For further discussion of nullness, see the comment above the method.)
+         */
+        return requireNonNull(value);
       }
     }
     OptionalState state = new OptionalState();
@@ -896,7 +936,7 @@
   public static OptionalInt findLast(IntStream stream) {
     // findLast(Stream) does some allocation, so we might as well box some more
     java.util.Optional<Integer> boxedLast = findLast(stream.boxed());
-    return boxedLast.isPresent() ? OptionalInt.of(boxedLast.get()) : OptionalInt.empty();
+    return boxedLast.map(OptionalInt::of).orElseGet(OptionalInt::empty);
   }
 
   /**
@@ -915,7 +955,7 @@
   public static OptionalLong findLast(LongStream stream) {
     // findLast(Stream) does some allocation, so we might as well box some more
     java.util.Optional<Long> boxedLast = findLast(stream.boxed());
-    return boxedLast.isPresent() ? OptionalLong.of(boxedLast.get()) : OptionalLong.empty();
+    return boxedLast.map(OptionalLong::of).orElseGet(OptionalLong::empty);
   }
 
   /**
@@ -934,7 +974,7 @@
   public static OptionalDouble findLast(DoubleStream stream) {
     // findLast(Stream) does some allocation, so we might as well box some more
     java.util.Optional<Double> boxedLast = findLast(stream.boxed());
-    return boxedLast.isPresent() ? OptionalDouble.of(boxedLast.get()) : OptionalDouble.empty();
+    return boxedLast.map(OptionalDouble::of).orElseGet(OptionalDouble::empty);
   }
 
   private Streams() {}
diff --git a/guava/src/com/google/common/collect/Synchronized.java b/guava/src/com/google/common/collect/Synchronized.java
index 0f175cc..25e2870 100644
--- a/guava/src/com/google/common/collect/Synchronized.java
+++ b/guava/src/com/google/common/collect/Synchronized.java
@@ -32,7 +32,6 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.NavigableMap;
 import java.util.NavigableSet;
 import java.util.Queue;
@@ -48,6 +47,7 @@
 import java.util.function.Predicate;
 import java.util.function.UnaryOperator;
 import java.util.stream.Stream;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -63,6 +63,16 @@
  * @author Jared Levy
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
+/*
+ * I have decided not to bother adding @ParametricNullness annotations in this class. Adding them is
+ * a lot of busy work, and the annotation matters only when the APIs to be annotated are visible to
+ * Kotlin code. In this class, nothing is publicly visible (nor exposed indirectly through a
+ * publicly visible subclass), and I doubt any of our current or future Kotlin extensions for the
+ * package will refer to the class. Plus, @ParametricNullness is only a temporary workaround,
+ * anyway, so we just need to get by without the annotations here until Kotlin better understands
+ * our other nullness annotations.
+ */
 final class Synchronized {
   private Synchronized() {}
 
@@ -70,7 +80,7 @@
     final Object delegate;
     final Object mutex;
 
-    SynchronizedObject(Object delegate, @Nullable Object mutex) {
+    SynchronizedObject(Object delegate, @CheckForNull Object mutex) {
       this.delegate = checkNotNull(delegate);
       this.mutex = (mutex == null) ? this : mutex;
     }
@@ -104,13 +114,15 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static <E> Collection<E> collection(Collection<E> collection, @Nullable Object mutex) {
+  private static <E extends @Nullable Object> Collection<E> collection(
+      Collection<E> collection, @CheckForNull Object mutex) {
     return new SynchronizedCollection<E>(collection, mutex);
   }
 
   @VisibleForTesting
-  static class SynchronizedCollection<E> extends SynchronizedObject implements Collection<E> {
-    private SynchronizedCollection(Collection<E> delegate, @Nullable Object mutex) {
+  static class SynchronizedCollection<E extends @Nullable Object> extends SynchronizedObject
+      implements Collection<E> {
+    private SynchronizedCollection(Collection<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -142,7 +154,7 @@
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().contains(o);
       }
@@ -196,7 +208,7 @@
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().remove(o);
       }
@@ -231,14 +243,15 @@
     }
 
     @Override
-    public Object[] toArray() {
+    public @Nullable Object[] toArray() {
       synchronized (mutex) {
         return delegate().toArray();
       }
     }
 
     @Override
-    public <T> T[] toArray(T[] a) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] a) {
       synchronized (mutex) {
         return delegate().toArray(a);
       }
@@ -248,13 +261,14 @@
   }
 
   @VisibleForTesting
-  static <E> Set<E> set(Set<E> set, @Nullable Object mutex) {
+  static <E extends @Nullable Object> Set<E> set(Set<E> set, @CheckForNull Object mutex) {
     return new SynchronizedSet<E>(set, mutex);
   }
 
-  static class SynchronizedSet<E> extends SynchronizedCollection<E> implements Set<E> {
+  static class SynchronizedSet<E extends @Nullable Object> extends SynchronizedCollection<E>
+      implements Set<E> {
 
-    SynchronizedSet(Set<E> delegate, @Nullable Object mutex) {
+    SynchronizedSet(Set<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -264,7 +278,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -283,12 +297,14 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static <E> SortedSet<E> sortedSet(SortedSet<E> set, @Nullable Object mutex) {
+  private static <E extends @Nullable Object> SortedSet<E> sortedSet(
+      SortedSet<E> set, @CheckForNull Object mutex) {
     return new SynchronizedSortedSet<E>(set, mutex);
   }
 
-  static class SynchronizedSortedSet<E> extends SynchronizedSet<E> implements SortedSet<E> {
-    SynchronizedSortedSet(SortedSet<E> delegate, @Nullable Object mutex) {
+  static class SynchronizedSortedSet<E extends @Nullable Object> extends SynchronizedSet<E>
+      implements SortedSet<E> {
+    SynchronizedSortedSet(SortedSet<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -298,6 +314,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super E> comparator() {
       synchronized (mutex) {
         return delegate().comparator();
@@ -342,14 +359,16 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static <E> List<E> list(List<E> list, @Nullable Object mutex) {
+  private static <E extends @Nullable Object> List<E> list(
+      List<E> list, @CheckForNull Object mutex) {
     return (list instanceof RandomAccess)
         ? new SynchronizedRandomAccessList<E>(list, mutex)
         : new SynchronizedList<E>(list, mutex);
   }
 
-  private static class SynchronizedList<E> extends SynchronizedCollection<E> implements List<E> {
-    SynchronizedList(List<E> delegate, @Nullable Object mutex) {
+  private static class SynchronizedList<E extends @Nullable Object>
+      extends SynchronizedCollection<E> implements List<E> {
+    SynchronizedList(List<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -380,14 +399,14 @@
     }
 
     @Override
-    public int indexOf(Object o) {
+    public int indexOf(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().indexOf(o);
       }
     }
 
     @Override
-    public int lastIndexOf(Object o) {
+    public int lastIndexOf(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().lastIndexOf(o);
       }
@@ -439,7 +458,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -458,28 +477,29 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static class SynchronizedRandomAccessList<E> extends SynchronizedList<E>
-      implements RandomAccess {
-    SynchronizedRandomAccessList(List<E> list, @Nullable Object mutex) {
+  private static class SynchronizedRandomAccessList<E extends @Nullable Object>
+      extends SynchronizedList<E> implements RandomAccess {
+    SynchronizedRandomAccessList(List<E> list, @CheckForNull Object mutex) {
       super(list, mutex);
     }
 
     private static final long serialVersionUID = 0;
   }
 
-  static <E> Multiset<E> multiset(Multiset<E> multiset, @Nullable Object mutex) {
+  static <E extends @Nullable Object> Multiset<E> multiset(
+      Multiset<E> multiset, @CheckForNull Object mutex) {
     if (multiset instanceof SynchronizedMultiset || multiset instanceof ImmutableMultiset) {
       return multiset;
     }
     return new SynchronizedMultiset<E>(multiset, mutex);
   }
 
-  private static class SynchronizedMultiset<E> extends SynchronizedCollection<E>
-      implements Multiset<E> {
-    transient @Nullable Set<E> elementSet;
-    transient @Nullable Set<Entry<E>> entrySet;
+  private static class SynchronizedMultiset<E extends @Nullable Object>
+      extends SynchronizedCollection<E> implements Multiset<E> {
+    @CheckForNull transient Set<E> elementSet;
+    @CheckForNull transient Set<Multiset.Entry<E>> entrySet;
 
-    SynchronizedMultiset(Multiset<E> delegate, @Nullable Object mutex) {
+    SynchronizedMultiset(Multiset<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -489,7 +509,7 @@
     }
 
     @Override
-    public int count(Object o) {
+    public int count(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().count(o);
       }
@@ -503,7 +523,7 @@
     }
 
     @Override
-    public int remove(Object o, int n) {
+    public int remove(@CheckForNull Object o, int n) {
       synchronized (mutex) {
         return delegate().remove(o, n);
       }
@@ -534,7 +554,7 @@
     }
 
     @Override
-    public Set<Entry<E>> entrySet() {
+    public Set<Multiset.Entry<E>> entrySet() {
       synchronized (mutex) {
         if (entrySet == null) {
           entrySet = typePreservingSet(delegate().entrySet(), mutex);
@@ -544,7 +564,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -563,20 +583,21 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> Multimap<K, V> multimap(Multimap<K, V> multimap, @Nullable Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> Multimap<K, V> multimap(
+      Multimap<K, V> multimap, @CheckForNull Object mutex) {
     if (multimap instanceof SynchronizedMultimap || multimap instanceof BaseImmutableMultimap) {
       return multimap;
     }
     return new SynchronizedMultimap<>(multimap, mutex);
   }
 
-  private static class SynchronizedMultimap<K, V> extends SynchronizedObject
-      implements Multimap<K, V> {
-    transient @Nullable Set<K> keySet;
-    transient @Nullable Collection<V> valuesCollection;
-    transient @Nullable Collection<Entry<K, V>> entries;
-    transient @Nullable Map<K, Collection<V>> asMap;
-    transient @Nullable Multiset<K> keys;
+  private static class SynchronizedMultimap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedObject implements Multimap<K, V> {
+    @CheckForNull transient Set<K> keySet;
+    @CheckForNull transient Collection<V> valuesCollection;
+    @CheckForNull transient Collection<Map.Entry<K, V>> entries;
+    @CheckForNull transient Map<K, Collection<V>> asMap;
+    @CheckForNull transient Multiset<K> keys;
 
     @SuppressWarnings("unchecked")
     @Override
@@ -584,7 +605,7 @@
       return (Multimap<K, V>) super.delegate();
     }
 
-    SynchronizedMultimap(Multimap<K, V> delegate, @Nullable Object mutex) {
+    SynchronizedMultimap(Multimap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -603,21 +624,21 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().containsKey(key);
       }
     }
 
     @Override
-    public boolean containsValue(Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       synchronized (mutex) {
         return delegate().containsValue(value);
       }
     }
 
     @Override
-    public boolean containsEntry(Object key, Object value) {
+    public boolean containsEntry(@CheckForNull Object key, @CheckForNull Object value) {
       synchronized (mutex) {
         return delegate().containsEntry(key, value);
       }
@@ -659,14 +680,14 @@
     }
 
     @Override
-    public boolean remove(Object key, Object value) {
+    public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
       synchronized (mutex) {
         return delegate().remove(key, value);
       }
     }
 
     @Override
-    public Collection<V> removeAll(Object key) {
+    public Collection<V> removeAll(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().removeAll(key); // copy not synchronized
       }
@@ -700,7 +721,7 @@
     }
 
     @Override
-    public Collection<Entry<K, V>> entries() {
+    public Collection<Map.Entry<K, V>> entries() {
       synchronized (mutex) {
         if (entries == null) {
           entries = typePreservingCollection(delegate().entries(), mutex);
@@ -737,7 +758,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -756,17 +777,18 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> ListMultimap<K, V> listMultimap(
-      ListMultimap<K, V> multimap, @Nullable Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> ListMultimap<K, V> listMultimap(
+      ListMultimap<K, V> multimap, @CheckForNull Object mutex) {
     if (multimap instanceof SynchronizedListMultimap || multimap instanceof BaseImmutableMultimap) {
       return multimap;
     }
     return new SynchronizedListMultimap<>(multimap, mutex);
   }
 
-  private static class SynchronizedListMultimap<K, V> extends SynchronizedMultimap<K, V>
-      implements ListMultimap<K, V> {
-    SynchronizedListMultimap(ListMultimap<K, V> delegate, @Nullable Object mutex) {
+  private static class SynchronizedListMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedMultimap<K, V> implements ListMultimap<K, V> {
+    SynchronizedListMultimap(ListMultimap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -783,7 +805,7 @@
     }
 
     @Override
-    public List<V> removeAll(Object key) {
+    public List<V> removeAll(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().removeAll(key); // copy not synchronized
       }
@@ -799,18 +821,20 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> SetMultimap<K, V> setMultimap(SetMultimap<K, V> multimap, @Nullable Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> SetMultimap<K, V> setMultimap(
+      SetMultimap<K, V> multimap, @CheckForNull Object mutex) {
     if (multimap instanceof SynchronizedSetMultimap || multimap instanceof BaseImmutableMultimap) {
       return multimap;
     }
     return new SynchronizedSetMultimap<>(multimap, mutex);
   }
 
-  private static class SynchronizedSetMultimap<K, V> extends SynchronizedMultimap<K, V>
-      implements SetMultimap<K, V> {
-    transient @Nullable Set<Entry<K, V>> entrySet;
+  private static class SynchronizedSetMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedMultimap<K, V> implements SetMultimap<K, V> {
+    @CheckForNull transient Set<Map.Entry<K, V>> entrySet;
 
-    SynchronizedSetMultimap(SetMultimap<K, V> delegate, @Nullable Object mutex) {
+    SynchronizedSetMultimap(SetMultimap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -827,7 +851,7 @@
     }
 
     @Override
-    public Set<V> removeAll(Object key) {
+    public Set<V> removeAll(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().removeAll(key); // copy not synchronized
       }
@@ -841,7 +865,7 @@
     }
 
     @Override
-    public Set<Entry<K, V>> entries() {
+    public Set<Map.Entry<K, V>> entries() {
       synchronized (mutex) {
         if (entrySet == null) {
           entrySet = set(delegate().entries(), mutex);
@@ -853,17 +877,19 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> SortedSetMultimap<K, V> sortedSetMultimap(
-      SortedSetMultimap<K, V> multimap, @Nullable Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object>
+      SortedSetMultimap<K, V> sortedSetMultimap(
+          SortedSetMultimap<K, V> multimap, @CheckForNull Object mutex) {
     if (multimap instanceof SynchronizedSortedSetMultimap) {
       return multimap;
     }
     return new SynchronizedSortedSetMultimap<>(multimap, mutex);
   }
 
-  private static class SynchronizedSortedSetMultimap<K, V> extends SynchronizedSetMultimap<K, V>
-      implements SortedSetMultimap<K, V> {
-    SynchronizedSortedSetMultimap(SortedSetMultimap<K, V> delegate, @Nullable Object mutex) {
+  private static class SynchronizedSortedSetMultimap<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedSetMultimap<K, V> implements SortedSetMultimap<K, V> {
+    SynchronizedSortedSetMultimap(SortedSetMultimap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -880,7 +906,7 @@
     }
 
     @Override
-    public SortedSet<V> removeAll(Object key) {
+    public SortedSet<V> removeAll(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().removeAll(key); // copy not synchronized
       }
@@ -894,6 +920,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super V> valueComparator() {
       synchronized (mutex) {
         return delegate().valueComparator();
@@ -903,8 +930,8 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static <E> Collection<E> typePreservingCollection(
-      Collection<E> collection, @Nullable Object mutex) {
+  private static <E extends @Nullable Object> Collection<E> typePreservingCollection(
+      Collection<E> collection, @CheckForNull Object mutex) {
     if (collection instanceof SortedSet) {
       return sortedSet((SortedSet<E>) collection, mutex);
     }
@@ -917,7 +944,8 @@
     return collection(collection, mutex);
   }
 
-  private static <E> Set<E> typePreservingSet(Set<E> set, @Nullable Object mutex) {
+  private static <E extends @Nullable Object> Set<E> typePreservingSet(
+      Set<E> set, @CheckForNull Object mutex) {
     if (set instanceof SortedSet) {
       return sortedSet((SortedSet<E>) set, mutex);
     } else {
@@ -925,22 +953,24 @@
     }
   }
 
-  private static class SynchronizedAsMapEntries<K, V>
-      extends SynchronizedSet<Entry<K, Collection<V>>> {
-    SynchronizedAsMapEntries(Set<Entry<K, Collection<V>>> delegate, @Nullable Object mutex) {
+  private static class SynchronizedAsMapEntries<
+          K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedSet<Map.Entry<K, Collection<V>>> {
+    SynchronizedAsMapEntries(
+        Set<Map.Entry<K, Collection<V>>> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
     @Override
-    public Iterator<Entry<K, Collection<V>>> iterator() {
+    public Iterator<Map.Entry<K, Collection<V>>> iterator() {
       // Must be manually synchronized.
-      return new TransformedIterator<Entry<K, Collection<V>>, Entry<K, Collection<V>>>(
+      return new TransformedIterator<Map.Entry<K, Collection<V>>, Map.Entry<K, Collection<V>>>(
           super.iterator()) {
         @Override
-        Entry<K, Collection<V>> transform(final Entry<K, Collection<V>> entry) {
+        Map.Entry<K, Collection<V>> transform(final Map.Entry<K, Collection<V>> entry) {
           return new ForwardingMapEntry<K, Collection<V>>() {
             @Override
-            protected Entry<K, Collection<V>> delegate() {
+            protected Map.Entry<K, Collection<V>> delegate() {
               return entry;
             }
 
@@ -958,19 +988,27 @@
     @Override
     public Object[] toArray() {
       synchronized (mutex) {
-        return ObjectArrays.toArrayImpl(delegate());
+        /*
+         * toArrayImpl returns `@Nullable Object[]` rather than `Object[]` but only because it can
+         * be used with collections that may contain null. This collection never contains nulls, so
+         * we can treat it as a plain `Object[]`.
+         */
+        @SuppressWarnings("nullness")
+        Object[] result = (Object[]) ObjectArrays.toArrayImpl(delegate());
+        return result;
       }
     }
 
     @Override
-    public <T> T[] toArray(T[] array) {
+    @SuppressWarnings("nullness") // b/192354773 in our checker affects toArray declarations
+    public <T extends @Nullable Object> T[] toArray(T[] array) {
       synchronized (mutex) {
         return ObjectArrays.toArrayImpl(delegate(), array);
       }
     }
 
     @Override
-    public boolean contains(Object o) {
+    public boolean contains(@CheckForNull Object o) {
       synchronized (mutex) {
         return Maps.containsEntryImpl(delegate(), o);
       }
@@ -984,7 +1022,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -994,7 +1032,7 @@
     }
 
     @Override
-    public boolean remove(Object o) {
+    public boolean remove(@CheckForNull Object o) {
       synchronized (mutex) {
         return Maps.removeEntryImpl(delegate(), o);
       }
@@ -1018,16 +1056,18 @@
   }
 
   @VisibleForTesting
-  static <K, V> Map<K, V> map(Map<K, V> map, @Nullable Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> Map<K, V> map(
+      Map<K, V> map, @CheckForNull Object mutex) {
     return new SynchronizedMap<>(map, mutex);
   }
 
-  private static class SynchronizedMap<K, V> extends SynchronizedObject implements Map<K, V> {
-    transient @Nullable Set<K> keySet;
-    transient @Nullable Collection<V> values;
-    transient @Nullable Set<Entry<K, V>> entrySet;
+  private static class SynchronizedMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedObject implements Map<K, V> {
+    @CheckForNull transient Set<K> keySet;
+    @CheckForNull transient Collection<V> values;
+    @CheckForNull transient Set<Map.Entry<K, V>> entrySet;
 
-    SynchronizedMap(Map<K, V> delegate, @Nullable Object mutex) {
+    SynchronizedMap(Map<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1045,21 +1085,21 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().containsKey(key);
       }
     }
 
     @Override
-    public boolean containsValue(Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       synchronized (mutex) {
         return delegate().containsValue(value);
       }
     }
 
     @Override
-    public Set<Entry<K, V>> entrySet() {
+    public Set<Map.Entry<K, V>> entrySet() {
       synchronized (mutex) {
         if (entrySet == null) {
           entrySet = set(delegate().entrySet(), mutex);
@@ -1076,14 +1116,16 @@
     }
 
     @Override
-    public V get(Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().get(key);
       }
     }
 
     @Override
-    public V getOrDefault(Object key, V defaultValue) {
+    @CheckForNull
+    public V getOrDefault(@CheckForNull Object key, @CheckForNull V defaultValue) {
       synchronized (mutex) {
         return delegate().getOrDefault(key, defaultValue);
       }
@@ -1107,6 +1149,7 @@
     }
 
     @Override
+    @CheckForNull
     public V put(K key, V value) {
       synchronized (mutex) {
         return delegate().put(key, value);
@@ -1114,6 +1157,7 @@
     }
 
     @Override
+    @CheckForNull
     public V putIfAbsent(K key, V value) {
       synchronized (mutex) {
         return delegate().putIfAbsent(key, value);
@@ -1128,6 +1172,7 @@
     }
 
     @Override
+    @CheckForNull
     public V replace(K key, V value) {
       synchronized (mutex) {
         return delegate().replace(key, value);
@@ -1179,14 +1224,15 @@
     }
 
     @Override
-    public V remove(Object key) {
+    @CheckForNull
+    public V remove(@CheckForNull Object key) {
       synchronized (mutex) {
         return delegate().remove(key);
       }
     }
 
     @Override
-    public boolean remove(Object key, Object value) {
+    public boolean remove(@CheckForNull Object key, @CheckForNull Object value) {
       synchronized (mutex) {
         return delegate().remove(key, value);
       }
@@ -1210,7 +1256,7 @@
     }
 
     @Override
-    public boolean equals(Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o == this) {
         return true;
       }
@@ -1229,14 +1275,15 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> SortedMap<K, V> sortedMap(SortedMap<K, V> sortedMap, @Nullable Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> SortedMap<K, V> sortedMap(
+      SortedMap<K, V> sortedMap, @CheckForNull Object mutex) {
     return new SynchronizedSortedMap<>(sortedMap, mutex);
   }
 
-  static class SynchronizedSortedMap<K, V> extends SynchronizedMap<K, V>
-      implements SortedMap<K, V> {
+  static class SynchronizedSortedMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedMap<K, V> implements SortedMap<K, V> {
 
-    SynchronizedSortedMap(SortedMap<K, V> delegate, @Nullable Object mutex) {
+    SynchronizedSortedMap(SortedMap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1246,6 +1293,7 @@
     }
 
     @Override
+    @CheckForNull
     public Comparator<? super K> comparator() {
       synchronized (mutex) {
         return delegate().comparator();
@@ -1290,7 +1338,8 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <K, V> BiMap<K, V> biMap(BiMap<K, V> bimap, @Nullable Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> BiMap<K, V> biMap(
+      BiMap<K, V> bimap, @CheckForNull Object mutex) {
     if (bimap instanceof SynchronizedBiMap || bimap instanceof ImmutableBiMap) {
       return bimap;
     }
@@ -1298,13 +1347,13 @@
   }
 
   @VisibleForTesting
-  static class SynchronizedBiMap<K, V> extends SynchronizedMap<K, V>
-      implements BiMap<K, V>, Serializable {
-    private transient @Nullable Set<V> valueSet;
-    @RetainedWith private transient @Nullable BiMap<V, K> inverse;
+  static class SynchronizedBiMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedMap<K, V> implements BiMap<K, V>, Serializable {
+    @CheckForNull private transient Set<V> valueSet;
+    @RetainedWith @CheckForNull private transient BiMap<V, K> inverse;
 
     private SynchronizedBiMap(
-        BiMap<K, V> delegate, @Nullable Object mutex, @Nullable BiMap<V, K> inverse) {
+        BiMap<K, V> delegate, @CheckForNull Object mutex, @CheckForNull BiMap<V, K> inverse) {
       super(delegate, mutex);
       this.inverse = inverse;
     }
@@ -1325,6 +1374,7 @@
     }
 
     @Override
+    @CheckForNull
     public V forcePut(K key, V value) {
       synchronized (mutex) {
         return delegate().forcePut(key, value);
@@ -1344,16 +1394,18 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static class SynchronizedAsMap<K, V> extends SynchronizedMap<K, Collection<V>> {
-    transient @Nullable Set<Entry<K, Collection<V>>> asMapEntrySet;
-    transient @Nullable Collection<Collection<V>> asMapValues;
+  private static class SynchronizedAsMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedMap<K, Collection<V>> {
+    @CheckForNull transient Set<Map.Entry<K, Collection<V>>> asMapEntrySet;
+    @CheckForNull transient Collection<Collection<V>> asMapValues;
 
-    SynchronizedAsMap(Map<K, Collection<V>> delegate, @Nullable Object mutex) {
+    SynchronizedAsMap(Map<K, Collection<V>> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
     @Override
-    public Collection<V> get(Object key) {
+    @CheckForNull
+    public Collection<V> get(@CheckForNull Object key) {
       synchronized (mutex) {
         Collection<V> collection = super.get(key);
         return (collection == null) ? null : typePreservingCollection(collection, mutex);
@@ -1361,7 +1413,7 @@
     }
 
     @Override
-    public Set<Entry<K, Collection<V>>> entrySet() {
+    public Set<Map.Entry<K, Collection<V>>> entrySet() {
       synchronized (mutex) {
         if (asMapEntrySet == null) {
           asMapEntrySet = new SynchronizedAsMapEntries<>(delegate().entrySet(), mutex);
@@ -1381,7 +1433,7 @@
     }
 
     @Override
-    public boolean containsValue(Object o) {
+    public boolean containsValue(@CheckForNull Object o) {
       // values() and its contains() method are both synchronized.
       return values().contains(o);
     }
@@ -1389,8 +1441,9 @@
     private static final long serialVersionUID = 0;
   }
 
-  private static class SynchronizedAsMapValues<V> extends SynchronizedCollection<Collection<V>> {
-    SynchronizedAsMapValues(Collection<Collection<V>> delegate, @Nullable Object mutex) {
+  private static class SynchronizedAsMapValues<V extends @Nullable Object>
+      extends SynchronizedCollection<Collection<V>> {
+    SynchronizedAsMapValues(Collection<Collection<V>> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1410,9 +1463,9 @@
 
   @GwtIncompatible // NavigableSet
   @VisibleForTesting
-  static class SynchronizedNavigableSet<E> extends SynchronizedSortedSet<E>
+  static class SynchronizedNavigableSet<E extends @Nullable Object> extends SynchronizedSortedSet<E>
       implements NavigableSet<E> {
-    SynchronizedNavigableSet(NavigableSet<E> delegate, @Nullable Object mutex) {
+    SynchronizedNavigableSet(NavigableSet<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1422,6 +1475,7 @@
     }
 
     @Override
+    @CheckForNull
     public E ceiling(E e) {
       synchronized (mutex) {
         return delegate().ceiling(e);
@@ -1433,7 +1487,7 @@
       return delegate().descendingIterator(); // manually synchronized
     }
 
-    transient @Nullable NavigableSet<E> descendingSet;
+    @CheckForNull transient NavigableSet<E> descendingSet;
 
     @Override
     public NavigableSet<E> descendingSet() {
@@ -1448,6 +1502,7 @@
     }
 
     @Override
+    @CheckForNull
     public E floor(E e) {
       synchronized (mutex) {
         return delegate().floor(e);
@@ -1467,6 +1522,7 @@
     }
 
     @Override
+    @CheckForNull
     public E higher(E e) {
       synchronized (mutex) {
         return delegate().higher(e);
@@ -1474,6 +1530,7 @@
     }
 
     @Override
+    @CheckForNull
     public E lower(E e) {
       synchronized (mutex) {
         return delegate().lower(e);
@@ -1481,6 +1538,7 @@
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       synchronized (mutex) {
         return delegate().pollFirst();
@@ -1488,6 +1546,7 @@
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       synchronized (mutex) {
         return delegate().pollLast();
@@ -1524,32 +1583,34 @@
   }
 
   @GwtIncompatible // NavigableSet
-  static <E> NavigableSet<E> navigableSet(NavigableSet<E> navigableSet, @Nullable Object mutex) {
+  static <E extends @Nullable Object> NavigableSet<E> navigableSet(
+      NavigableSet<E> navigableSet, @CheckForNull Object mutex) {
     return new SynchronizedNavigableSet<E>(navigableSet, mutex);
   }
 
   @GwtIncompatible // NavigableSet
-  static <E> NavigableSet<E> navigableSet(NavigableSet<E> navigableSet) {
+  static <E extends @Nullable Object> NavigableSet<E> navigableSet(NavigableSet<E> navigableSet) {
     return navigableSet(navigableSet, null);
   }
 
   @GwtIncompatible // NavigableMap
-  static <K, V> NavigableMap<K, V> navigableMap(NavigableMap<K, V> navigableMap) {
+  static <K extends @Nullable Object, V extends @Nullable Object> NavigableMap<K, V> navigableMap(
+      NavigableMap<K, V> navigableMap) {
     return navigableMap(navigableMap, null);
   }
 
   @GwtIncompatible // NavigableMap
-  static <K, V> NavigableMap<K, V> navigableMap(
-      NavigableMap<K, V> navigableMap, @Nullable Object mutex) {
+  static <K extends @Nullable Object, V extends @Nullable Object> NavigableMap<K, V> navigableMap(
+      NavigableMap<K, V> navigableMap, @CheckForNull Object mutex) {
     return new SynchronizedNavigableMap<>(navigableMap, mutex);
   }
 
   @GwtIncompatible // NavigableMap
   @VisibleForTesting
-  static class SynchronizedNavigableMap<K, V> extends SynchronizedSortedMap<K, V>
-      implements NavigableMap<K, V> {
+  static class SynchronizedNavigableMap<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedSortedMap<K, V> implements NavigableMap<K, V> {
 
-    SynchronizedNavigableMap(NavigableMap<K, V> delegate, @Nullable Object mutex) {
+    SynchronizedNavigableMap(NavigableMap<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1559,20 +1620,22 @@
     }
 
     @Override
-    public Entry<K, V> ceilingEntry(K key) {
+    @CheckForNull
+    public Map.Entry<K, V> ceilingEntry(K key) {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().ceilingEntry(key), mutex);
       }
     }
 
     @Override
+    @CheckForNull
     public K ceilingKey(K key) {
       synchronized (mutex) {
         return delegate().ceilingKey(key);
       }
     }
 
-    transient @Nullable NavigableSet<K> descendingKeySet;
+    @CheckForNull transient NavigableSet<K> descendingKeySet;
 
     @Override
     public NavigableSet<K> descendingKeySet() {
@@ -1584,7 +1647,7 @@
       }
     }
 
-    transient @Nullable NavigableMap<K, V> descendingMap;
+    @CheckForNull transient NavigableMap<K, V> descendingMap;
 
     @Override
     public NavigableMap<K, V> descendingMap() {
@@ -1597,20 +1660,23 @@
     }
 
     @Override
-    public Entry<K, V> firstEntry() {
+    @CheckForNull
+    public Map.Entry<K, V> firstEntry() {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().firstEntry(), mutex);
       }
     }
 
     @Override
-    public Entry<K, V> floorEntry(K key) {
+    @CheckForNull
+    public Map.Entry<K, V> floorEntry(K key) {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().floorEntry(key), mutex);
       }
     }
 
     @Override
+    @CheckForNull
     public K floorKey(K key) {
       synchronized (mutex) {
         return delegate().floorKey(key);
@@ -1630,13 +1696,15 @@
     }
 
     @Override
-    public Entry<K, V> higherEntry(K key) {
+    @CheckForNull
+    public Map.Entry<K, V> higherEntry(K key) {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().higherEntry(key), mutex);
       }
     }
 
     @Override
+    @CheckForNull
     public K higherKey(K key) {
       synchronized (mutex) {
         return delegate().higherKey(key);
@@ -1644,20 +1712,23 @@
     }
 
     @Override
-    public Entry<K, V> lastEntry() {
+    @CheckForNull
+    public Map.Entry<K, V> lastEntry() {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().lastEntry(), mutex);
       }
     }
 
     @Override
-    public Entry<K, V> lowerEntry(K key) {
+    @CheckForNull
+    public Map.Entry<K, V> lowerEntry(K key) {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().lowerEntry(key), mutex);
       }
     }
 
     @Override
+    @CheckForNull
     public K lowerKey(K key) {
       synchronized (mutex) {
         return delegate().lowerKey(key);
@@ -1669,7 +1740,7 @@
       return navigableKeySet();
     }
 
-    transient @Nullable NavigableSet<K> navigableKeySet;
+    @CheckForNull transient NavigableSet<K> navigableKeySet;
 
     @Override
     public NavigableSet<K> navigableKeySet() {
@@ -1682,14 +1753,16 @@
     }
 
     @Override
-    public Entry<K, V> pollFirstEntry() {
+    @CheckForNull
+    public Map.Entry<K, V> pollFirstEntry() {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().pollFirstEntry(), mutex);
       }
     }
 
     @Override
-    public Entry<K, V> pollLastEntry() {
+    @CheckForNull
+    public Map.Entry<K, V> pollLastEntry() {
       synchronized (mutex) {
         return nullableSynchronizedEntry(delegate().pollLastEntry(), mutex);
       }
@@ -1724,8 +1797,10 @@
   }
 
   @GwtIncompatible // works but is needed only for NavigableMap
-  private static <K, V> Entry<K, V> nullableSynchronizedEntry(
-      @Nullable Entry<K, V> entry, @Nullable Object mutex) {
+  @CheckForNull
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      Map.Entry<K, V> nullableSynchronizedEntry(
+          @CheckForNull Map.Entry<K, V> entry, @CheckForNull Object mutex) {
     if (entry == null) {
       return null;
     }
@@ -1733,20 +1808,21 @@
   }
 
   @GwtIncompatible // works but is needed only for NavigableMap
-  private static class SynchronizedEntry<K, V> extends SynchronizedObject implements Entry<K, V> {
+  private static class SynchronizedEntry<K extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedObject implements Map.Entry<K, V> {
 
-    SynchronizedEntry(Entry<K, V> delegate, @Nullable Object mutex) {
+    SynchronizedEntry(Map.Entry<K, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
     @SuppressWarnings("unchecked") // guaranteed by the constructor
     @Override
-    Entry<K, V> delegate() {
-      return (Entry<K, V>) super.delegate();
+    Map.Entry<K, V> delegate() {
+      return (Map.Entry<K, V>) super.delegate();
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       synchronized (mutex) {
         return delegate().equals(obj);
       }
@@ -1783,13 +1859,14 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <E> Queue<E> queue(Queue<E> queue, @Nullable Object mutex) {
+  static <E extends @Nullable Object> Queue<E> queue(Queue<E> queue, @CheckForNull Object mutex) {
     return (queue instanceof SynchronizedQueue) ? queue : new SynchronizedQueue<E>(queue, mutex);
   }
 
-  private static class SynchronizedQueue<E> extends SynchronizedCollection<E> implements Queue<E> {
+  private static class SynchronizedQueue<E extends @Nullable Object>
+      extends SynchronizedCollection<E> implements Queue<E> {
 
-    SynchronizedQueue(Queue<E> delegate, @Nullable Object mutex) {
+    SynchronizedQueue(Queue<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1813,6 +1890,7 @@
     }
 
     @Override
+    @CheckForNull
     public E peek() {
       synchronized (mutex) {
         return delegate().peek();
@@ -1820,6 +1898,7 @@
     }
 
     @Override
+    @CheckForNull
     public E poll() {
       synchronized (mutex) {
         return delegate().poll();
@@ -1836,13 +1915,14 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <E> Deque<E> deque(Deque<E> deque, @Nullable Object mutex) {
+  static <E extends @Nullable Object> Deque<E> deque(Deque<E> deque, @CheckForNull Object mutex) {
     return new SynchronizedDeque<E>(deque, mutex);
   }
 
-  private static final class SynchronizedDeque<E> extends SynchronizedQueue<E> implements Deque<E> {
+  private static final class SynchronizedDeque<E extends @Nullable Object>
+      extends SynchronizedQueue<E> implements Deque<E> {
 
-    SynchronizedDeque(Deque<E> delegate, @Nullable Object mutex) {
+    SynchronizedDeque(Deque<E> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1894,6 +1974,7 @@
     }
 
     @Override
+    @CheckForNull
     public E pollFirst() {
       synchronized (mutex) {
         return delegate().pollFirst();
@@ -1901,6 +1982,7 @@
     }
 
     @Override
+    @CheckForNull
     public E pollLast() {
       synchronized (mutex) {
         return delegate().pollLast();
@@ -1922,6 +2004,7 @@
     }
 
     @Override
+    @CheckForNull
     public E peekFirst() {
       synchronized (mutex) {
         return delegate().peekFirst();
@@ -1929,6 +2012,7 @@
     }
 
     @Override
+    @CheckForNull
     public E peekLast() {
       synchronized (mutex) {
         return delegate().peekLast();
@@ -1936,14 +2020,14 @@
     }
 
     @Override
-    public boolean removeFirstOccurrence(Object o) {
+    public boolean removeFirstOccurrence(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().removeFirstOccurrence(o);
       }
     }
 
     @Override
-    public boolean removeLastOccurrence(Object o) {
+    public boolean removeLastOccurrence(@CheckForNull Object o) {
       synchronized (mutex) {
         return delegate().removeLastOccurrence(o);
       }
@@ -1973,14 +2057,16 @@
     private static final long serialVersionUID = 0;
   }
 
-  static <R, C, V> Table<R, C, V> table(Table<R, C, V> table, Object mutex) {
+  static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      Table<R, C, V> table(Table<R, C, V> table, @CheckForNull Object mutex) {
     return new SynchronizedTable<>(table, mutex);
   }
 
-  private static final class SynchronizedTable<R, C, V> extends SynchronizedObject
-      implements Table<R, C, V> {
+  private static final class SynchronizedTable<
+          R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      extends SynchronizedObject implements Table<R, C, V> {
 
-    SynchronizedTable(Table<R, C, V> delegate, Object mutex) {
+    SynchronizedTable(Table<R, C, V> delegate, @CheckForNull Object mutex) {
       super(delegate, mutex);
     }
 
@@ -1991,35 +2077,36 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object rowKey, @Nullable Object columnKey) {
+    public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       synchronized (mutex) {
         return delegate().contains(rowKey, columnKey);
       }
     }
 
     @Override
-    public boolean containsRow(@Nullable Object rowKey) {
+    public boolean containsRow(@CheckForNull Object rowKey) {
       synchronized (mutex) {
         return delegate().containsRow(rowKey);
       }
     }
 
     @Override
-    public boolean containsColumn(@Nullable Object columnKey) {
+    public boolean containsColumn(@CheckForNull Object columnKey) {
       synchronized (mutex) {
         return delegate().containsColumn(columnKey);
       }
     }
 
     @Override
-    public boolean containsValue(@Nullable Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       synchronized (mutex) {
         return delegate().containsValue(value);
       }
     }
 
     @Override
-    public V get(@Nullable Object rowKey, @Nullable Object columnKey) {
+    @CheckForNull
+    public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       synchronized (mutex) {
         return delegate().get(rowKey, columnKey);
       }
@@ -2047,7 +2134,8 @@
     }
 
     @Override
-    public V put(@Nullable R rowKey, @Nullable C columnKey, @Nullable V value) {
+    @CheckForNull
+    public V put(R rowKey, C columnKey, V value) {
       synchronized (mutex) {
         return delegate().put(rowKey, columnKey, value);
       }
@@ -2061,21 +2149,22 @@
     }
 
     @Override
-    public V remove(@Nullable Object rowKey, @Nullable Object columnKey) {
+    @CheckForNull
+    public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       synchronized (mutex) {
         return delegate().remove(rowKey, columnKey);
       }
     }
 
     @Override
-    public Map<C, V> row(@Nullable R rowKey) {
+    public Map<C, V> row(R rowKey) {
       synchronized (mutex) {
         return map(delegate().row(rowKey), mutex);
       }
     }
 
     @Override
-    public Map<R, V> column(@Nullable C columnKey) {
+    public Map<R, V> column(C columnKey) {
       synchronized (mutex) {
         return map(delegate().column(columnKey), mutex);
       }
@@ -2149,7 +2238,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (this == obj) {
         return true;
       }
diff --git a/guava/src/com/google/common/collect/Table.java b/guava/src/com/google/common/collect/Table.java
index 136ec17..97d3f70 100644
--- a/guava/src/com/google/common/collect/Table.java
+++ b/guava/src/com/google/common/collect/Table.java
@@ -24,6 +24,7 @@
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -55,7 +56,9 @@
  */
 @DoNotMock("Use ImmutableTable, HashBasedTable, or another implementation")
 @GwtCompatible
-public interface Table<R, C, V> {
+@ElementTypesAreNonnullByDefault
+public interface Table<
+    R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object> {
   // TODO(jlevy): Consider adding methods similar to ConcurrentMap methods.
 
   // Accessors
@@ -67,29 +70,29 @@
    * @param columnKey key of column to search for
    */
   boolean contains(
-      @Nullable @CompatibleWith("R") Object rowKey,
-      @Nullable @CompatibleWith("C") Object columnKey);
+      @CompatibleWith("R") @CheckForNull Object rowKey,
+      @CompatibleWith("C") @CheckForNull Object columnKey);
 
   /**
    * Returns {@code true} if the table contains a mapping with the specified row key.
    *
    * @param rowKey key of row to search for
    */
-  boolean containsRow(@Nullable @CompatibleWith("R") Object rowKey);
+  boolean containsRow(@CompatibleWith("R") @CheckForNull Object rowKey);
 
   /**
    * Returns {@code true} if the table contains a mapping with the specified column.
    *
    * @param columnKey key of column to search for
    */
-  boolean containsColumn(@Nullable @CompatibleWith("C") Object columnKey);
+  boolean containsColumn(@CompatibleWith("C") @CheckForNull Object columnKey);
 
   /**
    * Returns {@code true} if the table contains a mapping with the specified value.
    *
    * @param value value to search for
    */
-  boolean containsValue(@Nullable @CompatibleWith("V") Object value);
+  boolean containsValue(@CompatibleWith("V") @CheckForNull Object value);
 
   /**
    * Returns the value corresponding to the given row and column keys, or {@code null} if no such
@@ -98,10 +101,10 @@
    * @param rowKey key of row to search for
    * @param columnKey key of column to search for
    */
-  @Nullable
+  @CheckForNull
   V get(
-      @Nullable @CompatibleWith("R") Object rowKey,
-      @Nullable @CompatibleWith("C") Object columnKey);
+      @CompatibleWith("R") @CheckForNull Object rowKey,
+      @CompatibleWith("C") @CheckForNull Object columnKey);
 
   /** Returns {@code true} if the table contains no mappings. */
   boolean isEmpty();
@@ -114,7 +117,7 @@
    * cell views, as returned by {@link #cellSet}, are equal.
    */
   @Override
-  boolean equals(@Nullable Object obj);
+  boolean equals(@CheckForNull Object obj);
 
   /**
    * Returns the hash code for this table. The hash code of a table is defined as the hash code of
@@ -139,8 +142,8 @@
    *     for the keys
    */
   @CanIgnoreReturnValue
-  @Nullable
-  V put(R rowKey, C columnKey, V value);
+  @CheckForNull
+  V put(@ParametricNullness R rowKey, @ParametricNullness C columnKey, @ParametricNullness V value);
 
   /**
    * Copies all mappings from the specified table to this table. The effect is equivalent to calling
@@ -158,10 +161,10 @@
    * @return the value previously associated with the keys, or {@code null} if no such value existed
    */
   @CanIgnoreReturnValue
-  @Nullable
+  @CheckForNull
   V remove(
-      @Nullable @CompatibleWith("R") Object rowKey,
-      @Nullable @CompatibleWith("C") Object columnKey);
+      @CompatibleWith("R") @CheckForNull Object rowKey,
+      @CompatibleWith("C") @CheckForNull Object columnKey);
 
   // Views
 
@@ -175,7 +178,7 @@
    * @param rowKey key of row to search for in the table
    * @return the corresponding map from column keys to values
    */
-  Map<C, V> row(R rowKey);
+  Map<C, V> row(@ParametricNullness R rowKey);
 
   /**
    * Returns a view of all mappings that have the given column key. For each row key / column key /
@@ -187,7 +190,7 @@
    * @param columnKey key of column to search for in the table
    * @return the corresponding map from row keys to values
    */
-  Map<R, V> column(C columnKey);
+  Map<R, V> column(@ParametricNullness C columnKey);
 
   /**
    * Returns a set of all row key / column key / value triplets. Changes to the returned set will
@@ -253,17 +256,18 @@
    *
    * @since 7.0
    */
-  interface Cell<R, C, V> {
+  interface Cell<
+      R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object> {
     /** Returns the row key of this cell. */
-    @Nullable
+    @ParametricNullness
     R getRowKey();
 
     /** Returns the column key of this cell. */
-    @Nullable
+    @ParametricNullness
     C getColumnKey();
 
     /** Returns the value of this cell. */
-    @Nullable
+    @ParametricNullness
     V getValue();
 
     /**
@@ -271,7 +275,7 @@
      * equal row keys, column keys, and values.
      */
     @Override
-    boolean equals(@Nullable Object obj);
+    boolean equals(@CheckForNull Object obj);
 
     /**
      * Returns the hash code of this cell.
diff --git a/guava/src/com/google/common/collect/TableCollectors.java b/guava/src/com/google/common/collect/TableCollectors.java
new file mode 100644
index 0000000..99ab810
--- /dev/null
+++ b/guava/src/com/google/common/collect/TableCollectors.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2009 The Guava Authors
+ *
+ * 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 com.google.common.collect;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.common.annotations.GwtCompatible;
+import com.google.common.collect.Tables.AbstractCell;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Collector;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/** Collectors utilities for {@code common.collect.Table} internals. */
+@GwtCompatible
+@ElementTypesAreNonnullByDefault
+final class TableCollectors {
+
+  static <T extends @Nullable Object, R, C, V>
+      Collector<T, ?, ImmutableTable<R, C, V>> toImmutableTable(
+          Function<? super T, ? extends R> rowFunction,
+          Function<? super T, ? extends C> columnFunction,
+          Function<? super T, ? extends V> valueFunction) {
+    checkNotNull(rowFunction, "rowFunction");
+    checkNotNull(columnFunction, "columnFunction");
+    checkNotNull(valueFunction, "valueFunction");
+    return Collector.of(
+        (Supplier<ImmutableTable.Builder<R, C, V>>) ImmutableTable.Builder::new,
+        (builder, t) ->
+            builder.put(rowFunction.apply(t), columnFunction.apply(t), valueFunction.apply(t)),
+        ImmutableTable.Builder::combine,
+        ImmutableTable.Builder::build);
+  }
+
+  static <T extends @Nullable Object, R, C, V>
+      Collector<T, ?, ImmutableTable<R, C, V>> toImmutableTable(
+          Function<? super T, ? extends R> rowFunction,
+          Function<? super T, ? extends C> columnFunction,
+          Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction) {
+
+    checkNotNull(rowFunction, "rowFunction");
+    checkNotNull(columnFunction, "columnFunction");
+    checkNotNull(valueFunction, "valueFunction");
+    checkNotNull(mergeFunction, "mergeFunction");
+
+    /*
+     * No mutable Table exactly matches the insertion order behavior of ImmutableTable.Builder, but
+     * the Builder can't efficiently support merging of duplicate values.  Getting around this
+     * requires some work.
+     */
+
+    return Collector.of(
+        () -> new ImmutableTableCollectorState<R, C, V>()
+        /* GWT isn't currently playing nicely with constructor references? */ ,
+        (state, input) ->
+            state.put(
+                rowFunction.apply(input),
+                columnFunction.apply(input),
+                valueFunction.apply(input),
+                mergeFunction),
+        (s1, s2) -> s1.combine(s2, mergeFunction),
+        state -> state.toTable());
+  }
+
+  static <
+          T extends @Nullable Object,
+          R extends @Nullable Object,
+          C extends @Nullable Object,
+          V extends @Nullable Object,
+          I extends Table<R, C, V>>
+      Collector<T, ?, I> toTable(
+          java.util.function.Function<? super T, ? extends R> rowFunction,
+          java.util.function.Function<? super T, ? extends C> columnFunction,
+          java.util.function.Function<? super T, ? extends V> valueFunction,
+          java.util.function.Supplier<I> tableSupplier) {
+    return toTable(
+        rowFunction,
+        columnFunction,
+        valueFunction,
+        (v1, v2) -> {
+          throw new IllegalStateException("Conflicting values " + v1 + " and " + v2);
+        },
+        tableSupplier);
+  }
+
+  static <
+          T extends @Nullable Object,
+          R extends @Nullable Object,
+          C extends @Nullable Object,
+          V extends @Nullable Object,
+          I extends Table<R, C, V>>
+      Collector<T, ?, I> toTable(
+          java.util.function.Function<? super T, ? extends R> rowFunction,
+          java.util.function.Function<? super T, ? extends C> columnFunction,
+          java.util.function.Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction,
+          java.util.function.Supplier<I> tableSupplier) {
+    checkNotNull(rowFunction);
+    checkNotNull(columnFunction);
+    checkNotNull(valueFunction);
+    checkNotNull(mergeFunction);
+    checkNotNull(tableSupplier);
+    return Collector.of(
+        tableSupplier,
+        (table, input) ->
+            mergeTables(
+                table,
+                rowFunction.apply(input),
+                columnFunction.apply(input),
+                valueFunction.apply(input),
+                mergeFunction),
+        (table1, table2) -> {
+          for (Table.Cell<R, C, V> cell2 : table2.cellSet()) {
+            mergeTables(
+                table1, cell2.getRowKey(), cell2.getColumnKey(), cell2.getValue(), mergeFunction);
+          }
+          return table1;
+        });
+  }
+
+  private static final class ImmutableTableCollectorState<R, C, V> {
+    final List<MutableCell<R, C, V>> insertionOrder = new ArrayList<>();
+    final Table<R, C, MutableCell<R, C, V>> table = HashBasedTable.create();
+
+    void put(R row, C column, V value, BinaryOperator<V> merger) {
+      MutableCell<R, C, V> oldCell = table.get(row, column);
+      if (oldCell == null) {
+        MutableCell<R, C, V> cell = new MutableCell<>(row, column, value);
+        insertionOrder.add(cell);
+        table.put(row, column, cell);
+      } else {
+        oldCell.merge(value, merger);
+      }
+    }
+
+    ImmutableTableCollectorState<R, C, V> combine(
+        ImmutableTableCollectorState<R, C, V> other, BinaryOperator<V> merger) {
+      for (MutableCell<R, C, V> cell : other.insertionOrder) {
+        put(cell.getRowKey(), cell.getColumnKey(), cell.getValue(), merger);
+      }
+      return this;
+    }
+
+    ImmutableTable<R, C, V> toTable() {
+      return ImmutableTable.copyOf(insertionOrder);
+    }
+  }
+
+  private static final class MutableCell<R, C, V> extends AbstractCell<R, C, V> {
+    private final R row;
+    private final C column;
+    private V value;
+
+    MutableCell(R row, C column, V value) {
+      this.row = checkNotNull(row, "row");
+      this.column = checkNotNull(column, "column");
+      this.value = checkNotNull(value, "value");
+    }
+
+    @Override
+    public R getRowKey() {
+      return row;
+    }
+
+    @Override
+    public C getColumnKey() {
+      return column;
+    }
+
+    @Override
+    public V getValue() {
+      return value;
+    }
+
+    void merge(V value, BinaryOperator<V> mergeFunction) {
+      checkNotNull(value, "value");
+      this.value = checkNotNull(mergeFunction.apply(this.value, value), "mergeFunction.apply");
+    }
+  }
+
+  private static <
+          R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      void mergeTables(
+          Table<R, C, V> table,
+          @ParametricNullness R row,
+          @ParametricNullness C column,
+          @ParametricNullness V value,
+          BinaryOperator<V> mergeFunction) {
+    checkNotNull(value);
+    V oldValue = table.get(row, column);
+    if (oldValue == null) {
+      table.put(row, column, value);
+    } else {
+      V newValue = mergeFunction.apply(oldValue, value);
+      if (newValue == null) {
+        table.remove(row, column);
+      } else {
+        table.put(row, column, newValue);
+      }
+    }
+  }
+
+  private TableCollectors() {}
+}
diff --git a/guava/src/com/google/common/collect/Tables.java b/guava/src/com/google/common/collect/Tables.java
index fc913ec..2d743f0 100644
--- a/guava/src/com/google/common/collect/Tables.java
+++ b/guava/src/com/google/common/collect/Tables.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -36,6 +37,7 @@
 import java.util.Spliterator;
 import java.util.function.BinaryOperator;
 import java.util.stream.Collector;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -49,6 +51,7 @@
  * @since 7.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Tables {
   private Tables() {}
 
@@ -60,22 +63,23 @@
    * <p>If multiple input elements map to the same row and column, an {@code IllegalStateException}
    * is thrown when the collection operation is performed.
    *
+   * <p>To collect to an {@link ImmutableTable}, use {@link ImmutableTable#toImmutableTable}.
+   *
    * @since 21.0
    */
   @Beta
-  public static <T, R, C, V, I extends Table<R, C, V>> Collector<T, ?, I> toTable(
-      java.util.function.Function<? super T, ? extends R> rowFunction,
-      java.util.function.Function<? super T, ? extends C> columnFunction,
-      java.util.function.Function<? super T, ? extends V> valueFunction,
-      java.util.function.Supplier<I> tableSupplier) {
-    return toTable(
-        rowFunction,
-        columnFunction,
-        valueFunction,
-        (v1, v2) -> {
-          throw new IllegalStateException("Conflicting values " + v1 + " and " + v2);
-        },
-        tableSupplier);
+  public static <
+          T extends @Nullable Object,
+          R extends @Nullable Object,
+          C extends @Nullable Object,
+          V extends @Nullable Object,
+          I extends Table<R, C, V>>
+      Collector<T, ?, I> toTable(
+          java.util.function.Function<? super T, ? extends R> rowFunction,
+          java.util.function.Function<? super T, ? extends C> columnFunction,
+          java.util.function.Function<? super T, ? extends V> valueFunction,
+          java.util.function.Supplier<I> tableSupplier) {
+    return TableCollectors.toTable(rowFunction, columnFunction, valueFunction, tableSupplier);
   }
 
   /**
@@ -92,48 +96,20 @@
    *
    * @since 21.0
    */
-  public static <T, R, C, V, I extends Table<R, C, V>> Collector<T, ?, I> toTable(
-      java.util.function.Function<? super T, ? extends R> rowFunction,
-      java.util.function.Function<? super T, ? extends C> columnFunction,
-      java.util.function.Function<? super T, ? extends V> valueFunction,
-      BinaryOperator<V> mergeFunction,
-      java.util.function.Supplier<I> tableSupplier) {
-    checkNotNull(rowFunction);
-    checkNotNull(columnFunction);
-    checkNotNull(valueFunction);
-    checkNotNull(mergeFunction);
-    checkNotNull(tableSupplier);
-    return Collector.of(
-        tableSupplier,
-        (table, input) ->
-            merge(
-                table,
-                rowFunction.apply(input),
-                columnFunction.apply(input),
-                valueFunction.apply(input),
-                mergeFunction),
-        (table1, table2) -> {
-          for (Table.Cell<R, C, V> cell2 : table2.cellSet()) {
-            merge(table1, cell2.getRowKey(), cell2.getColumnKey(), cell2.getValue(), mergeFunction);
-          }
-          return table1;
-        });
-  }
-
-  private static <R, C, V> void merge(
-      Table<R, C, V> table, R row, C column, V value, BinaryOperator<V> mergeFunction) {
-    checkNotNull(value);
-    V oldValue = table.get(row, column);
-    if (oldValue == null) {
-      table.put(row, column, value);
-    } else {
-      V newValue = mergeFunction.apply(oldValue, value);
-      if (newValue == null) {
-        table.remove(row, column);
-      } else {
-        table.put(row, column, newValue);
-      }
-    }
+  public static <
+          T extends @Nullable Object,
+          R extends @Nullable Object,
+          C extends @Nullable Object,
+          V extends @Nullable Object,
+          I extends Table<R, C, V>>
+      Collector<T, ?, I> toTable(
+          java.util.function.Function<? super T, ? extends R> rowFunction,
+          java.util.function.Function<? super T, ? extends C> columnFunction,
+          java.util.function.Function<? super T, ? extends V> valueFunction,
+          BinaryOperator<V> mergeFunction,
+          java.util.function.Supplier<I> tableSupplier) {
+    return TableCollectors.toTable(
+        rowFunction, columnFunction, valueFunction, mergeFunction, tableSupplier);
   }
 
   /**
@@ -145,33 +121,44 @@
    * @param columnKey the column key to be associated with the returned cell
    * @param value the value to be associated with the returned cell
    */
-  public static <R, C, V> Cell<R, C, V> immutableCell(
-      @Nullable R rowKey, @Nullable C columnKey, @Nullable V value) {
+  public static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      Cell<R, C, V> immutableCell(
+          @ParametricNullness R rowKey,
+          @ParametricNullness C columnKey,
+          @ParametricNullness V value) {
     return new ImmutableCell<>(rowKey, columnKey, value);
   }
 
-  static final class ImmutableCell<R, C, V> extends AbstractCell<R, C, V> implements Serializable {
-    private final @Nullable R rowKey;
-    private final @Nullable C columnKey;
-    private final @Nullable V value;
+  static final class ImmutableCell<
+          R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractCell<R, C, V> implements Serializable {
+    @ParametricNullness private final R rowKey;
+    @ParametricNullness private final C columnKey;
+    @ParametricNullness private final V value;
 
-    ImmutableCell(@Nullable R rowKey, @Nullable C columnKey, @Nullable V value) {
+    ImmutableCell(
+        @ParametricNullness R rowKey,
+        @ParametricNullness C columnKey,
+        @ParametricNullness V value) {
       this.rowKey = rowKey;
       this.columnKey = columnKey;
       this.value = value;
     }
 
     @Override
+    @ParametricNullness
     public R getRowKey() {
       return rowKey;
     }
 
     @Override
+    @ParametricNullness
     public C getColumnKey() {
       return columnKey;
     }
 
     @Override
+    @ParametricNullness
     public V getValue() {
       return value;
     }
@@ -179,12 +166,14 @@
     private static final long serialVersionUID = 0;
   }
 
-  abstract static class AbstractCell<R, C, V> implements Cell<R, C, V> {
+  abstract static class AbstractCell<
+          R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      implements Cell<R, C, V> {
     // needed for serialization
     AbstractCell() {}
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj == this) {
         return true;
       }
@@ -220,13 +209,16 @@
    * columnKeySet().iterator()} doesn't. With a transposed {@link HashBasedTable}, it's the other
    * way around.
    */
-  public static <R, C, V> Table<C, R, V> transpose(Table<R, C, V> table) {
+  public static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      Table<C, R, V> transpose(Table<R, C, V> table) {
     return (table instanceof TransposeTable)
         ? ((TransposeTable<R, C, V>) table).original
         : new TransposeTable<C, R, V>(table);
   }
 
-  private static class TransposeTable<C, R, V> extends AbstractTable<C, R, V> {
+  private static class TransposeTable<
+          C extends @Nullable Object, R extends @Nullable Object, V extends @Nullable Object>
+      extends AbstractTable<C, R, V> {
     final Table<R, C, V> original;
 
     TransposeTable(Table<R, C, V> original) {
@@ -239,7 +231,7 @@
     }
 
     @Override
-    public Map<C, V> column(R columnKey) {
+    public Map<C, V> column(@ParametricNullness R columnKey) {
       return original.row(columnKey);
     }
 
@@ -254,32 +246,37 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object rowKey, @Nullable Object columnKey) {
+    public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       return original.contains(columnKey, rowKey);
     }
 
     @Override
-    public boolean containsColumn(@Nullable Object columnKey) {
+    public boolean containsColumn(@CheckForNull Object columnKey) {
       return original.containsRow(columnKey);
     }
 
     @Override
-    public boolean containsRow(@Nullable Object rowKey) {
+    public boolean containsRow(@CheckForNull Object rowKey) {
       return original.containsColumn(rowKey);
     }
 
     @Override
-    public boolean containsValue(@Nullable Object value) {
+    public boolean containsValue(@CheckForNull Object value) {
       return original.containsValue(value);
     }
 
     @Override
-    public V get(@Nullable Object rowKey, @Nullable Object columnKey) {
+    @CheckForNull
+    public V get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       return original.get(columnKey, rowKey);
     }
 
     @Override
-    public V put(C rowKey, R columnKey, V value) {
+    @CheckForNull
+    public V put(
+        @ParametricNullness C rowKey,
+        @ParametricNullness R columnKey,
+        @ParametricNullness V value) {
       return original.put(columnKey, rowKey, value);
     }
 
@@ -289,12 +286,13 @@
     }
 
     @Override
-    public V remove(@Nullable Object rowKey, @Nullable Object columnKey) {
+    @CheckForNull
+    public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       return original.remove(columnKey, rowKey);
     }
 
     @Override
-    public Map<R, V> row(C rowKey) {
+    public Map<R, V> row(@ParametricNullness C rowKey) {
       return original.column(rowKey);
     }
 
@@ -409,12 +407,22 @@
    * @since 10.0
    */
   @Beta
-  public static <R, C, V1, V2> Table<R, C, V2> transformValues(
-      Table<R, C, V1> fromTable, Function<? super V1, V2> function) {
+  public static <
+          R extends @Nullable Object,
+          C extends @Nullable Object,
+          V1 extends @Nullable Object,
+          V2 extends @Nullable Object>
+      Table<R, C, V2> transformValues(
+          Table<R, C, V1> fromTable, Function<? super V1, V2> function) {
     return new TransformedTable<>(fromTable, function);
   }
 
-  private static class TransformedTable<R, C, V1, V2> extends AbstractTable<R, C, V2> {
+  private static class TransformedTable<
+          R extends @Nullable Object,
+          C extends @Nullable Object,
+          V1 extends @Nullable Object,
+          V2 extends @Nullable Object>
+      extends AbstractTable<R, C, V2> {
     final Table<R, C, V1> fromTable;
     final Function<? super V1, V2> function;
 
@@ -424,15 +432,19 @@
     }
 
     @Override
-    public boolean contains(Object rowKey, Object columnKey) {
+    public boolean contains(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       return fromTable.contains(rowKey, columnKey);
     }
 
     @Override
-    public V2 get(Object rowKey, Object columnKey) {
+    @CheckForNull
+    public V2 get(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       // The function is passed a null input only when the table contains a null
       // value.
-      return contains(rowKey, columnKey) ? function.apply(fromTable.get(rowKey, columnKey)) : null;
+      // The cast is safe because of the contains() check.
+      return contains(rowKey, columnKey)
+          ? function.apply(uncheckedCastNullableTToT(fromTable.get(rowKey, columnKey)))
+          : null;
     }
 
     @Override
@@ -446,7 +458,11 @@
     }
 
     @Override
-    public V2 put(R rowKey, C columnKey, V2 value) {
+    @CheckForNull
+    public V2 put(
+        @ParametricNullness R rowKey,
+        @ParametricNullness C columnKey,
+        @ParametricNullness V2 value) {
       throw new UnsupportedOperationException();
     }
 
@@ -456,19 +472,21 @@
     }
 
     @Override
-    public V2 remove(Object rowKey, Object columnKey) {
+    @CheckForNull
+    public V2 remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       return contains(rowKey, columnKey)
-          ? function.apply(fromTable.remove(rowKey, columnKey))
+          // The cast is safe because of the contains() check.
+          ? function.apply(uncheckedCastNullableTToT(fromTable.remove(rowKey, columnKey)))
           : null;
     }
 
     @Override
-    public Map<C, V2> row(R rowKey) {
+    public Map<C, V2> row(@ParametricNullness R rowKey) {
       return Maps.transformValues(fromTable.row(rowKey), function);
     }
 
     @Override
-    public Map<R, V2> column(C columnKey) {
+    public Map<R, V2> column(@ParametricNullness C columnKey) {
       return Maps.transformValues(fromTable.column(columnKey), function);
     }
 
@@ -544,13 +562,14 @@
    *
    * @since 11.0
    */
-  public static <R, C, V> Table<R, C, V> unmodifiableTable(
-      Table<? extends R, ? extends C, ? extends V> table) {
+  public static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      Table<R, C, V> unmodifiableTable(Table<? extends R, ? extends C, ? extends V> table) {
     return new UnmodifiableTable<>(table);
   }
 
-  private static class UnmodifiableTable<R, C, V> extends ForwardingTable<R, C, V>
-      implements Serializable {
+  private static class UnmodifiableTable<
+          R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      extends ForwardingTable<R, C, V> implements Serializable {
     final Table<? extends R, ? extends C, ? extends V> delegate;
 
     UnmodifiableTable(Table<? extends R, ? extends C, ? extends V> delegate) {
@@ -574,7 +593,7 @@
     }
 
     @Override
-    public Map<R, V> column(@Nullable C columnKey) {
+    public Map<R, V> column(@ParametricNullness C columnKey) {
       return Collections.unmodifiableMap(super.column(columnKey));
     }
 
@@ -590,7 +609,11 @@
     }
 
     @Override
-    public V put(@Nullable R rowKey, @Nullable C columnKey, @Nullable V value) {
+    @CheckForNull
+    public V put(
+        @ParametricNullness R rowKey,
+        @ParametricNullness C columnKey,
+        @ParametricNullness V value) {
       throw new UnsupportedOperationException();
     }
 
@@ -600,12 +623,13 @@
     }
 
     @Override
-    public V remove(@Nullable Object rowKey, @Nullable Object columnKey) {
+    @CheckForNull
+    public V remove(@CheckForNull Object rowKey, @CheckForNull Object columnKey) {
       throw new UnsupportedOperationException();
     }
 
     @Override
-    public Map<C, V> row(@Nullable R rowKey) {
+    public Map<C, V> row(@ParametricNullness R rowKey) {
       return Collections.unmodifiableMap(super.row(rowKey));
     }
 
@@ -641,8 +665,9 @@
    * @since 11.0
    */
   @Beta
-  public static <R, C, V> RowSortedTable<R, C, V> unmodifiableRowSortedTable(
-      RowSortedTable<R, ? extends C, ? extends V> table) {
+  public static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      RowSortedTable<R, C, V> unmodifiableRowSortedTable(
+          RowSortedTable<R, ? extends C, ? extends V> table) {
     /*
      * It's not ? extends R, because it's technically not covariant in R. Specifically,
      * table.rowMap().comparator() could return a comparator that only works for the ? extends R.
@@ -651,8 +676,9 @@
     return new UnmodifiableRowSortedMap<>(table);
   }
 
-  static final class UnmodifiableRowSortedMap<R, C, V> extends UnmodifiableTable<R, C, V>
-      implements RowSortedTable<R, C, V> {
+  static final class UnmodifiableRowSortedMap<
+          R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      extends UnmodifiableTable<R, C, V> implements RowSortedTable<R, C, V> {
 
     public UnmodifiableRowSortedMap(RowSortedTable<R, ? extends C, ? extends V> delegate) {
       super(delegate);
@@ -678,7 +704,8 @@
   }
 
   @SuppressWarnings("unchecked")
-  private static <K, V> Function<Map<K, V>, Map<K, V>> unmodifiableWrapper() {
+  private static <K extends @Nullable Object, V extends @Nullable Object>
+      Function<Map<K, V>, Map<K, V>> unmodifiableWrapper() {
     return (Function) UNMODIFIABLE_WRAPPER;
   }
 
@@ -719,11 +746,12 @@
    * @return a synchronized view of the specified table
    * @since 22.0
    */
-  public static <R, C, V> Table<R, C, V> synchronizedTable(Table<R, C, V> table) {
+  public static <R extends @Nullable Object, C extends @Nullable Object, V extends @Nullable Object>
+      Table<R, C, V> synchronizedTable(Table<R, C, V> table) {
     return Synchronized.table(table, null);
   }
 
-  static boolean equalsImpl(Table<?, ?, ?> table, @Nullable Object obj) {
+  static boolean equalsImpl(Table<?, ?, ?> table, @CheckForNull Object obj) {
     if (obj == table) {
       return true;
     } else if (obj instanceof Table) {
diff --git a/guava/src/com/google/common/collect/TopKSelector.java b/guava/src/com/google/common/collect/TopKSelector.java
index 09f38aa..8411fcd 100644
--- a/guava/src/com/google/common/collect/TopKSelector.java
+++ b/guava/src/com/google/common/collect/TopKSelector.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.math.IntMath;
@@ -28,6 +29,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Stream;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -51,7 +53,10 @@
  *
  * @author Louis Wasserman
  */
-@GwtCompatible final class TopKSelector<T> {
+@GwtCompatible
+@ElementTypesAreNonnullByDefault
+final class TopKSelector<
+    T extends @Nullable Object> {
 
   /**
    * Returns a {@code TopKSelector} that collects the lowest {@code k} elements added to it,
@@ -70,7 +75,8 @@
    *
    * @throws IllegalArgumentException if {@code k < 0} or {@code k > Integer.MAX_VALUE / 2}
    */
-  public static <T> TopKSelector<T> least(int k, Comparator<? super T> comparator) {
+  public static <T extends @Nullable Object> TopKSelector<T> least(
+      int k, Comparator<? super T> comparator) {
     return new TopKSelector<T>(comparator, k);
   }
 
@@ -91,7 +97,8 @@
    *
    * @throws IllegalArgumentException if {@code k < 0} or {@code k > Integer.MAX_VALUE / 2}
    */
-  public static <T> TopKSelector<T> greatest(int k, Comparator<? super T> comparator) {
+  public static <T extends @Nullable Object> TopKSelector<T> greatest(
+      int k, Comparator<? super T> comparator) {
     return new TopKSelector<T>(Ordering.from(comparator).reverse(), k);
   }
 
@@ -103,14 +110,14 @@
    * for the top k elements. Whenever the buffer is filled, we quickselect the top k elements to the
    * range [0, k) and ignore the remaining elements.
    */
-  private final T[] buffer;
+  private final @Nullable T[] buffer;
   private int bufferSize;
 
   /**
    * The largest of the lowest k elements we've seen so far relative to this comparator. If
    * bufferSize ≥ k, then we can ignore any elements greater than this value.
    */
-  private @Nullable T threshold;
+  @CheckForNull private T threshold;
 
   private TopKSelector(Comparator<? super T> comparator, int k) {
     this.comparator = checkNotNull(comparator, "comparator");
@@ -126,7 +133,7 @@
    * Adds {@code elem} as a candidate for the top {@code k} elements. This operation takes amortized
    * O(1) time.
    */
-  public void offer(@Nullable T elem) {
+  public void offer(@ParametricNullness T elem) {
     if (k == 0) {
       return;
     } else if (bufferSize == 0) {
@@ -135,10 +142,12 @@
       bufferSize = 1;
     } else if (bufferSize < k) {
       buffer[bufferSize++] = elem;
-      if (comparator.compare(elem, threshold) > 0) {
+      // uncheckedCastNullableTToT is safe because bufferSize > 0.
+      if (comparator.compare(elem, uncheckedCastNullableTToT(threshold)) > 0) {
         threshold = elem;
       }
-    } else if (comparator.compare(elem, threshold) < 0) {
+      // uncheckedCastNullableTToT is safe because bufferSize > 0.
+    } else if (comparator.compare(elem, uncheckedCastNullableTToT(threshold)) < 0) {
       // Otherwise, we can ignore elem; we've seen k better elements.
       buffer[bufferSize++] = elem;
       if (bufferSize == 2 * k) {
@@ -177,15 +186,17 @@
       iterations++;
       if (iterations >= maxIterations) {
         // We've already taken O(k log k), let's make sure we don't take longer than O(k log k).
-        Arrays.sort(buffer, left, right, comparator);
+        Arrays.sort(buffer, left, right + 1, comparator);
         break;
       }
     }
     bufferSize = k;
 
-    threshold = buffer[minThresholdPosition];
+    threshold = uncheckedCastNullableTToT(buffer[minThresholdPosition]);
     for (int i = minThresholdPosition + 1; i < k; i++) {
-      if (comparator.compare(buffer[i], threshold) > 0) {
+      if (comparator.compare(
+              uncheckedCastNullableTToT(buffer[i]), uncheckedCastNullableTToT(threshold))
+          > 0) {
         threshold = buffer[i];
       }
     }
@@ -198,12 +209,12 @@
    * (pivotNewIndex, right] is greater than pivotValue.
    */
   private int partition(int left, int right, int pivotIndex) {
-    T pivotValue = buffer[pivotIndex];
+    T pivotValue = uncheckedCastNullableTToT(buffer[pivotIndex]);
     buffer[pivotIndex] = buffer[right];
 
     int pivotNewIndex = left;
     for (int i = left; i < right; i++) {
-      if (comparator.compare(buffer[i], pivotValue) < 0) {
+      if (comparator.compare(uncheckedCastNullableTToT(buffer[i]), pivotValue) < 0) {
         swap(pivotNewIndex, i);
         pivotNewIndex++;
       }
@@ -221,7 +232,7 @@
 
   TopKSelector<T> combine(TopKSelector<T> other) {
     for (int i = 0; i < other.bufferSize; i++) {
-      this.offer(other.buffer[i]);
+      this.offer(uncheckedCastNullableTToT(other.buffer[i]));
     }
     return this;
   }
diff --git a/guava/src/com/google/common/collect/TransformedIterator.java b/guava/src/com/google/common/collect/TransformedIterator.java
index b7214b8..2456cec 100644
--- a/guava/src/com/google/common/collect/TransformedIterator.java
+++ b/guava/src/com/google/common/collect/TransformedIterator.java
@@ -20,6 +20,7 @@
 
 import com.google.common.annotations.GwtCompatible;
 import java.util.Iterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An iterator that transforms a backing iterator; for internal use. This avoids the object overhead
@@ -28,14 +29,17 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class TransformedIterator<F, T> implements Iterator<T> {
+@ElementTypesAreNonnullByDefault
+abstract class TransformedIterator<F extends @Nullable Object, T extends @Nullable Object>
+    implements Iterator<T> {
   final Iterator<? extends F> backingIterator;
 
   TransformedIterator(Iterator<? extends F> backingIterator) {
     this.backingIterator = checkNotNull(backingIterator);
   }
 
-  abstract T transform(F from);
+  @ParametricNullness
+  abstract T transform(@ParametricNullness F from);
 
   @Override
   public final boolean hasNext() {
@@ -43,6 +47,7 @@
   }
 
   @Override
+  @ParametricNullness
   public final T next() {
     return transform(backingIterator.next());
   }
diff --git a/guava/src/com/google/common/collect/TransformedListIterator.java b/guava/src/com/google/common/collect/TransformedListIterator.java
index ac2eea1..66b42e4 100644
--- a/guava/src/com/google/common/collect/TransformedListIterator.java
+++ b/guava/src/com/google/common/collect/TransformedListIterator.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Function;
 import java.util.ListIterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An iterator that transforms a backing list iterator; for internal use. This avoids the object
@@ -27,8 +28,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-abstract class TransformedListIterator<F, T> extends TransformedIterator<F, T>
-    implements ListIterator<T> {
+@ElementTypesAreNonnullByDefault
+abstract class TransformedListIterator<F extends @Nullable Object, T extends @Nullable Object>
+    extends TransformedIterator<F, T> implements ListIterator<T> {
   TransformedListIterator(ListIterator<? extends F> backingIterator) {
     super(backingIterator);
   }
@@ -43,6 +45,7 @@
   }
 
   @Override
+  @ParametricNullness
   public final T previous() {
     return transform(backingIterator().previous());
   }
@@ -58,12 +61,12 @@
   }
 
   @Override
-  public void set(T element) {
+  public void set(@ParametricNullness T element) {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public void add(T element) {
+  public void add(@ParametricNullness T element) {
     throw new UnsupportedOperationException();
   }
 }
diff --git a/guava/src/com/google/common/collect/TreeBasedTable.java b/guava/src/com/google/common/collect/TreeBasedTable.java
index 510f75c..315404a 100644
--- a/guava/src/com/google/common/collect/TreeBasedTable.java
+++ b/guava/src/com/google/common/collect/TreeBasedTable.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Function;
@@ -31,7 +32,7 @@
 import java.util.SortedMap;
 import java.util.SortedSet;
 import java.util.TreeMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Implementation of {@code Table} whose row keys and column keys are ordered by their natural
@@ -66,6 +67,7 @@
  * @since 7.0
  */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 public class TreeBasedTable<R, C, V> extends StandardRowSortedTable<R, C, V> {
   private final Comparator<? super C> columnComparator;
 
@@ -135,7 +137,11 @@
    */
   @Deprecated
   public Comparator<? super R> rowComparator() {
-    return rowKeySet().comparator();
+    /*
+     * requireNonNull is safe because the factories require non-null Comparators, which they pass on
+     * to the backing collections.
+     */
+    return requireNonNull(rowKeySet().comparator());
   }
 
   /**
@@ -169,14 +175,14 @@
   }
 
   private class TreeRow extends Row implements SortedMap<C, V> {
-    final @Nullable C lowerBound;
-    final @Nullable C upperBound;
+    @CheckForNull final C lowerBound;
+    @CheckForNull final C upperBound;
 
     TreeRow(R rowKey) {
       this(rowKey, null, null);
     }
 
-    TreeRow(R rowKey, @Nullable C lowerBound, @Nullable C upperBound) {
+    TreeRow(R rowKey, @CheckForNull C lowerBound, @CheckForNull C upperBound) {
       super(rowKey);
       this.lowerBound = lowerBound;
       this.upperBound = upperBound;
@@ -201,7 +207,7 @@
       return cmp.compare(a, b);
     }
 
-    boolean rangeContains(@Nullable Object o) {
+    boolean rangeContains(@CheckForNull Object o) {
       return o != null
           && (lowerBound == null || compare(lowerBound, o) <= 0)
           && (upperBound == null || compare(upperBound, o) > 0);
@@ -227,43 +233,36 @@
 
     @Override
     public C firstKey() {
-      SortedMap<C, V> backing = backingRowMap();
-      if (backing == null) {
+      updateBackingRowMapField();
+      if (backingRowMap == null) {
         throw new NoSuchElementException();
       }
-      return backingRowMap().firstKey();
+      return ((SortedMap<C, V>) backingRowMap).firstKey();
     }
 
     @Override
     public C lastKey() {
-      SortedMap<C, V> backing = backingRowMap();
-      if (backing == null) {
+      updateBackingRowMapField();
+      if (backingRowMap == null) {
         throw new NoSuchElementException();
       }
-      return backingRowMap().lastKey();
+      return ((SortedMap<C, V>) backingRowMap).lastKey();
     }
 
-    transient @Nullable SortedMap<C, V> wholeRow;
+    @CheckForNull transient SortedMap<C, V> wholeRow;
 
-    /*
-     * If the row was previously empty, we check if there's a new row here every
-     * time we're queried.
-     */
-    SortedMap<C, V> wholeRow() {
+    // If the row was previously empty, we check if there's a new row here every time we're queried.
+    void updateWholeRowField() {
       if (wholeRow == null || (wholeRow.isEmpty() && backingMap.containsKey(rowKey))) {
         wholeRow = (SortedMap<C, V>) backingMap.get(rowKey);
       }
-      return wholeRow;
     }
 
     @Override
-    SortedMap<C, V> backingRowMap() {
-      return (SortedMap<C, V>) super.backingRowMap();
-    }
-
-    @Override
+    @CheckForNull
     SortedMap<C, V> computeBackingRowMap() {
-      SortedMap<C, V> map = wholeRow();
+      updateWholeRowField();
+      SortedMap<C, V> map = wholeRow;
       if (map != null) {
         if (lowerBound != null) {
           map = map.tailMap(lowerBound);
@@ -278,7 +277,8 @@
 
     @Override
     void maintainEmptyInvariant() {
-      if (wholeRow() != null && wholeRow.isEmpty()) {
+      updateWholeRowField();
+      if (wholeRow != null && wholeRow.isEmpty()) {
         backingMap.remove(rowKey);
         wholeRow = null;
         backingRowMap = null;
@@ -286,11 +286,12 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return rangeContains(key) && super.containsKey(key);
     }
 
     @Override
+    @CheckForNull
     public V put(C key, V value) {
       checkArgument(rangeContains(checkNotNull(key)));
       return super.put(key, value);
@@ -327,9 +328,10 @@
             comparator);
 
     return new AbstractIterator<C>() {
-      @Nullable C lastValue;
+      @CheckForNull C lastValue;
 
       @Override
+      @CheckForNull
       protected C computeNext() {
         while (merged.hasNext()) {
           C next = merged.next();
diff --git a/guava/src/com/google/common/collect/TreeMultimap.java b/guava/src/com/google/common/collect/TreeMultimap.java
index 82c97af..04ae207 100644
--- a/guava/src/com/google/common/collect/TreeMultimap.java
+++ b/guava/src/com/google/common/collect/TreeMultimap.java
@@ -72,7 +72,9 @@
  * @since 2.0
  */
 @GwtCompatible(serializable = true, emulated = true)
-public class TreeMultimap<K, V> extends AbstractSortedKeySortedSetMultimap<K, V> {
+@ElementTypesAreNonnullByDefault
+public class TreeMultimap<K extends @Nullable Object, V extends @Nullable Object>
+    extends AbstractSortedKeySortedSetMultimap<K, V> {
   private transient Comparator<? super K> keyComparator;
   private transient Comparator<? super V> valueComparator;
 
@@ -90,7 +92,7 @@
    * @param keyComparator the comparator that determines the key ordering
    * @param valueComparator the comparator that determines the value ordering
    */
-  public static <K, V> TreeMultimap<K, V> create(
+  public static <K extends @Nullable Object, V extends @Nullable Object> TreeMultimap<K, V> create(
       Comparator<? super K> keyComparator, Comparator<? super V> valueComparator) {
     return new TreeMultimap<>(checkNotNull(keyComparator), checkNotNull(valueComparator));
   }
@@ -138,7 +140,7 @@
   }
 
   @Override
-  Collection<V> createCollection(@Nullable K key) {
+  Collection<V> createCollection(@ParametricNullness K key) {
     if (key == null) {
       keyComparator().compare(key, key);
     }
@@ -163,7 +165,7 @@
   /** @since 14.0 (present with return type {@code SortedSet} since 2.0) */
   @Override
   @GwtIncompatible // NavigableSet
-  public NavigableSet<V> get(@Nullable K key) {
+  public NavigableSet<V> get(@ParametricNullness K key) {
     return (NavigableSet<V>) super.get(key);
   }
 
diff --git a/guava/src/com/google/common/collect/TreeMultiset.java b/guava/src/com/google/common/collect/TreeMultiset.java
index da3a63c..dcc3f68 100644
--- a/guava/src/com/google/common/collect/TreeMultiset.java
+++ b/guava/src/com/google/common/collect/TreeMultiset.java
@@ -20,7 +20,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.CollectPreconditions.checkNonnegative;
-import static com.google.common.collect.CollectPreconditions.checkRemove;
+import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
@@ -36,6 +37,7 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.function.ObjIntConsumer;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -57,7 +59,9 @@
  * @since 2.0
  */
 @GwtCompatible(emulated = true)
-public final class TreeMultiset<E> extends AbstractSortedMultiset<E> implements Serializable {
+@ElementTypesAreNonnullByDefault
+public final class TreeMultiset<E extends @Nullable Object> extends AbstractSortedMultiset<E>
+    implements Serializable {
 
   /**
    * Creates a new, empty multiset, sorted according to the elements' natural order. All elements
@@ -87,7 +91,8 @@
    *     indicates that the elements' <i>natural ordering</i> should be used.
    */
   @SuppressWarnings("unchecked")
-  public static <E> TreeMultiset<E> create(@Nullable Comparator<? super E> comparator) {
+  public static <E extends @Nullable Object> TreeMultiset<E> create(
+      @CheckForNull Comparator<? super E> comparator) {
     return (comparator == null)
         ? new TreeMultiset<E>((Comparator) Ordering.natural())
         : new TreeMultiset<E>(comparator);
@@ -122,7 +127,7 @@
   TreeMultiset(Comparator<? super E> comparator) {
     super(comparator);
     this.range = GeneralRange.all(comparator);
-    this.header = new AvlNode<E>(null, 1);
+    this.header = new AvlNode<>();
     successor(header, header);
     this.rootReference = new Reference<>();
   }
@@ -136,7 +141,7 @@
       }
 
       @Override
-      long treeAggregate(@Nullable AvlNode<?> root) {
+      long treeAggregate(@CheckForNull AvlNode<?> root) {
         return (root == null) ? 0 : root.totalCount;
       }
     },
@@ -147,14 +152,14 @@
       }
 
       @Override
-      long treeAggregate(@Nullable AvlNode<?> root) {
+      long treeAggregate(@CheckForNull AvlNode<?> root) {
         return (root == null) ? 0 : root.distinctElements;
       }
     };
 
     abstract int nodeAggregate(AvlNode<?> node);
 
-    abstract long treeAggregate(@Nullable AvlNode<?> root);
+    abstract long treeAggregate(@CheckForNull AvlNode<?> root);
   }
 
   private long aggregateForEntries(Aggregate aggr) {
@@ -169,11 +174,14 @@
     return total;
   }
 
-  private long aggregateBelowRange(Aggregate aggr, @Nullable AvlNode<E> node) {
+  private long aggregateBelowRange(Aggregate aggr, @CheckForNull AvlNode<E> node) {
     if (node == null) {
       return 0;
     }
-    int cmp = comparator().compare(range.getLowerEndpoint(), node.elem);
+    // The cast is safe because we call this method only if hasLowerBound().
+    int cmp =
+        comparator()
+            .compare(uncheckedCastNullableTToT(range.getLowerEndpoint()), node.getElement());
     if (cmp < 0) {
       return aggregateBelowRange(aggr, node.left);
     } else if (cmp == 0) {
@@ -192,11 +200,14 @@
     }
   }
 
-  private long aggregateAboveRange(Aggregate aggr, @Nullable AvlNode<E> node) {
+  private long aggregateAboveRange(Aggregate aggr, @CheckForNull AvlNode<E> node) {
     if (node == null) {
       return 0;
     }
-    int cmp = comparator().compare(range.getUpperEndpoint(), node.elem);
+    // The cast is safe because we call this method only if hasUpperBound().
+    int cmp =
+        comparator()
+            .compare(uncheckedCastNullableTToT(range.getUpperEndpoint()), node.getElement());
     if (cmp > 0) {
       return aggregateAboveRange(aggr, node.right);
     } else if (cmp == 0) {
@@ -225,12 +236,12 @@
     return Ints.saturatedCast(aggregateForEntries(Aggregate.DISTINCT));
   }
 
-  static int distinctElements(@Nullable AvlNode<?> node) {
+  static int distinctElements(@CheckForNull AvlNode<?> node) {
     return (node == null) ? 0 : node.distinctElements;
   }
 
   @Override
-  public int count(@Nullable Object element) {
+  public int count(@CheckForNull Object element) {
     try {
       @SuppressWarnings("unchecked")
       E e = (E) element;
@@ -246,7 +257,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public int add(@Nullable E element, int occurrences) {
+  public int add(@ParametricNullness E element, int occurrences) {
     checkNonnegative(occurrences, "occurrences");
     if (occurrences == 0) {
       return count(element);
@@ -268,7 +279,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public int remove(@Nullable Object element, int occurrences) {
+  public int remove(@CheckForNull Object element, int occurrences) {
     checkNonnegative(occurrences, "occurrences");
     if (occurrences == 0) {
       return count(element);
@@ -292,7 +303,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public int setCount(@Nullable E element, int count) {
+  public int setCount(@ParametricNullness E element, int count) {
     checkNonnegative(count, "count");
     if (!range.contains(element)) {
       checkArgument(count == 0);
@@ -314,7 +325,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public boolean setCount(@Nullable E element, int oldCount, int newCount) {
+  public boolean setCount(@ParametricNullness E element, int oldCount, int newCount) {
     checkNonnegative(newCount, "newCount");
     checkNonnegative(oldCount, "oldCount");
     checkArgument(range.contains(element));
@@ -340,8 +351,8 @@
   public void clear() {
     if (!range.hasLowerBound() && !range.hasUpperBound()) {
       // We can do this in O(n) rather than removing one by one, which could force rebalancing.
-      for (AvlNode<E> current = header.succ; current != header; ) {
-        AvlNode<E> next = current.succ;
+      for (AvlNode<E> current = header.succ(); current != header; ) {
+        AvlNode<E> next = current.succ();
 
         current.elemCount = 0;
         // Also clear these fields so that one deleted Entry doesn't retain all elements.
@@ -363,6 +374,7 @@
   private Entry<E> wrapEntry(final AvlNode<E> baseEntry) {
     return new Multisets.AbstractEntry<E>() {
       @Override
+      @ParametricNullness
       public E getElement() {
         return baseEntry.getElement();
       }
@@ -380,46 +392,50 @@
   }
 
   /** Returns the first node in the tree that is in range. */
-  private @Nullable AvlNode<E> firstNode() {
+  @CheckForNull
+  private AvlNode<E> firstNode() {
     AvlNode<E> root = rootReference.get();
     if (root == null) {
       return null;
     }
     AvlNode<E> node;
     if (range.hasLowerBound()) {
-      E endpoint = range.getLowerEndpoint();
-      node = rootReference.get().ceiling(comparator(), endpoint);
+      // The cast is safe because of the hasLowerBound check.
+      E endpoint = uncheckedCastNullableTToT(range.getLowerEndpoint());
+      node = root.ceiling(comparator(), endpoint);
       if (node == null) {
         return null;
       }
       if (range.getLowerBoundType() == BoundType.OPEN
           && comparator().compare(endpoint, node.getElement()) == 0) {
-        node = node.succ;
+        node = node.succ();
       }
     } else {
-      node = header.succ;
+      node = header.succ();
     }
     return (node == header || !range.contains(node.getElement())) ? null : node;
   }
 
-  private @Nullable AvlNode<E> lastNode() {
+  @CheckForNull
+  private AvlNode<E> lastNode() {
     AvlNode<E> root = rootReference.get();
     if (root == null) {
       return null;
     }
     AvlNode<E> node;
     if (range.hasUpperBound()) {
-      E endpoint = range.getUpperEndpoint();
-      node = rootReference.get().floor(comparator(), endpoint);
+      // The cast is safe because of the hasUpperBound check.
+      E endpoint = uncheckedCastNullableTToT(range.getUpperEndpoint());
+      node = root.floor(comparator(), endpoint);
       if (node == null) {
         return null;
       }
       if (range.getUpperBoundType() == BoundType.OPEN
           && comparator().compare(endpoint, node.getElement()) == 0) {
-        node = node.pred;
+        node = node.pred();
       }
     } else {
-      node = header.pred;
+      node = header.pred();
     }
     return (node == header || !range.contains(node.getElement())) ? null : node;
   }
@@ -432,8 +448,8 @@
   @Override
   Iterator<Entry<E>> entryIterator() {
     return new Iterator<Entry<E>>() {
-      AvlNode<E> current = firstNode();
-      @Nullable Entry<E> prevEntry;
+      @CheckForNull AvlNode<E> current = firstNode();
+      @CheckForNull Entry<E> prevEntry;
 
       @Override
       public boolean hasNext() {
@@ -452,19 +468,20 @@
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
-        Entry<E> result = wrapEntry(current);
+        // requireNonNull is safe because current is only nulled out after iteration is complete.
+        Entry<E> result = wrapEntry(requireNonNull(current));
         prevEntry = result;
-        if (current.succ == header) {
+        if (current.succ() == header) {
           current = null;
         } else {
-          current = current.succ;
+          current = current.succ();
         }
         return result;
       }
 
       @Override
       public void remove() {
-        checkRemove(prevEntry != null);
+        checkState(prevEntry != null, "no calls to next() since the last call to remove()");
         setCount(prevEntry.getElement(), 0);
         prevEntry = null;
       }
@@ -474,8 +491,8 @@
   @Override
   Iterator<Entry<E>> descendingEntryIterator() {
     return new Iterator<Entry<E>>() {
-      AvlNode<E> current = lastNode();
-      Entry<E> prevEntry = null;
+      @CheckForNull AvlNode<E> current = lastNode();
+      @CheckForNull Entry<E> prevEntry = null;
 
       @Override
       public boolean hasNext() {
@@ -494,19 +511,21 @@
         if (!hasNext()) {
           throw new NoSuchElementException();
         }
+        // requireNonNull is safe because current is only nulled out after iteration is complete.
+        requireNonNull(current);
         Entry<E> result = wrapEntry(current);
         prevEntry = result;
-        if (current.pred == header) {
+        if (current.pred() == header) {
           current = null;
         } else {
-          current = current.pred;
+          current = current.pred();
         }
         return result;
       }
 
       @Override
       public void remove() {
-        checkRemove(prevEntry != null);
+        checkState(prevEntry != null, "no calls to next() since the last call to remove()");
         setCount(prevEntry.getElement(), 0);
         prevEntry = null;
       }
@@ -518,7 +537,7 @@
     checkNotNull(action);
     for (AvlNode<E> node = firstNode();
         node != header && node != null && !range.tooHigh(node.getElement());
-        node = node.succ) {
+        node = node.succ()) {
       action.accept(node.getElement(), node.getCount());
     }
   }
@@ -529,7 +548,7 @@
   }
 
   @Override
-  public SortedMultiset<E> headMultiset(@Nullable E upperBound, BoundType boundType) {
+  public SortedMultiset<E> headMultiset(@ParametricNullness E upperBound, BoundType boundType) {
     return new TreeMultiset<E>(
         rootReference,
         range.intersect(GeneralRange.upTo(comparator(), upperBound, boundType)),
@@ -537,7 +556,7 @@
   }
 
   @Override
-  public SortedMultiset<E> tailMultiset(@Nullable E lowerBound, BoundType boundType) {
+  public SortedMultiset<E> tailMultiset(@ParametricNullness E lowerBound, BoundType boundType) {
     return new TreeMultiset<E>(
         rootReference,
         range.intersect(GeneralRange.downTo(comparator(), lowerBound, boundType)),
@@ -545,13 +564,14 @@
   }
 
   private static final class Reference<T> {
-    private @Nullable T value;
+    @CheckForNull private T value;
 
-    public @Nullable T get() {
+    @CheckForNull
+    public T get() {
       return value;
     }
 
-    public void checkAndSet(@Nullable T expected, T newValue) {
+    public void checkAndSet(@CheckForNull T expected, @CheckForNull T newValue) {
       if (value != expected) {
         throw new ConcurrentModificationException();
       }
@@ -563,8 +583,18 @@
     }
   }
 
-  private static final class AvlNode<E> {
-    private final @Nullable E elem;
+  private static final class AvlNode<E extends @Nullable Object> {
+    /*
+     * For "normal" nodes, the type of this field is `E`, not `@Nullable E` (though note that E is a
+     * type that can include null, as in a TreeMultiset<@Nullable String>).
+     *
+     * For the header node, though, this field contains `null`, regardless of the type of the
+     * multiset.
+     *
+     * Most code that operates on an AvlNode never operates on the header node. Such code can access
+     * the elem field without a null check by calling getElement().
+     */
+    @CheckForNull private final E elem;
 
     // elemCount is 0 iff this node has been deleted.
     private int elemCount;
@@ -572,12 +602,23 @@
     private int distinctElements;
     private long totalCount;
     private int height;
-    private @Nullable AvlNode<E> left;
-    private @Nullable AvlNode<E> right;
-    private @Nullable AvlNode<E> pred;
-    private @Nullable AvlNode<E> succ;
+    @CheckForNull private AvlNode<E> left;
+    @CheckForNull private AvlNode<E> right;
+    /*
+     * pred and succ are nullable after construction, but we always call successor() to initialize
+     * them immediately thereafter.
+     *
+     * They may be subsequently nulled out by TreeMultiset.clear(). I think that the only place that
+     * we can reference a node whose fields have been cleared is inside the iterator (and presumably
+     * only under concurrent modification).
+     *
+     * To access these fields when you know that they are not null, call the pred() and succ()
+     * methods, which perform null checks before returning the fields.
+     */
+    @CheckForNull private AvlNode<E> pred;
+    @CheckForNull private AvlNode<E> succ;
 
-    AvlNode(@Nullable E elem, int elemCount) {
+    AvlNode(@ParametricNullness E elem, int elemCount) {
       checkArgument(elemCount > 0);
       this.elem = elem;
       this.elemCount = elemCount;
@@ -588,8 +629,24 @@
       this.right = null;
     }
 
-    public int count(Comparator<? super E> comparator, E e) {
-      int cmp = comparator.compare(e, elem);
+    /** Constructor for the header node. */
+    AvlNode() {
+      this.elem = null;
+      this.elemCount = 1;
+    }
+
+    // For discussion of pred() and succ(), see the comment on the pred and succ fields.
+
+    private AvlNode<E> pred() {
+      return requireNonNull(pred);
+    }
+
+    private AvlNode<E> succ() {
+      return requireNonNull(succ);
+    }
+
+    int count(Comparator<? super E> comparator, @ParametricNullness E e) {
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         return (left == null) ? 0 : left.count(comparator, e);
       } else if (cmp > 0) {
@@ -599,30 +656,31 @@
       }
     }
 
-    private AvlNode<E> addRightChild(E e, int count) {
+    private AvlNode<E> addRightChild(@ParametricNullness E e, int count) {
       right = new AvlNode<E>(e, count);
-      successor(this, right, succ);
+      successor(this, right, succ());
       height = Math.max(2, height);
       distinctElements++;
       totalCount += count;
       return this;
     }
 
-    private AvlNode<E> addLeftChild(E e, int count) {
+    private AvlNode<E> addLeftChild(@ParametricNullness E e, int count) {
       left = new AvlNode<E>(e, count);
-      successor(pred, left, this);
+      successor(pred(), left, this);
       height = Math.max(2, height);
       distinctElements++;
       totalCount += count;
       return this;
     }
 
-    AvlNode<E> add(Comparator<? super E> comparator, @Nullable E e, int count, int[] result) {
+    AvlNode<E> add(
+        Comparator<? super E> comparator, @ParametricNullness E e, int count, int[] result) {
       /*
        * It speeds things up considerably to unconditionally add count to totalCount here,
        * but that destroys failure atomicity in the case of count overflow. =(
        */
-      int cmp = comparator.compare(e, elem);
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         AvlNode<E> initLeft = left;
         if (initLeft == null) {
@@ -662,8 +720,10 @@
       return this;
     }
 
-    AvlNode<E> remove(Comparator<? super E> comparator, @Nullable E e, int count, int[] result) {
-      int cmp = comparator.compare(e, elem);
+    @CheckForNull
+    AvlNode<E> remove(
+        Comparator<? super E> comparator, @ParametricNullness E e, int count, int[] result) {
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         AvlNode<E> initLeft = left;
         if (initLeft == null) {
@@ -713,8 +773,10 @@
       }
     }
 
-    AvlNode<E> setCount(Comparator<? super E> comparator, @Nullable E e, int count, int[] result) {
-      int cmp = comparator.compare(e, elem);
+    @CheckForNull
+    AvlNode<E> setCount(
+        Comparator<? super E> comparator, @ParametricNullness E e, int count, int[] result) {
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         AvlNode<E> initLeft = left;
         if (initLeft == null) {
@@ -761,13 +823,14 @@
       return this;
     }
 
+    @CheckForNull
     AvlNode<E> setCount(
         Comparator<? super E> comparator,
-        @Nullable E e,
+        @ParametricNullness E e,
         int expectedCount,
         int newCount,
         int[] result) {
-      int cmp = comparator.compare(e, elem);
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         AvlNode<E> initLeft = left;
         if (initLeft == null) {
@@ -824,16 +887,17 @@
       return this;
     }
 
+    @CheckForNull
     private AvlNode<E> deleteMe() {
       int oldElemCount = this.elemCount;
       this.elemCount = 0;
-      successor(pred, succ);
+      successor(pred(), succ());
       if (left == null) {
         return right;
       } else if (right == null) {
         return left;
       } else if (left.height >= right.height) {
-        AvlNode<E> newTop = pred;
+        AvlNode<E> newTop = pred();
         // newTop is the maximum node in my left subtree
         newTop.left = left.removeMax(newTop);
         newTop.right = right;
@@ -841,7 +905,7 @@
         newTop.totalCount = totalCount - oldElemCount;
         return newTop.rebalance();
       } else {
-        AvlNode<E> newTop = succ;
+        AvlNode<E> newTop = succ();
         newTop.right = right.removeMin(newTop);
         newTop.left = left;
         newTop.distinctElements = distinctElements - 1;
@@ -851,6 +915,7 @@
     }
 
     // Removes the minimum node from this subtree to be reused elsewhere
+    @CheckForNull
     private AvlNode<E> removeMin(AvlNode<E> node) {
       if (left == null) {
         return right;
@@ -863,6 +928,7 @@
     }
 
     // Removes the maximum node from this subtree to be reused elsewhere
+    @CheckForNull
     private AvlNode<E> removeMax(AvlNode<E> node) {
       if (right == null) {
         return left;
@@ -892,11 +958,15 @@
     private AvlNode<E> rebalance() {
       switch (balanceFactor()) {
         case -2:
+          // requireNonNull is safe because right must exist in order to get a negative factor.
+          requireNonNull(right);
           if (right.balanceFactor() > 0) {
             right = right.rotateRight();
           }
           return rotateLeft();
         case 2:
+          // requireNonNull is safe because left must exist in order to get a positive factor.
+          requireNonNull(left);
           if (left.balanceFactor() < 0) {
             left = left.rotateLeft();
           }
@@ -935,16 +1005,17 @@
       return newTop;
     }
 
-    private static long totalCount(@Nullable AvlNode<?> node) {
+    private static long totalCount(@CheckForNull AvlNode<?> node) {
       return (node == null) ? 0 : node.totalCount;
     }
 
-    private static int height(@Nullable AvlNode<?> node) {
+    private static int height(@CheckForNull AvlNode<?> node) {
       return (node == null) ? 0 : node.height;
     }
 
-    private @Nullable AvlNode<E> ceiling(Comparator<? super E> comparator, E e) {
-      int cmp = comparator.compare(e, elem);
+    @CheckForNull
+    private AvlNode<E> ceiling(Comparator<? super E> comparator, @ParametricNullness E e) {
+      int cmp = comparator.compare(e, getElement());
       if (cmp < 0) {
         return (left == null) ? this : MoreObjects.firstNonNull(left.ceiling(comparator, e), this);
       } else if (cmp == 0) {
@@ -954,8 +1025,9 @@
       }
     }
 
-    private @Nullable AvlNode<E> floor(Comparator<? super E> comparator, E e) {
-      int cmp = comparator.compare(e, elem);
+    @CheckForNull
+    private AvlNode<E> floor(Comparator<? super E> comparator, @ParametricNullness E e) {
+      int cmp = comparator.compare(e, getElement());
       if (cmp > 0) {
         return (right == null) ? this : MoreObjects.firstNonNull(right.floor(comparator, e), this);
       } else if (cmp == 0) {
@@ -965,8 +1037,10 @@
       }
     }
 
+    @ParametricNullness
     E getElement() {
-      return elem;
+      // For discussion of this cast, see the comment on the elem field.
+      return uncheckedCastNullableTToT(elem);
     }
 
     int getCount() {
@@ -979,12 +1053,13 @@
     }
   }
 
-  private static <T> void successor(AvlNode<T> a, AvlNode<T> b) {
+  private static <T extends @Nullable Object> void successor(AvlNode<T> a, AvlNode<T> b) {
     a.succ = b;
     b.pred = a;
   }
 
-  private static <T> void successor(AvlNode<T> a, AvlNode<T> b, AvlNode<T> c) {
+  private static <T extends @Nullable Object> void successor(
+      AvlNode<T> a, AvlNode<T> b, AvlNode<T> c) {
     successor(a, b);
     successor(b, c);
   }
@@ -1017,7 +1092,7 @@
         .set(this, GeneralRange.all(comparator));
     Serialization.getFieldSetter(TreeMultiset.class, "rootReference")
         .set(this, new Reference<AvlNode<E>>());
-    AvlNode<E> header = new AvlNode<E>(null, 1);
+    AvlNode<E> header = new AvlNode<>();
     Serialization.getFieldSetter(TreeMultiset.class, "header").set(this, header);
     successor(header, header);
     Serialization.populateMultiset(this, stream);
diff --git a/guava/src/com/google/common/collect/TreeRangeMap.java b/guava/src/com/google/common/collect/TreeRangeMap.java
index 69491d4..a920089 100644
--- a/guava/src/com/google/common/collect/TreeRangeMap.java
+++ b/guava/src/com/google/common/collect/TreeRangeMap.java
@@ -21,6 +21,7 @@
 import static com.google.common.base.Predicates.compose;
 import static com.google.common.base.Predicates.in;
 import static com.google.common.base.Predicates.not;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -38,6 +39,7 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.function.BiFunction;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -51,6 +53,7 @@
  */
 @Beta
 @GwtIncompatible // NavigableMap
+@ElementTypesAreNonnullByDefault
 public final class TreeRangeMap<K extends Comparable, V> implements RangeMap<K, V> {
 
   private final NavigableMap<Cut<K>, RangeMapEntry<K, V>> entriesByLowerBound;
@@ -101,13 +104,15 @@
   }
 
   @Override
-  public @Nullable V get(K key) {
+  @CheckForNull
+  public V get(K key) {
     Entry<Range<K>, V> entry = getEntry(key);
     return (entry == null) ? null : entry.getValue();
   }
 
   @Override
-  public @Nullable Entry<Range<K>, V> getEntry(K key) {
+  @CheckForNull
+  public Entry<Range<K>, V> getEntry(K key) {
     Entry<Cut<K>, RangeMapEntry<K, V>> mapEntry =
         entriesByLowerBound.floorEntry(Cut.belowValue(key));
     if (mapEntry != null && mapEntry.getValue().contains(key)) {
@@ -154,7 +159,7 @@
 
   /** Returns the range that spans the given range and entry, if the entry can be coalesced. */
   private static <K extends Comparable, V> Range<K> coalesce(
-      Range<K> range, V value, @Nullable Entry<Cut<K>, RangeMapEntry<K, V>> entry) {
+      Range<K> range, V value, @CheckForNull Entry<Cut<K>, RangeMapEntry<K, V>> entry) {
     if (entry != null
         && entry.getValue().getKey().isConnected(range)
         && entry.getValue().getValue().equals(value)) {
@@ -179,7 +184,8 @@
   public Range<K> span() {
     Entry<Cut<K>, RangeMapEntry<K, V>> firstEntry = entriesByLowerBound.firstEntry();
     Entry<Cut<K>, RangeMapEntry<K, V>> lastEntry = entriesByLowerBound.lastEntry();
-    if (firstEntry == null) {
+    // Either both are null or neither is, but we check both to satisfy the nullness checker.
+    if (firstEntry == null || lastEntry == null) {
       throw new NoSuchElementException();
     }
     return Range.create(
@@ -262,8 +268,8 @@
   @Override
   public void merge(
       Range<K> range,
-      @Nullable V value,
-      BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
+      @CheckForNull V value,
+      BiFunction<? super V, ? super @Nullable V, ? extends @Nullable V> remappingFunction) {
     checkNotNull(range);
     checkNotNull(remappingFunction);
 
@@ -334,12 +340,13 @@
     }
 
     @Override
-    public boolean containsKey(@Nullable Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return get(key) != null;
     }
 
     @Override
-    public V get(@Nullable Object key) {
+    @CheckForNull
+    public V get(@CheckForNull Object key) {
       if (key instanceof Range) {
         Range<?> range = (Range<?>) key;
         RangeMapEntry<K, V> rangeMapEntry = entriesByLowerBound.get(range.lowerBound);
@@ -372,42 +379,45 @@
 
   @SuppressWarnings("unchecked")
   private RangeMap<K, V> emptySubRangeMap() {
-    return EMPTY_SUB_RANGE_MAP;
+    return (RangeMap<K, V>) (RangeMap<?, ?>) EMPTY_SUB_RANGE_MAP;
   }
 
-  private static final RangeMap EMPTY_SUB_RANGE_MAP =
-      new RangeMap() {
+  @SuppressWarnings("ConstantCaseForConstants") // This RangeMap is immutable.
+  private static final RangeMap<Comparable<?>, Object> EMPTY_SUB_RANGE_MAP =
+      new RangeMap<Comparable<?>, Object>() {
         @Override
-        public @Nullable Object get(Comparable key) {
+        @CheckForNull
+        public Object get(Comparable<?> key) {
           return null;
         }
 
         @Override
-        public @Nullable Entry<Range, Object> getEntry(Comparable key) {
+        @CheckForNull
+        public Entry<Range<Comparable<?>>, Object> getEntry(Comparable<?> key) {
           return null;
         }
 
         @Override
-        public Range span() {
+        public Range<Comparable<?>> span() {
           throw new NoSuchElementException();
         }
 
         @Override
-        public void put(Range range, Object value) {
+        public void put(Range<Comparable<?>> range, Object value) {
           checkNotNull(range);
           throw new IllegalArgumentException(
               "Cannot insert range " + range + " into an empty subRangeMap");
         }
 
         @Override
-        public void putCoalescing(Range range, Object value) {
+        public void putCoalescing(Range<Comparable<?>> range, Object value) {
           checkNotNull(range);
           throw new IllegalArgumentException(
               "Cannot insert range " + range + " into an empty subRangeMap");
         }
 
         @Override
-        public void putAll(RangeMap rangeMap) {
+        public void putAll(RangeMap<Comparable<?>, Object> rangeMap) {
           if (!rangeMap.asMapOfRanges().isEmpty()) {
             throw new IllegalArgumentException(
                 "Cannot putAll(nonEmptyRangeMap) into an empty subRangeMap");
@@ -418,30 +428,32 @@
         public void clear() {}
 
         @Override
-        public void remove(Range range) {
+        public void remove(Range<Comparable<?>> range) {
           checkNotNull(range);
         }
 
         @Override
-        @SuppressWarnings("rawtypes") // necessary for static EMPTY_SUB_RANGE_MAP instance
-        public void merge(Range range, @Nullable Object value, BiFunction remappingFunction) {
+        public void merge(
+            Range<Comparable<?>> range,
+            @CheckForNull Object value,
+            BiFunction<? super Object, ? super Object, ? extends Object> remappingFunction) {
           checkNotNull(range);
           throw new IllegalArgumentException(
               "Cannot merge range " + range + " into an empty subRangeMap");
         }
 
         @Override
-        public Map<Range, Object> asMapOfRanges() {
+        public Map<Range<Comparable<?>>, Object> asMapOfRanges() {
           return Collections.emptyMap();
         }
 
         @Override
-        public Map<Range, Object> asDescendingMapOfRanges() {
+        public Map<Range<Comparable<?>>, Object> asDescendingMapOfRanges() {
           return Collections.emptyMap();
         }
 
         @Override
-        public RangeMap subRangeMap(Range range) {
+        public RangeMap<Comparable<?>, Object> subRangeMap(Range<Comparable<?>> range) {
           checkNotNull(range);
           return this;
         }
@@ -456,12 +468,14 @@
     }
 
     @Override
-    public @Nullable V get(K key) {
+    @CheckForNull
+    public V get(K key) {
       return subRange.contains(key) ? TreeRangeMap.this.get(key) : null;
     }
 
     @Override
-    public @Nullable Entry<Range<K>, V> getEntry(K key) {
+    @CheckForNull
+    public Entry<Range<K>, V> getEntry(K key) {
       if (subRange.contains(key)) {
         Entry<Range<K>, V> entry = TreeRangeMap.this.getEntry(key);
         if (entry != null) {
@@ -547,8 +561,8 @@
     @Override
     public void merge(
         Range<K> range,
-        @Nullable V value,
-        BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
+        @CheckForNull V value,
+        BiFunction<? super V, ? super @Nullable V, ? extends @Nullable V> remappingFunction) {
       checkArgument(
           subRange.encloses(range),
           "Cannot merge range %s into a subRangeMap(%s)",
@@ -589,6 +603,7 @@
           return new AbstractIterator<Entry<Range<K>, V>>() {
 
             @Override
+            @CheckForNull
             protected Entry<Range<K>, V> computeNext() {
               if (backingItr.hasNext()) {
                 RangeMapEntry<K, V> entry = backingItr.next();
@@ -605,7 +620,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof RangeMap) {
         RangeMap<?, ?> rangeMap = (RangeMap<?, ?>) o;
         return asMapOfRanges().equals(rangeMap.asMapOfRanges());
@@ -626,12 +641,13 @@
     class SubRangeMapAsMap extends AbstractMap<Range<K>, V> {
 
       @Override
-      public boolean containsKey(Object key) {
+      public boolean containsKey(@CheckForNull Object key) {
         return get(key) != null;
       }
 
       @Override
-      public V get(Object key) {
+      @CheckForNull
+      public V get(@CheckForNull Object key) {
         try {
           if (key instanceof Range) {
             @SuppressWarnings("unchecked") // we catch ClassCastExceptions
@@ -664,11 +680,13 @@
       }
 
       @Override
-      public V remove(Object key) {
+      @CheckForNull
+      public V remove(@CheckForNull Object key) {
         V value = get(key);
         if (value != null) {
-          @SuppressWarnings("unchecked") // it's definitely in the map, so safe
-          Range<K> range = (Range<K>) key;
+          // it's definitely in the map, so the cast and requireNonNull are safe
+          @SuppressWarnings("unchecked")
+          Range<K> range = (Range<K>) requireNonNull(key);
           TreeRangeMap.this.remove(range);
           return value;
         }
@@ -697,7 +715,7 @@
       public Set<Range<K>> keySet() {
         return new Maps.KeySet<Range<K>, V>(SubRangeMapAsMap.this) {
           @Override
-          public boolean remove(@Nullable Object o) {
+          public boolean remove(@CheckForNull Object o) {
             return SubRangeMapAsMap.this.remove(o) != null;
           }
 
@@ -750,6 +768,7 @@
         return new AbstractIterator<Entry<Range<K>, V>>() {
 
           @Override
+          @CheckForNull
           protected Entry<Range<K>, V> computeNext() {
             while (backingItr.hasNext()) {
               RangeMapEntry<K, V> entry = backingItr.next();
@@ -783,7 +802,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object o) {
+  public boolean equals(@CheckForNull Object o) {
     if (o instanceof RangeMap) {
       RangeMap<?, ?> rangeMap = (RangeMap<?, ?>) o;
       return asMapOfRanges().equals(rangeMap.asMapOfRanges());
diff --git a/guava/src/com/google/common/collect/TreeRangeSet.java b/guava/src/com/google/common/collect/TreeRangeSet.java
index 58cdac1..8308880 100644
--- a/guava/src/com/google/common/collect/TreeRangeSet.java
+++ b/guava/src/com/google/common/collect/TreeRangeSet.java
@@ -30,7 +30,7 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.TreeMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link RangeSet} backed by a {@link TreeMap}.
@@ -40,6 +40,7 @@
  */
 @Beta
 @GwtIncompatible // uses NavigableMap
+@ElementTypesAreNonnullByDefault
 public class TreeRangeSet<C extends Comparable<?>> extends AbstractRangeSet<C>
     implements Serializable {
 
@@ -76,8 +77,8 @@
     this.rangesByLowerBound = rangesByLowerCut;
   }
 
-  private transient @Nullable Set<Range<C>> asRanges;
-  private transient @Nullable Set<Range<C>> asDescendingSetOfRanges;
+  @CheckForNull private transient Set<Range<C>> asRanges;
+  @CheckForNull private transient Set<Range<C>> asDescendingSetOfRanges;
 
   @Override
   public Set<Range<C>> asRanges() {
@@ -112,13 +113,14 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object o) {
+    public boolean equals(@CheckForNull Object o) {
       return Sets.equalsImpl(this, o);
     }
   }
 
   @Override
-  public @Nullable Range<C> rangeContaining(C value) {
+  @CheckForNull
+  public Range<C> rangeContaining(C value) {
     checkNotNull(value);
     Entry<Cut<C>, Range<C>> floorEntry = rangesByLowerBound.floorEntry(Cut.belowValue(value));
     if (floorEntry != null && floorEntry.getValue().contains(value)) {
@@ -151,7 +153,8 @@
     return floorEntry != null && floorEntry.getValue().encloses(range);
   }
 
-  private @Nullable Range<C> rangeEnclosing(Range<C> range) {
+  @CheckForNull
+  private Range<C> rangeEnclosing(Range<C> range) {
     checkNotNull(range);
     Entry<Cut<C>, Range<C>> floorEntry = rangesByLowerBound.floorEntry(range.lowerBound);
     return (floorEntry != null && floorEntry.getValue().encloses(range))
@@ -163,7 +166,11 @@
   public Range<C> span() {
     Entry<Cut<C>, Range<C>> firstEntry = rangesByLowerBound.firstEntry();
     Entry<Cut<C>, Range<C>> lastEntry = rangesByLowerBound.lastEntry();
-    if (firstEntry == null) {
+    if (firstEntry == null || lastEntry == null) {
+      /*
+       * Either both are null or neither is: Either the set is empty, or it's not. But we check both
+       * to make the nullness checker happy.
+       */
       throw new NoSuchElementException();
     }
     return Range.create(firstEntry.getValue().lowerBound, lastEntry.getValue().upperBound);
@@ -267,7 +274,7 @@
     }
   }
 
-  private transient @Nullable RangeSet<C> complement;
+  @CheckForNull private transient RangeSet<C> complement;
 
   @Override
   public RangeSet<C> complement() {
@@ -330,12 +337,13 @@
     }
 
     @Override
-    public boolean containsKey(@Nullable Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return get(key) != null;
     }
 
     @Override
-    public Range<C> get(@Nullable Object key) {
+    @CheckForNull
+    public Range<C> get(@CheckForNull Object key) {
       if (key instanceof Cut) {
         try {
           @SuppressWarnings("unchecked") // we catch CCEs
@@ -380,6 +388,7 @@
       }
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (!backingItr.hasNext()) {
             return endOfData();
@@ -413,6 +422,7 @@
       }
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (!backingItr.hasNext()) {
             return endOfData();
@@ -534,6 +544,7 @@
         Cut<C> nextComplementRangeLowerBound = firstComplementRangeLowerBound;
 
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (complementLowerBoundWindow.upperBound.isLessThan(nextComplementRangeLowerBound)
               || nextComplementRangeLowerBound == Cut.<C>aboveAll()) {
@@ -595,6 +606,7 @@
         Cut<C> nextComplementRangeUpperBound = firstComplementRangeUpperBound;
 
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (nextComplementRangeUpperBound == Cut.<C>belowAll()) {
             return endOfData();
@@ -622,7 +634,8 @@
     }
 
     @Override
-    public @Nullable Range<C> get(Object key) {
+    @CheckForNull
+    public Range<C> get(@CheckForNull Object key) {
       if (key instanceof Cut) {
         try {
           @SuppressWarnings("unchecked")
@@ -640,7 +653,7 @@
     }
 
     @Override
-    public boolean containsKey(Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return get(key) != null;
     }
   }
@@ -734,12 +747,13 @@
     }
 
     @Override
-    public boolean containsKey(@Nullable Object key) {
+    public boolean containsKey(@CheckForNull Object key) {
       return get(key) != null;
     }
 
     @Override
-    public @Nullable Range<C> get(@Nullable Object key) {
+    @CheckForNull
+    public Range<C> get(@CheckForNull Object key) {
       if (key instanceof Cut) {
         try {
           @SuppressWarnings("unchecked") // we catch CCE's
@@ -794,6 +808,7 @@
               .min(lowerBoundWindow.upperBound, Cut.belowValue(restriction.upperBound));
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (!completeRangeItr.hasNext()) {
             return endOfData();
@@ -827,6 +842,7 @@
               .iterator();
       return new AbstractIterator<Entry<Cut<C>, Range<C>>>() {
         @Override
+        @CheckForNull
         protected Entry<Cut<C>, Range<C>> computeNext() {
           if (!completeRangeItr.hasNext()) {
             return endOfData();
@@ -876,7 +892,8 @@
     }
 
     @Override
-    public @Nullable Range<C> rangeContaining(C value) {
+    @CheckForNull
+    public Range<C> rangeContaining(C value) {
       if (!restriction.contains(value)) {
         return null;
       }
diff --git a/guava/src/com/google/common/collect/TreeTraverser.java b/guava/src/com/google/common/collect/TreeTraverser.java
index 9109252..b5d2a42 100644
--- a/guava/src/com/google/common/collect/TreeTraverser.java
+++ b/guava/src/com/google/common/collect/TreeTraverser.java
@@ -26,6 +26,7 @@
 import java.util.Iterator;
 import java.util.Queue;
 import java.util.function.Consumer;
+import javax.annotation.CheckForNull;
 
 /**
  * Views elements of a type {@code T} as nodes in a tree, and provides methods to traverse the trees
@@ -74,6 +75,7 @@
 @Deprecated
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class TreeTraverser<T> {
 
   /**
@@ -222,6 +224,7 @@
     }
 
     @Override
+    @CheckForNull
     protected T computeNext() {
       while (!stack.isEmpty()) {
         PostOrderNode<T> top = stack.getLast();
diff --git a/guava/src/com/google/common/collect/UnmodifiableIterator.java b/guava/src/com/google/common/collect/UnmodifiableIterator.java
index f0f76b2..03e52aa 100644
--- a/guava/src/com/google/common/collect/UnmodifiableIterator.java
+++ b/guava/src/com/google/common/collect/UnmodifiableIterator.java
@@ -17,7 +17,9 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.Iterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An iterator that does not support {@link #remove}.
@@ -30,7 +32,8 @@
  * @since 2.0
  */
 @GwtCompatible
-public abstract class UnmodifiableIterator<E> implements Iterator<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class UnmodifiableIterator<E extends @Nullable Object> implements Iterator<E> {
   /** Constructor for use by subclasses. */
   protected UnmodifiableIterator() {}
 
@@ -42,6 +45,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public final void remove() {
     throw new UnsupportedOperationException();
   }
diff --git a/guava/src/com/google/common/collect/UnmodifiableListIterator.java b/guava/src/com/google/common/collect/UnmodifiableListIterator.java
index ec4219c..f3d3b92 100644
--- a/guava/src/com/google/common/collect/UnmodifiableListIterator.java
+++ b/guava/src/com/google/common/collect/UnmodifiableListIterator.java
@@ -17,7 +17,9 @@
 package com.google.common.collect;
 
 import com.google.common.annotations.GwtCompatible;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.ListIterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A list iterator that does not support {@link #remove}, {@link #add}, or {@link #set}.
@@ -26,8 +28,9 @@
  * @author Louis Wasserman
  */
 @GwtCompatible
-public abstract class UnmodifiableListIterator<E> extends UnmodifiableIterator<E>
-    implements ListIterator<E> {
+@ElementTypesAreNonnullByDefault
+public abstract class UnmodifiableListIterator<E extends @Nullable Object>
+    extends UnmodifiableIterator<E> implements ListIterator<E> {
   /** Constructor for use by subclasses. */
   protected UnmodifiableListIterator() {}
 
@@ -39,7 +42,8 @@
    */
   @Deprecated
   @Override
-  public final void add(E e) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void add(@ParametricNullness E e) {
     throw new UnsupportedOperationException();
   }
 
@@ -51,7 +55,8 @@
    */
   @Deprecated
   @Override
-  public final void set(E e) {
+  @DoNotCall("Always throws UnsupportedOperationException")
+  public final void set(@ParametricNullness E e) {
     throw new UnsupportedOperationException();
   }
 }
diff --git a/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java b/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
index d7a20cc..59bd2ce 100644
--- a/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
+++ b/guava/src/com/google/common/collect/UnmodifiableSortedMultiset.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.Multisets.UnmodifiableMultiset;
 import java.util.Comparator;
 import java.util.NavigableSet;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -30,7 +31,8 @@
  * @author Louis Wasserman
  */
 @GwtCompatible(emulated = true)
-final class UnmodifiableSortedMultiset<E> extends UnmodifiableMultiset<E>
+@ElementTypesAreNonnullByDefault
+final class UnmodifiableSortedMultiset<E extends @Nullable Object> extends UnmodifiableMultiset<E>
     implements SortedMultiset<E> {
   UnmodifiableSortedMultiset(SortedMultiset<E> delegate) {
     super(delegate);
@@ -56,7 +58,7 @@
     return (NavigableSet<E>) super.elementSet();
   }
 
-  private transient @Nullable UnmodifiableSortedMultiset<E> descendingMultiset;
+  @CheckForNull private transient UnmodifiableSortedMultiset<E> descendingMultiset;
 
   @Override
   public SortedMultiset<E> descendingMultiset() {
@@ -70,39 +72,46 @@
   }
 
   @Override
+  @CheckForNull
   public Entry<E> firstEntry() {
     return delegate().firstEntry();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> lastEntry() {
     return delegate().lastEntry();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollFirstEntry() {
     throw new UnsupportedOperationException();
   }
 
   @Override
+  @CheckForNull
   public Entry<E> pollLastEntry() {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public SortedMultiset<E> headMultiset(E upperBound, BoundType boundType) {
+  public SortedMultiset<E> headMultiset(@ParametricNullness E upperBound, BoundType boundType) {
     return Multisets.unmodifiableSortedMultiset(delegate().headMultiset(upperBound, boundType));
   }
 
   @Override
   public SortedMultiset<E> subMultiset(
-      E lowerBound, BoundType lowerBoundType, E upperBound, BoundType upperBoundType) {
+      @ParametricNullness E lowerBound,
+      BoundType lowerBoundType,
+      @ParametricNullness E upperBound,
+      BoundType upperBoundType) {
     return Multisets.unmodifiableSortedMultiset(
         delegate().subMultiset(lowerBound, lowerBoundType, upperBound, upperBoundType));
   }
 
   @Override
-  public SortedMultiset<E> tailMultiset(E lowerBound, BoundType boundType) {
+  public SortedMultiset<E> tailMultiset(@ParametricNullness E lowerBound, BoundType boundType) {
     return Multisets.unmodifiableSortedMultiset(delegate().tailMultiset(lowerBound, boundType));
   }
 
diff --git a/guava/src/com/google/common/collect/UsingToStringOrdering.java b/guava/src/com/google/common/collect/UsingToStringOrdering.java
index 3167946..3443b43 100644
--- a/guava/src/com/google/common/collect/UsingToStringOrdering.java
+++ b/guava/src/com/google/common/collect/UsingToStringOrdering.java
@@ -21,6 +21,7 @@
 
 /** An ordering that uses the natural order of the string representation of the values. */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 final class UsingToStringOrdering extends Ordering<Object> implements Serializable {
   static final UsingToStringOrdering INSTANCE = new UsingToStringOrdering();
 
diff --git a/guava/src/com/google/common/collect/package-info.java b/guava/src/com/google/common/collect/package-info.java
index f9f6758..d46e65f 100644
--- a/guava/src/com/google/common/collect/package-info.java
+++ b/guava/src/com/google/common/collect/package-info.java
@@ -97,6 +97,7 @@
  *
  * <ul>
  *   <li>{@link com.google.common.collect.ImmutableMultiset}
+ *   <li>{@link com.google.common.collect.ImmutableSortedMultiset}
  *   <li>{@link com.google.common.collect.HashMultiset}
  *   <li>{@link com.google.common.collect.LinkedHashMultiset}
  *   <li>{@link com.google.common.collect.TreeMultiset}
diff --git a/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java b/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
index 91e48e6..20e8563 100644
--- a/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
+++ b/guava/src/com/google/common/escape/ArrayBasedCharEscaper.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link CharEscaper} that uses an array to quickly look up replacement characters for a given
@@ -42,6 +43,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ArrayBasedCharEscaper extends CharEscaper {
   // The replacement array (see ArrayBasedEscaperMap).
   private final char[][] replacements;
@@ -117,8 +119,11 @@
    * Escapes a single character using the replacement array and safe range values. If the given
    * character does not have an explicit replacement and lies outside the safe range then {@link
    * #escapeUnsafe} is called.
+   *
+   * @return the replacement characters, or {@code null} if no escaping was required
    */
   @Override
+  @CheckForNull
   protected final char[] escape(char c) {
     if (c < replacementsLength) {
       char[] chars = replacements[c];
@@ -145,5 +150,6 @@
    * @return the replacement characters, or {@code null} if no escaping was required
    */
   // TODO(dbeaumont,cpovirk): Rename this something better once refactoring done
+  @CheckForNull
   protected abstract char[] escapeUnsafe(char c);
 }
diff --git a/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java b/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
index 400c3b1..a0883fe 100644
--- a/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
+++ b/guava/src/com/google/common/escape/ArrayBasedEscaperMap.java
@@ -38,6 +38,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class ArrayBasedEscaperMap {
   /**
    * Returns a new ArrayBasedEscaperMap for creating ArrayBasedCharEscaper or
@@ -73,7 +74,7 @@
     }
     char max = Collections.max(map.keySet());
     char[][] replacements = new char[max + 1][];
-    for (char c : map.keySet()) {
+    for (Character c : map.keySet()) {
       replacements[c] = map.get(c).toCharArray();
     }
     return replacements;
diff --git a/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java b/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
index 756abce..5ea7807 100644
--- a/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
+++ b/guava/src/com/google/common/escape/ArrayBasedUnicodeEscaper.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -42,6 +43,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ArrayBasedUnicodeEscaper extends UnicodeEscaper {
   // The replacement array (see ArrayBasedEscaperMap).
   private final char[][] replacements;
@@ -157,8 +159,11 @@
    * Escapes a single Unicode code point using the replacement array and safe range values. If the
    * given character does not have an explicit replacement and lies outside the safe range then
    * {@link #escapeUnsafe} is called.
+   *
+   * @return the replacement characters, or {@code null} if no escaping was required
    */
   @Override
+  @CheckForNull
   protected final char[] escape(int cp) {
     if (cp < replacementsLength) {
       char[] chars = replacements[cp];
@@ -199,5 +204,6 @@
    * @param cp the Unicode code point to escape
    * @return the replacement characters, or {@code null} if no escaping was required
    */
+  @CheckForNull
   protected abstract char[] escapeUnsafe(int cp);
 }
diff --git a/guava/src/com/google/common/escape/CharEscaper.java b/guava/src/com/google/common/escape/CharEscaper.java
index b8ffee3..55090f6 100644
--- a/guava/src/com/google/common/escape/CharEscaper.java
+++ b/guava/src/com/google/common/escape/CharEscaper.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import javax.annotation.CheckForNull;
 
 /**
  * An object that converts literal text into a format safe for inclusion in a particular context
@@ -41,6 +42,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class CharEscaper extends Escaper {
   /** Constructor for use by subclasses. */
   protected CharEscaper() {}
@@ -80,6 +82,7 @@
    * @param c the character to escape if necessary
    * @return the replacement characters, or {@code null} if no escaping was needed
    */
+  @CheckForNull
   protected abstract char[] escape(char c);
 
   /**
diff --git a/guava/src/com/google/common/escape/CharEscaperBuilder.java b/guava/src/com/google/common/escape/CharEscaperBuilder.java
index dba855f..cbe6958 100644
--- a/guava/src/com/google/common/escape/CharEscaperBuilder.java
+++ b/guava/src/com/google/common/escape/CharEscaperBuilder.java
@@ -22,6 +22,8 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Simple helper class to build a "sparse" array of objects based on the indexes that were added to
@@ -34,16 +36,17 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class CharEscaperBuilder {
   /**
    * Simple decorator that turns an array of replacement char[]s into a CharEscaper, this results in
    * a very fast escape method.
    */
   private static class CharArrayDecorator extends CharEscaper {
-    private final char[][] replacements;
+    private final char[] @Nullable [] replacements;
     private final int replaceLength;
 
-    CharArrayDecorator(char[][] replacements) {
+    CharArrayDecorator(char[] @Nullable [] replacements) {
       this.replacements = replacements;
       this.replaceLength = replacements.length;
     }
@@ -65,6 +68,7 @@
     }
 
     @Override
+    @CheckForNull
     protected char[] escape(char c) {
       return c < replaceLength ? replacements[c] : null;
     }
@@ -108,7 +112,7 @@
    *
    * @return a "sparse" array that holds the replacement mappings.
    */
-  public char[][] toArray() {
+  public char[] @Nullable [] toArray() {
     char[][] result = new char[max + 1][];
     for (Entry<Character, String> entry : map.entrySet()) {
       result[entry.getKey()] = entry.getValue().toCharArray();
diff --git a/guava/src/com/google/common/escape/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/escape/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..992c9a3
--- /dev/null
+++ b/guava/src/com/google/common/escape/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.escape;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/escape/Escaper.java b/guava/src/com/google/common/escape/Escaper.java
index 0d32a09..cdfe4e9 100644
--- a/guava/src/com/google/common/escape/Escaper.java
+++ b/guava/src/com/google/common/escape/Escaper.java
@@ -56,6 +56,7 @@
  */
 @DoNotMock("Use Escapers.nullEscaper() or another methods from the *Escapers classes")
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class Escaper {
   // TODO(dbeaumont): evaluate custom implementations, considering package private constructor.
   /** Constructor for use by subclasses. */
diff --git a/guava/src/com/google/common/escape/Escapers.java b/guava/src/com/google/common/escape/Escapers.java
index 6fa8365..41af668 100644
--- a/guava/src/com/google/common/escape/Escapers.java
+++ b/guava/src/com/google/common/escape/Escapers.java
@@ -21,6 +21,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.HashMap;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -32,6 +33,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Escapers {
   private Escapers() {}
 
@@ -52,6 +54,7 @@
         }
 
         @Override
+        @CheckForNull
         protected char[] escape(char c) {
           // TODO: Fix tests not to call this directly and make it throw an error.
           return null;
@@ -95,7 +98,7 @@
     private final Map<Character, String> replacementMap = new HashMap<>();
     private char safeMin = Character.MIN_VALUE;
     private char safeMax = Character.MAX_VALUE;
-    private String unsafeReplacement = null;
+    @CheckForNull private String unsafeReplacement = null;
 
     // The constructor is exposed via the builder() method above.
     private Builder() {}
@@ -151,10 +154,12 @@
     /** Returns a new escaper based on the current state of the builder. */
     public Escaper build() {
       return new ArrayBasedCharEscaper(replacementMap, safeMin, safeMax) {
+        @CheckForNull
         private final char[] replacementChars =
             unsafeReplacement != null ? unsafeReplacement.toCharArray() : null;
 
         @Override
+        @CheckForNull
         protected char[] escapeUnsafe(char c) {
           return replacementChars;
         }
@@ -198,6 +203,7 @@
    * @param c the character to escape if necessary
    * @return the replacement string, or {@code null} if no escaping was needed
    */
+  @CheckForNull
   public static String computeReplacement(CharEscaper escaper, char c) {
     return stringOrNull(escaper.escape(c));
   }
@@ -211,11 +217,13 @@
    * @param cp the Unicode code point to escape if necessary
    * @return the replacement string, or {@code null} if no escaping was needed
    */
+  @CheckForNull
   public static String computeReplacement(UnicodeEscaper escaper, int cp) {
     return stringOrNull(escaper.escape(cp));
   }
 
-  private static String stringOrNull(char[] in) {
+  @CheckForNull
+  private static String stringOrNull(@CheckForNull char[] in) {
     return (in == null) ? null : new String(in);
   }
 
@@ -223,6 +231,7 @@
   private static UnicodeEscaper wrap(final CharEscaper escaper) {
     return new UnicodeEscaper() {
       @Override
+      @CheckForNull
       protected char[] escape(int cp) {
         // If a code point maps to a single character, just escape that.
         if (cp < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
diff --git a/guava/src/com/google/common/escape/ParametricNullness.java b/guava/src/com/google/common/escape/ParametricNullness.java
new file mode 100644
index 0000000..2f03d59
--- /dev/null
+++ b/guava/src/com/google/common/escape/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.escape;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/escape/Platform.java b/guava/src/com/google/common/escape/Platform.java
index 99a7d4f..dc6610c 100644
--- a/guava/src/com/google/common/escape/Platform.java
+++ b/guava/src/com/google/common/escape/Platform.java
@@ -22,6 +22,7 @@
  * @author Jesse Wilson
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class Platform {
   private Platform() {}
 
diff --git a/guava/src/com/google/common/escape/UnicodeEscaper.java b/guava/src/com/google/common/escape/UnicodeEscaper.java
index 0642162..c10ae34 100644
--- a/guava/src/com/google/common/escape/UnicodeEscaper.java
+++ b/guava/src/com/google/common/escape/UnicodeEscaper.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import javax.annotation.CheckForNull;
 
 /**
  * An {@link Escaper} that converts literal text into a format safe for inclusion in a particular
@@ -51,6 +52,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public abstract class UnicodeEscaper extends Escaper {
   /** The amount of padding (chars) to use when growing the escape buffer. */
   private static final int DEST_PAD = 32;
@@ -77,6 +79,7 @@
    * @param cp the Unicode code point to escape if necessary
    * @return the replacement characters, or {@code null} if no escaping was needed
    */
+  @CheckForNull
   protected abstract char[] escape(int cp);
 
   /**
diff --git a/guava/src/com/google/common/eventbus/AllowConcurrentEvents.java b/guava/src/com/google/common/eventbus/AllowConcurrentEvents.java
index 4c749b4..28bc4b2 100644
--- a/guava/src/com/google/common/eventbus/AllowConcurrentEvents.java
+++ b/guava/src/com/google/common/eventbus/AllowConcurrentEvents.java
@@ -14,7 +14,6 @@
 
 package com.google.common.eventbus;
 
-import com.google.common.annotations.Beta;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -31,5 +30,5 @@
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
-@Beta
+@ElementTypesAreNonnullByDefault
 public @interface AllowConcurrentEvents {}
diff --git a/guava/src/com/google/common/eventbus/AsyncEventBus.java b/guava/src/com/google/common/eventbus/AsyncEventBus.java
index 8650a8d..4f387a7 100644
--- a/guava/src/com/google/common/eventbus/AsyncEventBus.java
+++ b/guava/src/com/google/common/eventbus/AsyncEventBus.java
@@ -14,7 +14,6 @@
 
 package com.google.common.eventbus;
 
-import com.google.common.annotations.Beta;
 import java.util.concurrent.Executor;
 
 /**
@@ -24,7 +23,7 @@
  * @author Cliff Biffle
  * @since 10.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public class AsyncEventBus extends EventBus {
 
   /**
diff --git a/guava/src/com/google/common/eventbus/DeadEvent.java b/guava/src/com/google/common/eventbus/DeadEvent.java
index 6dbfee5..2cdb23f 100644
--- a/guava/src/com/google/common/eventbus/DeadEvent.java
+++ b/guava/src/com/google/common/eventbus/DeadEvent.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 
 /**
@@ -28,7 +27,7 @@
  * @author Cliff Biffle
  * @since 10.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public class DeadEvent {
 
   private final Object source;
diff --git a/guava/src/com/google/common/eventbus/Dispatcher.java b/guava/src/com/google/common/eventbus/Dispatcher.java
index 11e2de1..ff1ae2a 100644
--- a/guava/src/com/google/common/eventbus/Dispatcher.java
+++ b/guava/src/com/google/common/eventbus/Dispatcher.java
@@ -31,6 +31,7 @@
  *
  * @author Colin Decker
  */
+@ElementTypesAreNonnullByDefault
 abstract class Dispatcher {
 
   /**
diff --git a/guava/src/com/google/common/eventbus/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/eventbus/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..e8542bb
--- /dev/null
+++ b/guava/src/com/google/common/eventbus/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.eventbus;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/eventbus/EventBus.java b/guava/src/com/google/common/eventbus/EventBus.java
index e505399..4afc197 100644
--- a/guava/src/com/google/common/eventbus/EventBus.java
+++ b/guava/src/com/google/common/eventbus/EventBus.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.lang.reflect.Method;
@@ -29,6 +28,62 @@
 /**
  * Dispatches events to listeners, and provides ways for listeners to register themselves.
  *
+ * <h2>Avoid EventBus</h2>
+ *
+ * <p><b>We recommend against using EventBus.</b> It was designed many years ago, and newer
+ * libraries offer better ways to decouple components and react to events.
+ *
+ * <p>To decouple components, we recommend a dependency-injection framework. For Android code, most
+ * apps use <a href="https://dagger.dev">Dagger</a>. For server code, common options include <a
+ * href="https://github.com/google/guice/wiki/Motivation">Guice</a> and <a
+ * href="https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-introduction">Spring</a>.
+ * Frameworks typically offer a way to register multiple listeners independently and then request
+ * them together as a set (<a href="https://dagger.dev/dev-guide/multibindings">Dagger</a>, <a
+ * href="https://github.com/google/guice/wiki/Multibindings">Guice</a>, <a
+ * href="https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-autowired-annotation">Spring</a>).
+ *
+ * <p>To react to events, we recommend a reactive-streams framework like <a
+ * href="https://github.com/ReactiveX/RxJava/wiki">RxJava</a> (supplemented with its <a
+ * href="https://github.com/ReactiveX/RxAndroid">RxAndroid</a> extension if you are building for
+ * Android) or <a href="https://projectreactor.io/">Project Reactor</a>. (For the basics of
+ * translating code from using an event bus to using a reactive-streams framework, see these two
+ * guides: <a href="https://blog.jkl.gg/implementing-an-event-bus-with-rxjava-rxbus/">1</a>, <a
+ * href="https://lorentzos.com/rxjava-as-event-bus-the-right-way-10a36bdd49ba">2</a>.) Some usages
+ * of EventBus may be better written using <a
+ * href="https://kotlinlang.org/docs/coroutines-guide.html">Kotlin coroutines</a>, including <a
+ * href="https://kotlinlang.org/docs/flow.html">Flow</a> and <a
+ * href="https://kotlinlang.org/docs/channels.html">Channels</a>. Yet other usages are better served
+ * by individual libraries that provide specialized support for particular use cases.
+ *
+ * <p>Disadvantages of EventBus include:
+ *
+ * <ul>
+ *   <li>It makes the cross-references between producer and subscriber harder to find. This can
+ *       complicate debugging, lead to unintentional reentrant calls, and force apps to eagerly
+ *       initialize all possible subscribers at startup time.
+ *   <li>It uses reflection in ways that break when code is processed by optimizers/minimizers like
+ *       <a href="https://developer.android.com/studio/build/shrink-code">R8 and Proguard</a>.
+ *   <li>It doesn't offer a way to wait for multiple events before taking action. For example, it
+ *       doesn't offer a way to wait for multiple producers to all report that they're "ready," nor
+ *       does it offer a way to batch multiple events from a single producer together.
+ *   <li>It doesn't support backpressure and other features needed for resilience.
+ *   <li>It doesn't provide much control of threading.
+ *   <li>It doesn't offer much monitoring.
+ *   <li>It doesn't propagate exceptions, so apps don't have a way to react to them.
+ *   <li>It doesn't interoperate well with RxJava, coroutines, and other more commonly used
+ *       alternatives.
+ *   <li>It imposes requirements on the lifecycle of its subscribers. For example, if an event
+ *       occurs between when one subscriber is removed and the next subscriber is added, the event
+ *       is dropped.
+ *   <li>Its performance is suboptimal, especially under Android.
+ *   <li>It <a href="https://github.com/google/guava/issues/1431">doesn't support parameterized
+ *       types</a>.
+ *   <li>With the introduction of lambdas in Java 8, EventBus went from less verbose than listeners
+ *       to <a href="https://github.com/google/guava/issues/3311">more verbose</a>.
+ * </ul>
+ *
+ * <h2>EventBus Summary</h2>
+ *
  * <p>The EventBus allows publish-subscribe-style communication between components without requiring
  * the components to explicitly register with one another (and thus be aware of each other). It is
  * designed exclusively to replace traditional Java in-process event distribution using explicit
@@ -92,7 +147,7 @@
  * @author Cliff Biffle
  * @since 10.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public class EventBus {
 
   private static final Logger logger = Logger.getLogger(EventBus.class.getName());
diff --git a/guava/src/com/google/common/eventbus/ParametricNullness.java b/guava/src/com/google/common/eventbus/ParametricNullness.java
new file mode 100644
index 0000000..fc5bb17
--- /dev/null
+++ b/guava/src/com/google/common/eventbus/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.eventbus;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/eventbus/Subscribe.java b/guava/src/com/google/common/eventbus/Subscribe.java
index 52b999d..88477f1 100644
--- a/guava/src/com/google/common/eventbus/Subscribe.java
+++ b/guava/src/com/google/common/eventbus/Subscribe.java
@@ -14,7 +14,6 @@
 
 package com.google.common.eventbus;
 
-import com.google.common.annotations.Beta;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -36,5 +35,5 @@
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
-@Beta
+@ElementTypesAreNonnullByDefault
 public @interface Subscribe {}
diff --git a/guava/src/com/google/common/eventbus/Subscriber.java b/guava/src/com/google/common/eventbus/Subscriber.java
index ddc4963..73e7f42 100644
--- a/guava/src/com/google/common/eventbus/Subscriber.java
+++ b/guava/src/com/google/common/eventbus/Subscriber.java
@@ -21,7 +21,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.concurrent.Executor;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A subscriber method on a specific object, plus the executor that should be used for dispatching
@@ -32,6 +32,7 @@
  *
  * @author Colin Decker
  */
+@ElementTypesAreNonnullByDefault
 class Subscriber {
 
   /** Creates a {@code Subscriber} for {@code method} on {@code listener}. */
@@ -108,7 +109,7 @@
   }
 
   @Override
-  public final boolean equals(@Nullable Object obj) {
+  public final boolean equals(@CheckForNull Object obj) {
     if (obj instanceof Subscriber) {
       Subscriber that = (Subscriber) obj;
       // Use == so that different equal instances will still receive events.
diff --git a/guava/src/com/google/common/eventbus/SubscriberExceptionContext.java b/guava/src/com/google/common/eventbus/SubscriberExceptionContext.java
index 6ddd86f..63c7d55 100644
--- a/guava/src/com/google/common/eventbus/SubscriberExceptionContext.java
+++ b/guava/src/com/google/common/eventbus/SubscriberExceptionContext.java
@@ -23,6 +23,7 @@
  *
  * @since 16.0
  */
+@ElementTypesAreNonnullByDefault
 public class SubscriberExceptionContext {
   private final EventBus eventBus;
   private final Object event;
@@ -31,7 +32,7 @@
 
   /**
    * @param eventBus The {@link EventBus} that handled the event and the subscriber. Useful for
-   *     broadcasting a a new event based on the error.
+   *     broadcasting a new event based on the error.
    * @param event The event object that caused the subscriber to throw.
    * @param subscriber The source subscriber context.
    * @param subscriberMethod the subscribed method.
@@ -46,7 +47,7 @@
 
   /**
    * @return The {@link EventBus} that handled the event and the subscriber. Useful for broadcasting
-   *     a a new event based on the error.
+   *     a new event based on the error.
    */
   public EventBus getEventBus() {
     return eventBus;
diff --git a/guava/src/com/google/common/eventbus/SubscriberExceptionHandler.java b/guava/src/com/google/common/eventbus/SubscriberExceptionHandler.java
index c239ad7..1c2fbb1 100644
--- a/guava/src/com/google/common/eventbus/SubscriberExceptionHandler.java
+++ b/guava/src/com/google/common/eventbus/SubscriberExceptionHandler.java
@@ -14,11 +14,13 @@
 
 package com.google.common.eventbus;
 
+
 /**
  * Handler for exceptions thrown by event subscribers.
  *
  * @since 16.0
  */
+@ElementTypesAreNonnullByDefault
 public interface SubscriberExceptionHandler {
   /** Handles exceptions thrown by subscribers. */
   void handleException(Throwable exception, SubscriberExceptionContext context);
diff --git a/guava/src/com/google/common/eventbus/SubscriberRegistry.java b/guava/src/com/google/common/eventbus/SubscriberRegistry.java
index 876af8b..46e9820 100644
--- a/guava/src/com/google/common/eventbus/SubscriberRegistry.java
+++ b/guava/src/com/google/common/eventbus/SubscriberRegistry.java
@@ -46,13 +46,14 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArraySet;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Registry of subscribers to a single event bus.
  *
  * @author Colin Decker
  */
+@ElementTypesAreNonnullByDefault
 final class SubscriberRegistry {
 
   /**
@@ -258,7 +259,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof MethodIdentifier) {
         MethodIdentifier ident = (MethodIdentifier) o;
         return name.equals(ident.name) && parameterTypes.equals(ident.parameterTypes);
diff --git a/guava/src/com/google/common/graph/AbstractBaseGraph.java b/guava/src/com/google/common/graph/AbstractBaseGraph.java
index 352df19..c4be6b6 100644
--- a/guava/src/com/google/common/graph/AbstractBaseGraph.java
+++ b/guava/src/com/google/common/graph/AbstractBaseGraph.java
@@ -30,7 +30,7 @@
 import com.google.common.primitives.Ints;
 import java.util.AbstractSet;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides a skeletal implementation of {@link BaseGraph}.
@@ -41,6 +41,7 @@
  * @author James Sexton
  * @param <N> Node parameter type
  */
+@ElementTypesAreNonnullByDefault
 abstract class AbstractBaseGraph<N> implements BaseGraph<N> {
 
   /**
@@ -76,7 +77,7 @@
       }
 
       @Override
-      public boolean remove(Object o) {
+      public boolean remove(@CheckForNull Object o) {
         throw new UnsupportedOperationException();
       }
 
@@ -85,7 +86,7 @@
       // Graph<LinkedList>.
       @SuppressWarnings("unchecked")
       @Override
-      public boolean contains(@Nullable Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         if (!(obj instanceof EndpointPair)) {
           return false;
         }
diff --git a/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java b/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
index 9afaf3e..ac452d4 100644
--- a/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
+++ b/guava/src/com/google/common/graph/AbstractDirectedNetworkConnections.java
@@ -20,6 +20,7 @@
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.graph.Graphs.checkNonNegative;
 import static com.google.common.graph.Graphs.checkPositive;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Iterators;
@@ -30,7 +31,7 @@
 import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A base implementation of {@link NetworkConnections} for directed networks.
@@ -39,17 +40,17 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 abstract class AbstractDirectedNetworkConnections<N, E> implements NetworkConnections<N, E> {
   /** Keys are edges incoming to the origin node, values are the source node. */
-  protected final Map<E, N> inEdgeMap;
+  final Map<E, N> inEdgeMap;
 
   /** Keys are edges outgoing from the origin node, values are the target node. */
-  protected final Map<E, N> outEdgeMap;
+  final Map<E, N> outEdgeMap;
 
   private int selfLoopCount;
 
-  protected AbstractDirectedNetworkConnections(
-      Map<E, N> inEdgeMap, Map<E, N> outEdgeMap, int selfLoopCount) {
+  AbstractDirectedNetworkConnections(Map<E, N> inEdgeMap, Map<E, N> outEdgeMap, int selfLoopCount) {
     this.inEdgeMap = checkNotNull(inEdgeMap);
     this.outEdgeMap = checkNotNull(outEdgeMap);
     this.selfLoopCount = checkNonNegative(selfLoopCount);
@@ -79,7 +80,7 @@
       }
 
       @Override
-      public boolean contains(@Nullable Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         return inEdgeMap.containsKey(obj) || outEdgeMap.containsKey(obj);
       }
     };
@@ -99,7 +100,8 @@
   public N adjacentNode(E edge) {
     // Since the reference node is defined to be 'source' for directed graphs,
     // we can assume this edge lives in the set of outgoing edges.
-    return checkNotNull(outEdgeMap.get(edge));
+    // (We're relying on callers to call this method only with an edge that's in the graph.)
+    return requireNonNull(outEdgeMap.get(edge));
   }
 
   @Override
@@ -108,13 +110,15 @@
       checkNonNegative(--selfLoopCount);
     }
     N previousNode = inEdgeMap.remove(edge);
-    return checkNotNull(previousNode);
+    // We're relying on callers to call this method only with an edge that's in the graph.
+    return requireNonNull(previousNode);
   }
 
   @Override
   public N removeOutEdge(E edge) {
     N previousNode = outEdgeMap.remove(edge);
-    return checkNotNull(previousNode);
+    // We're relying on callers to call this method only with an edge that's in the graph.
+    return requireNonNull(previousNode);
   }
 
   @Override
diff --git a/guava/src/com/google/common/graph/AbstractGraph.java b/guava/src/com/google/common/graph/AbstractGraph.java
index 986c94b..9402be5 100644
--- a/guava/src/com/google/common/graph/AbstractGraph.java
+++ b/guava/src/com/google/common/graph/AbstractGraph.java
@@ -17,7 +17,7 @@
 package com.google.common.graph;
 
 import com.google.common.annotations.Beta;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides a skeletal implementation of {@link Graph}. It is recommended to extend this
@@ -28,10 +28,11 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractGraph<N> extends AbstractBaseGraph<N> implements Graph<N> {
 
   @Override
-  public final boolean equals(@Nullable Object obj) {
+  public final boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/graph/AbstractGraphBuilder.java b/guava/src/com/google/common/graph/AbstractGraphBuilder.java
index 84e461a..a4e1543 100644
--- a/guava/src/com/google/common/graph/AbstractGraphBuilder.java
+++ b/guava/src/com/google/common/graph/AbstractGraphBuilder.java
@@ -23,6 +23,7 @@
  *
  * @author James Sexton
  */
+@ElementTypesAreNonnullByDefault
 abstract class AbstractGraphBuilder<N> {
   final boolean directed;
   boolean allowsSelfLoops = false;
diff --git a/guava/src/com/google/common/graph/AbstractNetwork.java b/guava/src/com/google/common/graph/AbstractNetwork.java
index 648ee9b..d6bf4c3 100644
--- a/guava/src/com/google/common/graph/AbstractNetwork.java
+++ b/guava/src/com/google/common/graph/AbstractNetwork.java
@@ -35,7 +35,7 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides a skeletal implementation of {@link Network}. It is recommended to extend
@@ -50,6 +50,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractNetwork<N, E> implements Network<N, E> {
 
   @Override
@@ -90,7 +91,7 @@
           // Network<LinkedList>.
           @SuppressWarnings("unchecked")
           @Override
-          public boolean contains(@Nullable Object obj) {
+          public boolean contains(@CheckForNull Object obj) {
             if (!(obj instanceof EndpointPair)) {
               return false;
             }
@@ -206,7 +207,8 @@
   }
 
   @Override
-  public @Nullable E edgeConnectingOrNull(N nodeU, N nodeV) {
+  @CheckForNull
+  public E edgeConnectingOrNull(N nodeU, N nodeV) {
     Set<E> edgesConnecting = edgesConnecting(nodeU, nodeV);
     switch (edgesConnecting.size()) {
       case 0:
@@ -219,7 +221,8 @@
   }
 
   @Override
-  public @Nullable E edgeConnectingOrNull(EndpointPair<N> endpoints) {
+  @CheckForNull
+  public E edgeConnectingOrNull(EndpointPair<N> endpoints) {
     validateEndpoints(endpoints);
     return edgeConnectingOrNull(endpoints.nodeU(), endpoints.nodeV());
   }
@@ -254,7 +257,7 @@
   }
 
   @Override
-  public final boolean equals(@Nullable Object obj) {
+  public final boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/graph/AbstractUndirectedNetworkConnections.java b/guava/src/com/google/common/graph/AbstractUndirectedNetworkConnections.java
index 03279d0..8f736d7 100644
--- a/guava/src/com/google/common/graph/AbstractUndirectedNetworkConnections.java
+++ b/guava/src/com/google/common/graph/AbstractUndirectedNetworkConnections.java
@@ -18,10 +18,12 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
 
 import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 
 /**
  * A base implementation of {@link NetworkConnections} for undirected networks.
@@ -30,11 +32,12 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 abstract class AbstractUndirectedNetworkConnections<N, E> implements NetworkConnections<N, E> {
   /** Keys are edges incident to the origin node, values are the node at the other end. */
-  protected final Map<E, N> incidentEdgeMap;
+  final Map<E, N> incidentEdgeMap;
 
-  protected AbstractUndirectedNetworkConnections(Map<E, N> incidentEdgeMap) {
+  AbstractUndirectedNetworkConnections(Map<E, N> incidentEdgeMap) {
     this.incidentEdgeMap = checkNotNull(incidentEdgeMap);
   }
 
@@ -65,10 +68,12 @@
 
   @Override
   public N adjacentNode(E edge) {
-    return checkNotNull(incidentEdgeMap.get(edge));
+    // We're relying on callers to call this method only with an edge that's in the graph.
+    return requireNonNull(incidentEdgeMap.get(edge));
   }
 
   @Override
+  @CheckForNull
   public N removeInEdge(E edge, boolean isSelfLoop) {
     if (!isSelfLoop) {
       return removeOutEdge(edge);
@@ -79,7 +84,8 @@
   @Override
   public N removeOutEdge(E edge) {
     N previousNode = incidentEdgeMap.remove(edge);
-    return checkNotNull(previousNode);
+    // We're relying on callers to call this method only with an edge that's in the graph.
+    return requireNonNull(previousNode);
   }
 
   @Override
diff --git a/guava/src/com/google/common/graph/AbstractValueGraph.java b/guava/src/com/google/common/graph/AbstractValueGraph.java
index c83cff5..5b8e520 100644
--- a/guava/src/com/google/common/graph/AbstractValueGraph.java
+++ b/guava/src/com/google/common/graph/AbstractValueGraph.java
@@ -16,13 +16,15 @@
 
 package com.google.common.graph;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
 import com.google.common.collect.Maps;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * This class provides a skeletal implementation of {@link ValueGraph}. It is recommended to extend
@@ -37,6 +39,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractValueGraph<N, V> extends AbstractBaseGraph<N>
     implements ValueGraph<N, V> {
 
@@ -116,7 +119,7 @@
   }
 
   @Override
-  public final boolean equals(@Nullable Object obj) {
+  public final boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     }
@@ -153,7 +156,8 @@
         new Function<EndpointPair<N>, V>() {
           @Override
           public V apply(EndpointPair<N> edge) {
-            return graph.edgeValueOrDefault(edge.nodeU(), edge.nodeV(), null);
+            // requireNonNull is safe because the endpoint pair comes from the graph.
+            return requireNonNull(graph.edgeValueOrDefault(edge.nodeU(), edge.nodeV(), null));
           }
         };
     return Maps.asMap(graph.edges(), edgeToValueFn);
diff --git a/guava/src/com/google/common/graph/BaseGraph.java b/guava/src/com/google/common/graph/BaseGraph.java
index 1df5de7..68813e1 100644
--- a/guava/src/com/google/common/graph/BaseGraph.java
+++ b/guava/src/com/google/common/graph/BaseGraph.java
@@ -24,6 +24,7 @@
  * @author James Sexton
  * @param <N> Node parameter type
  */
+@ElementTypesAreNonnullByDefault
 interface BaseGraph<N> extends SuccessorsFunction<N>, PredecessorsFunction<N> {
   //
   // Graph-level accessors
diff --git a/guava/src/com/google/common/graph/DirectedGraphConnections.java b/guava/src/com/google/common/graph/DirectedGraphConnections.java
index 3838bcf..23083da 100644
--- a/guava/src/com/google/common/graph/DirectedGraphConnections.java
+++ b/guava/src/com/google/common/graph/DirectedGraphConnections.java
@@ -40,7 +40,7 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link GraphConnections} for directed graphs.
@@ -50,6 +50,7 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class DirectedGraphConnections<N, V> implements GraphConnections<N, V> {
   /**
    * A wrapper class to indicate a node is both a predecessor and successor while still providing
@@ -82,7 +83,7 @@
       }
 
       @Override
-      public boolean equals(Object that) {
+      public boolean equals(@CheckForNull Object that) {
         if (that instanceof Pred) {
           return this.node.equals(((Pred<?>) that).node);
         } else {
@@ -103,7 +104,7 @@
       }
 
       @Override
-      public boolean equals(Object that) {
+      public boolean equals(@CheckForNull Object that) {
         if (that instanceof Succ) {
           return this.node.equals(((Succ<?>) that).node);
         } else {
@@ -133,14 +134,14 @@
    * LinkedHashMap combines two such edges into a single node-value pair, even though the edges may
    * not have been inserted consecutively.
    */
-  @Nullable private final List<NodeConnection<N>> orderedNodeConnections;
+  @CheckForNull private final List<NodeConnection<N>> orderedNodeConnections;
 
   private int predecessorCount;
   private int successorCount;
 
   private DirectedGraphConnections(
       Map<N, Object> adjacentNodeValues,
-      @Nullable List<NodeConnection<N>> orderedNodeConnections,
+      @CheckForNull List<NodeConnection<N>> orderedNodeConnections,
       int predecessorCount,
       int successorCount) {
     this.adjacentNodeValues = checkNotNull(adjacentNodeValues);
@@ -242,6 +243,7 @@
           final Set<N> seenNodes = new HashSet<>();
           return new AbstractIterator<N>() {
             @Override
+            @CheckForNull
             protected N computeNext() {
               while (nodeConnections.hasNext()) {
                 NodeConnection<N> nodeConnection = nodeConnections.next();
@@ -261,7 +263,7 @@
         }
 
         @Override
-        public boolean contains(@Nullable Object obj) {
+        public boolean contains(@CheckForNull Object obj) {
           return adjacentNodeValues.containsKey(obj);
         }
       };
@@ -277,6 +279,7 @@
           final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
           return new AbstractIterator<N>() {
             @Override
+            @CheckForNull
             protected N computeNext() {
               while (entries.hasNext()) {
                 Entry<N, Object> entry = entries.next();
@@ -291,6 +294,7 @@
           final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
           return new AbstractIterator<N>() {
             @Override
+            @CheckForNull
             protected N computeNext() {
               while (nodeConnections.hasNext()) {
                 NodeConnection<N> nodeConnection = nodeConnections.next();
@@ -310,7 +314,7 @@
       }
 
       @Override
-      public boolean contains(@Nullable Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         return isPredecessor(adjacentNodeValues.get(obj));
       }
     };
@@ -325,6 +329,7 @@
           final Iterator<Entry<N, Object>> entries = adjacentNodeValues.entrySet().iterator();
           return new AbstractIterator<N>() {
             @Override
+            @CheckForNull
             protected N computeNext() {
               while (entries.hasNext()) {
                 Entry<N, Object> entry = entries.next();
@@ -339,6 +344,7 @@
           final Iterator<NodeConnection<N>> nodeConnections = orderedNodeConnections.iterator();
           return new AbstractIterator<N>() {
             @Override
+            @CheckForNull
             protected N computeNext() {
               while (nodeConnections.hasNext()) {
                 NodeConnection<N> nodeConnection = nodeConnections.next();
@@ -358,7 +364,7 @@
       }
 
       @Override
-      public boolean contains(@Nullable Object obj) {
+      public boolean contains(@CheckForNull Object obj) {
         return isSuccessor(adjacentNodeValues.get(obj));
       }
     };
@@ -407,6 +413,7 @@
     final AtomicBoolean alreadySeenSelfLoop = new AtomicBoolean(false);
     return new AbstractIterator<EndpointPair<N>>() {
       @Override
+      @CheckForNull
       protected EndpointPair<N> computeNext() {
         while (resultWithDoubleSelfLoop.hasNext()) {
           EndpointPair<N> edge = resultWithDoubleSelfLoop.next();
@@ -425,6 +432,7 @@
 
   @SuppressWarnings("unchecked")
   @Override
+  @CheckForNull
   public V value(N node) {
     checkNotNull(node);
     Object value = adjacentNodeValues.get(node);
@@ -466,6 +474,7 @@
 
   @SuppressWarnings("unchecked")
   @Override
+  @CheckForNull
   public V removeSuccessor(Object node) {
     checkNotNull(node);
     Object previousValue = adjacentNodeValues.get(node);
@@ -489,7 +498,14 @@
       }
     }
 
-    return (V) removedValue;
+    /*
+     * TODO(cpovirk): `return (V) removedValue` once our checker permits that.
+     *
+     * (We promoted a class of warnings into errors because sometimes they indicate real problems.
+     * But now we need to "undo" some instance of spurious errors, as discussed in
+     * https://github.com/jspecify/checker-framework/issues/8.)
+     */
+    return removedValue == null ? null : (V) removedValue;
   }
 
   @Override
@@ -522,6 +538,7 @@
 
   @SuppressWarnings("unchecked")
   @Override
+  @CheckForNull
   public V addSuccessor(N node, V value) {
     Object previousValue = adjacentNodeValues.put(node, value);
     Object previousSuccessor;
@@ -546,14 +563,15 @@
       }
     }
 
-    return (V) previousSuccessor;
+    // See the comment on the similar cast in removeSuccessor.
+    return previousSuccessor == null ? null : (V) previousSuccessor;
   }
 
-  private static boolean isPredecessor(@Nullable Object value) {
+  private static boolean isPredecessor(@CheckForNull Object value) {
     return (value == PRED) || (value instanceof PredAndSucc);
   }
 
-  private static boolean isSuccessor(@Nullable Object value) {
+  private static boolean isSuccessor(@CheckForNull Object value) {
     return (value != PRED) && (value != null);
   }
 }
diff --git a/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java b/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
index 4a560ae..05f40c2 100644
--- a/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
+++ b/guava/src/com/google/common/graph/DirectedMultiNetworkConnections.java
@@ -30,7 +30,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link NetworkConnections} for directed networks with parallel edges.
@@ -39,6 +39,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class DirectedMultiNetworkConnections<N, E> extends AbstractDirectedNetworkConnections<N, E> {
 
   private DirectedMultiNetworkConnections(
@@ -59,7 +60,7 @@
         ImmutableMap.copyOf(inEdges), ImmutableMap.copyOf(outEdges), selfLoopCount);
   }
 
-  @LazyInit private transient Reference<Multiset<N>> predecessorsReference;
+  @CheckForNull @LazyInit private transient Reference<Multiset<N>> predecessorsReference;
 
   @Override
   public Set<N> predecessors() {
@@ -75,7 +76,7 @@
     return predecessors;
   }
 
-  @LazyInit private transient Reference<Multiset<N>> successorsReference;
+  @CheckForNull @LazyInit private transient Reference<Multiset<N>> successorsReference;
 
   @Override
   public Set<N> successors() {
@@ -139,7 +140,8 @@
     }
   }
 
-  private static <T> @Nullable T getReference(@Nullable Reference<T> reference) {
+  @CheckForNull
+  private static <T> T getReference(@CheckForNull Reference<T> reference) {
     return (reference == null) ? null : reference.get();
   }
 }
diff --git a/guava/src/com/google/common/graph/DirectedNetworkConnections.java b/guava/src/com/google/common/graph/DirectedNetworkConnections.java
index 2a0b010..c2a25a5 100644
--- a/guava/src/com/google/common/graph/DirectedNetworkConnections.java
+++ b/guava/src/com/google/common/graph/DirectedNetworkConnections.java
@@ -32,10 +32,10 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class DirectedNetworkConnections<N, E> extends AbstractDirectedNetworkConnections<N, E> {
 
-  protected DirectedNetworkConnections(
-      Map<E, N> inEdgeMap, Map<E, N> outEdgeMap, int selfLoopCount) {
+  DirectedNetworkConnections(Map<E, N> inEdgeMap, Map<E, N> outEdgeMap, int selfLoopCount) {
     super(inEdgeMap, outEdgeMap, selfLoopCount);
   }
 
diff --git a/guava/src/com/google/common/graph/EdgesConnecting.java b/guava/src/com/google/common/graph/EdgesConnecting.java
index 1c46735..797970b 100644
--- a/guava/src/com/google/common/graph/EdgesConnecting.java
+++ b/guava/src/com/google/common/graph/EdgesConnecting.java
@@ -23,7 +23,7 @@
 import com.google.common.collect.UnmodifiableIterator;
 import java.util.AbstractSet;
 import java.util.Map;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A class to represent the set of edges connecting an (implicit) origin node to a target node.
@@ -34,6 +34,7 @@
  * @author James Sexton
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class EdgesConnecting<E> extends AbstractSet<E> {
 
   private final Map<?, E> nodeToOutEdge;
@@ -58,12 +59,13 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object edge) {
+  public boolean contains(@CheckForNull Object edge) {
     E connectingEdge = getConnectingEdge();
     return (connectingEdge != null && connectingEdge.equals(edge));
   }
 
-  private @Nullable E getConnectingEdge() {
+  @CheckForNull
+  private E getConnectingEdge() {
     return nodeToOutEdge.get(targetNode);
   }
 }
diff --git a/guava/src/com/google/common/graph/ElementOrder.java b/guava/src/com/google/common/graph/ElementOrder.java
index 257bdd6..ea13674 100644
--- a/guava/src/com/google/common/graph/ElementOrder.java
+++ b/guava/src/com/google/common/graph/ElementOrder.java
@@ -28,7 +28,7 @@
 import com.google.errorprone.annotations.Immutable;
 import java.util.Comparator;
 import java.util.Map;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Used to represent the order of elements in a data structure that supports different options for
@@ -46,11 +46,13 @@
  */
 @Beta
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class ElementOrder<T> {
   private final Type type;
 
   @SuppressWarnings("Immutable") // Hopefully the comparator provided is immutable!
-  private final @Nullable Comparator<T> comparator;
+  @CheckForNull
+  private final Comparator<T> comparator;
 
   /**
    * The type of ordering that this object specifies.
@@ -70,7 +72,7 @@
     SORTED
   }
 
-  private ElementOrder(Type type, @Nullable Comparator<T> comparator) {
+  private ElementOrder(Type type, @CheckForNull Comparator<T> comparator) {
     this.type = checkNotNull(type);
     this.comparator = comparator;
     checkState((type == Type.SORTED) == (comparator != null));
@@ -159,7 +161,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/graph/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/graph/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..0798de0
--- /dev/null
+++ b/guava/src/com/google/common/graph/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.graph;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/graph/EndpointPair.java b/guava/src/com/google/common/graph/EndpointPair.java
index c876634..7aa3860 100644
--- a/guava/src/com/google/common/graph/EndpointPair.java
+++ b/guava/src/com/google/common/graph/EndpointPair.java
@@ -24,7 +24,7 @@
 import com.google.common.collect.Iterators;
 import com.google.common.collect.UnmodifiableIterator;
 import com.google.errorprone.annotations.Immutable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable pair representing the two endpoints of an edge in a graph. The {@link EndpointPair}
@@ -39,6 +39,7 @@
  */
 @Beta
 @Immutable(containerOf = {"N"})
+@ElementTypesAreNonnullByDefault
 public abstract class EndpointPair<N> implements Iterable<N> {
   private final N nodeU;
   private final N nodeV;
@@ -103,8 +104,9 @@
    * Returns the node that is adjacent to {@code node} along the origin edge.
    *
    * @throws IllegalArgumentException if this {@link EndpointPair} does not contain {@code node}
+   * @since 20.0 (but the argument type was changed from {@code Object} to {@code N} in 31.0)
    */
-  public final N adjacentNode(Object node) {
+  public final N adjacentNode(N node) {
     if (node.equals(nodeU)) {
       return nodeV;
     } else if (node.equals(nodeV)) {
@@ -132,7 +134,7 @@
    * ordered {@link EndpointPair} is never equal to an unordered {@link EndpointPair}.
    */
   @Override
-  public abstract boolean equals(@Nullable Object obj);
+  public abstract boolean equals(@CheckForNull Object obj);
 
   /**
    * The hashcode of an ordered {@link EndpointPair} is equal to {@code Objects.hashCode(source(),
@@ -163,7 +165,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj == this) {
         return true;
       }
@@ -211,7 +213,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj == this) {
         return true;
       }
diff --git a/guava/src/com/google/common/graph/EndpointPairIterator.java b/guava/src/com/google/common/graph/EndpointPairIterator.java
index c4e6e07..7096dbe 100644
--- a/guava/src/com/google/common/graph/EndpointPairIterator.java
+++ b/guava/src/com/google/common/graph/EndpointPairIterator.java
@@ -17,24 +17,30 @@
 package com.google.common.graph;
 
 import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.AbstractIterator;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import java.util.Iterator;
 import java.util.Set;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A class to facilitate the set returned by {@link Graph#edges()}.
  *
  * @author James Sexton
  */
+@ElementTypesAreNonnullByDefault
 abstract class EndpointPairIterator<N> extends AbstractIterator<EndpointPair<N>> {
   private final BaseGraph<N> graph;
   private final Iterator<N> nodeIterator;
 
-  protected N node = null; // null is safe as an initial value because graphs don't allow null nodes
-  protected Iterator<N> successorIterator = ImmutableSet.<N>of().iterator();
+  @CheckForNull
+  N node = null; // null is safe as an initial value because graphs don't allow null nodes
+
+  Iterator<N> successorIterator = ImmutableSet.<N>of().iterator();
 
   static <N> EndpointPairIterator<N> of(BaseGraph<N> graph) {
     return graph.isDirected() ? new Directed<N>(graph) : new Undirected<N>(graph);
@@ -49,7 +55,7 @@
    * Called after {@link #successorIterator} is exhausted. Advances {@link #node} to the next node
    * and updates {@link #successorIterator} to iterate through the successors of {@link #node}.
    */
-  protected final boolean advance() {
+  final boolean advance() {
     checkState(!successorIterator.hasNext());
     if (!nodeIterator.hasNext()) {
       return false;
@@ -69,10 +75,12 @@
     }
 
     @Override
+    @CheckForNull
     protected EndpointPair<N> computeNext() {
       while (true) {
         if (successorIterator.hasNext()) {
-          return EndpointPair.ordered(node, successorIterator.next());
+          // requireNonNull is safe because successorIterator is empty until we set this.node.
+          return EndpointPair.ordered(requireNonNull(node), successorIterator.next());
         }
         if (!advance()) {
           return endOfData();
@@ -108,20 +116,28 @@
    * </pre>
    */
   private static final class Undirected<N> extends EndpointPairIterator<N> {
-    private Set<N> visitedNodes;
+    // It's a little weird that we add `null` to this set, but it makes for slightly simpler code.
+    @CheckForNull private Set<@Nullable N> visitedNodes;
 
     private Undirected(BaseGraph<N> graph) {
       super(graph);
-      this.visitedNodes = Sets.newHashSetWithExpectedSize(graph.nodes().size());
+      this.visitedNodes = Sets.newHashSetWithExpectedSize(graph.nodes().size() + 1);
     }
 
     @Override
+    @CheckForNull
     protected EndpointPair<N> computeNext() {
       while (true) {
+        /*
+         * requireNonNull is safe because visitedNodes isn't cleared until this method calls
+         * endOfData() (after which this method is never called again).
+         */
+        requireNonNull(visitedNodes);
         while (successorIterator.hasNext()) {
           N otherNode = successorIterator.next();
           if (!visitedNodes.contains(otherNode)) {
-            return EndpointPair.unordered(node, otherNode);
+            // requireNonNull is safe because successorIterator is empty until we set node.
+            return EndpointPair.unordered(requireNonNull(node), otherNode);
           }
         }
         // Add to visited set *after* processing neighbors so we still include self-loops.
diff --git a/guava/src/com/google/common/graph/ForwardingGraph.java b/guava/src/com/google/common/graph/ForwardingGraph.java
index 4a3ab8c..f4ddf42 100644
--- a/guava/src/com/google/common/graph/ForwardingGraph.java
+++ b/guava/src/com/google/common/graph/ForwardingGraph.java
@@ -24,9 +24,10 @@
  *
  * @author James Sexton
  */
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingGraph<N> extends AbstractGraph<N> {
 
-  protected abstract BaseGraph<N> delegate();
+  abstract BaseGraph<N> delegate();
 
   @Override
   public Set<N> nodes() {
diff --git a/guava/src/com/google/common/graph/ForwardingNetwork.java b/guava/src/com/google/common/graph/ForwardingNetwork.java
index 76347b1..9f1c6e7 100644
--- a/guava/src/com/google/common/graph/ForwardingNetwork.java
+++ b/guava/src/com/google/common/graph/ForwardingNetwork.java
@@ -18,6 +18,7 @@
 
 import java.util.Optional;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 
 /**
  * A class to allow {@link Network} implementations to be backed by a provided delegate. This is not
@@ -26,9 +27,10 @@
  * @author James Sexton
  * @author Joshua O'Madadhain
  */
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingNetwork<N, E> extends AbstractNetwork<N, E> {
 
-  protected abstract Network<N, E> delegate();
+  abstract Network<N, E> delegate();
 
   @Override
   public Set<N> nodes() {
@@ -141,11 +143,13 @@
   }
 
   @Override
+  @CheckForNull
   public E edgeConnectingOrNull(N nodeU, N nodeV) {
     return delegate().edgeConnectingOrNull(nodeU, nodeV);
   }
 
   @Override
+  @CheckForNull
   public E edgeConnectingOrNull(EndpointPair<N> endpoints) {
     return delegate().edgeConnectingOrNull(endpoints);
   }
diff --git a/guava/src/com/google/common/graph/ForwardingValueGraph.java b/guava/src/com/google/common/graph/ForwardingValueGraph.java
index 8db773f..fcd5d28 100644
--- a/guava/src/com/google/common/graph/ForwardingValueGraph.java
+++ b/guava/src/com/google/common/graph/ForwardingValueGraph.java
@@ -18,7 +18,7 @@
 
 import java.util.Optional;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A class to allow {@link ValueGraph} implementations to be backed by a provided delegate. This is
@@ -27,9 +27,10 @@
  * @author James Sexton
  * @author Joshua O'Madadhain
  */
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingValueGraph<N, V> extends AbstractValueGraph<N, V> {
 
-  protected abstract ValueGraph<N, V> delegate();
+  abstract ValueGraph<N, V> delegate();
 
   @Override
   public Set<N> nodes() {
@@ -116,12 +117,14 @@
   }
 
   @Override
-  public @Nullable V edgeValueOrDefault(N nodeU, N nodeV, @Nullable V defaultValue) {
+  @CheckForNull
+  public V edgeValueOrDefault(N nodeU, N nodeV, @CheckForNull V defaultValue) {
     return delegate().edgeValueOrDefault(nodeU, nodeV, defaultValue);
   }
 
   @Override
-  public @Nullable V edgeValueOrDefault(EndpointPair<N> endpoints, @Nullable V defaultValue) {
+  @CheckForNull
+  public V edgeValueOrDefault(EndpointPair<N> endpoints, @CheckForNull V defaultValue) {
     return delegate().edgeValueOrDefault(endpoints, defaultValue);
   }
 }
diff --git a/guava/src/com/google/common/graph/Graph.java b/guava/src/com/google/common/graph/Graph.java
index 84f9695..5dc0e71 100644
--- a/guava/src/com/google/common/graph/Graph.java
+++ b/guava/src/com/google/common/graph/Graph.java
@@ -20,7 +20,7 @@
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Collection;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An interface for <a
@@ -103,6 +103,7 @@
  */
 @Beta
 @DoNotMock("Use GraphBuilder to create a real instance")
+@ElementTypesAreNonnullByDefault
 public interface Graph<N> extends BaseGraph<N> {
   //
   // Graph-level accessors
@@ -289,7 +290,7 @@
    * <p>A reference implementation of this is provided by {@link AbstractGraph#equals(Object)}.
    */
   @Override
-  boolean equals(@Nullable Object object);
+  boolean equals(@CheckForNull Object object);
 
   /**
    * Returns the hash code for this graph. The hash code of a graph is defined as the hash code of
diff --git a/guava/src/com/google/common/graph/GraphBuilder.java b/guava/src/com/google/common/graph/GraphBuilder.java
index f00d7b1..d57ed37 100644
--- a/guava/src/com/google/common/graph/GraphBuilder.java
+++ b/guava/src/com/google/common/graph/GraphBuilder.java
@@ -64,6 +64,7 @@
  */
 @Beta
 @DoNotMock
+@ElementTypesAreNonnullByDefault
 public final class GraphBuilder<N> extends AbstractGraphBuilder<N> {
 
   /** Creates a new instance with the specified edge directionality. */
diff --git a/guava/src/com/google/common/graph/GraphConnections.java b/guava/src/com/google/common/graph/GraphConnections.java
index bed5508..7d4f8f0 100644
--- a/guava/src/com/google/common/graph/GraphConnections.java
+++ b/guava/src/com/google/common/graph/GraphConnections.java
@@ -19,7 +19,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An interface for representing and manipulating an origin node's adjacent nodes and edge values in
@@ -29,6 +29,7 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
+@ElementTypesAreNonnullByDefault
 interface GraphConnections<N, V> {
 
   Set<N> adjacentNodes();
@@ -48,7 +49,7 @@
    * Returns the value associated with the edge connecting the origin node to {@code node}, or null
    * if there is no such edge.
    */
-  @Nullable
+  @CheckForNull
   V value(N node);
 
   /** Remove {@code node} from the set of predecessors. */
@@ -59,6 +60,7 @@
    * the edge connecting the two nodes.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V removeSuccessor(N node);
 
   /**
@@ -73,5 +75,6 @@
    * the value previously associated with the edge connecting the two nodes.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V addSuccessor(N node, V value);
 }
diff --git a/guava/src/com/google/common/graph/GraphConstants.java b/guava/src/com/google/common/graph/GraphConstants.java
index 224c6d2..ae224fd 100644
--- a/guava/src/com/google/common/graph/GraphConstants.java
+++ b/guava/src/com/google/common/graph/GraphConstants.java
@@ -16,7 +16,9 @@
 
 package com.google.common.graph;
 
+
 /** A utility class to hold various constants used by the Guava Graph library. */
+@ElementTypesAreNonnullByDefault
 final class GraphConstants {
 
   private GraphConstants() {}
diff --git a/guava/src/com/google/common/graph/Graphs.java b/guava/src/com/google/common/graph/Graphs.java
index 35f0efe..6ab9f56 100644
--- a/guava/src/com/google/common/graph/Graphs.java
+++ b/guava/src/com/google/common/graph/Graphs.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.graph.GraphConstants.NODE_NOT_IN_GRAPH;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
@@ -33,7 +34,7 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods for {@link Graph}, {@link ValueGraph}, and {@link Network} instances.
@@ -43,6 +44,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class Graphs {
 
   private Graphs() {}
@@ -99,7 +101,10 @@
    * cycle in the graph.
    */
   private static <N> boolean subgraphHasCycle(
-      Graph<N> graph, Map<Object, NodeVisitState> visitedNodes, N node, @Nullable N previousNode) {
+      Graph<N> graph,
+      Map<Object, NodeVisitState> visitedNodes,
+      N node,
+      @CheckForNull N previousNode) {
     NodeVisitState state = visitedNodes.get(node);
     if (state == NodeVisitState.COMPLETE) {
       return false;
@@ -126,7 +131,7 @@
    * from B to A).
    */
   private static boolean canTraverseWithoutReusingEdge(
-      Graph<?> graph, Object nextNode, @Nullable Object previousNode) {
+      Graph<?> graph, Object nextNode, @CheckForNull Object previousNode) {
     if (graph.isDirected() || !Objects.equal(previousNode, nextNode)) {
       return true;
     }
@@ -263,7 +268,7 @@
     }
 
     @Override
-    protected Graph<N> delegate() {
+    Graph<N> delegate() {
       return graph;
     }
 
@@ -325,7 +330,7 @@
     }
 
     @Override
-    protected ValueGraph<N, V> delegate() {
+    ValueGraph<N, V> delegate() {
       return graph;
     }
 
@@ -370,12 +375,14 @@
     }
 
     @Override
-    public @Nullable V edgeValueOrDefault(N nodeU, N nodeV, @Nullable V defaultValue) {
+    @CheckForNull
+    public V edgeValueOrDefault(N nodeU, N nodeV, @CheckForNull V defaultValue) {
       return delegate().edgeValueOrDefault(nodeV, nodeU, defaultValue); // transpose
     }
 
     @Override
-    public @Nullable V edgeValueOrDefault(EndpointPair<N> endpoints, @Nullable V defaultValue) {
+    @CheckForNull
+    public V edgeValueOrDefault(EndpointPair<N> endpoints, @CheckForNull V defaultValue) {
       return delegate().edgeValueOrDefault(transpose(endpoints), defaultValue);
     }
   }
@@ -388,7 +395,7 @@
     }
 
     @Override
-    protected Network<N, E> delegate() {
+    Network<N, E> delegate() {
       return network;
     }
 
@@ -449,11 +456,13 @@
     }
 
     @Override
+    @CheckForNull
     public E edgeConnectingOrNull(N nodeU, N nodeV) {
       return delegate().edgeConnectingOrNull(nodeV, nodeU); // transpose
     }
 
     @Override
+    @CheckForNull
     public E edgeConnectingOrNull(EndpointPair<N> endpoints) {
       return delegate().edgeConnectingOrNull(transpose(endpoints));
     }
@@ -516,8 +525,11 @@
     for (N node : subgraph.nodes()) {
       for (N successorNode : graph.successors(node)) {
         if (subgraph.nodes().contains(successorNode)) {
+          // requireNonNull is safe because the endpoint pair comes from the graph.
           subgraph.putEdgeValue(
-              node, successorNode, graph.edgeValueOrDefault(node, successorNode, null));
+              node,
+              successorNode,
+              requireNonNull(graph.edgeValueOrDefault(node, successorNode, null)));
         }
       }
     }
@@ -572,8 +584,11 @@
       copy.addNode(node);
     }
     for (EndpointPair<N> edge : graph.edges()) {
+      // requireNonNull is safe because the endpoint pair comes from the graph.
       copy.putEdgeValue(
-          edge.nodeU(), edge.nodeV(), graph.edgeValueOrDefault(edge.nodeU(), edge.nodeV(), null));
+          edge.nodeU(),
+          edge.nodeV(),
+          requireNonNull(graph.edgeValueOrDefault(edge.nodeU(), edge.nodeV(), null)));
     }
     return copy;
   }
diff --git a/guava/src/com/google/common/graph/ImmutableGraph.java b/guava/src/com/google/common/graph/ImmutableGraph.java
index 4027ca8..afad211 100644
--- a/guava/src/com/google/common/graph/ImmutableGraph.java
+++ b/guava/src/com/google/common/graph/ImmutableGraph.java
@@ -45,6 +45,7 @@
  */
 @Beta
 @Immutable(containerOf = {"N"})
+@ElementTypesAreNonnullByDefault
 public class ImmutableGraph<N> extends ForwardingGraph<N> {
   @SuppressWarnings("Immutable") // The backing graph must be immutable.
   private final BaseGraph<N> backingGraph;
@@ -100,7 +101,7 @@
   }
 
   @Override
-  protected BaseGraph<N> delegate() {
+  BaseGraph<N> delegate() {
     return backingGraph;
   }
 
diff --git a/guava/src/com/google/common/graph/ImmutableNetwork.java b/guava/src/com/google/common/graph/ImmutableNetwork.java
index b35d722..cb636aa 100644
--- a/guava/src/com/google/common/graph/ImmutableNetwork.java
+++ b/guava/src/com/google/common/graph/ImmutableNetwork.java
@@ -46,6 +46,7 @@
 @Beta
 @Immutable(containerOf = {"N", "E"})
 @SuppressWarnings("Immutable") // Extends StandardNetwork but uses ImmutableMaps.
+@ElementTypesAreNonnullByDefault
 public final class ImmutableNetwork<N, E> extends StandardNetwork<N, E> {
 
   private ImmutableNetwork(Network<N, E> network) {
diff --git a/guava/src/com/google/common/graph/ImmutableValueGraph.java b/guava/src/com/google/common/graph/ImmutableValueGraph.java
index f2e2386..a1567da 100644
--- a/guava/src/com/google/common/graph/ImmutableValueGraph.java
+++ b/guava/src/com/google/common/graph/ImmutableValueGraph.java
@@ -17,6 +17,7 @@
 package com.google.common.graph;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
@@ -43,6 +44,7 @@
 @Beta
 @Immutable(containerOf = {"N", "V"})
 @SuppressWarnings("Immutable") // Extends StandardValueGraph but uses ImmutableMaps.
+@ElementTypesAreNonnullByDefault
 public final class ImmutableValueGraph<N, V> extends StandardValueGraph<N, V> {
 
   private ImmutableValueGraph(ValueGraph<N, V> graph) {
@@ -94,7 +96,8 @@
         new Function<N, V>() {
           @Override
           public V apply(N successorNode) {
-            return graph.edgeValueOrDefault(node, successorNode, null);
+            // requireNonNull is safe because the endpoint pair comes from the graph.
+            return requireNonNull(graph.edgeValueOrDefault(node, successorNode, null));
           }
         };
     return graph.isDirected()
diff --git a/guava/src/com/google/common/graph/IncidentEdgeSet.java b/guava/src/com/google/common/graph/IncidentEdgeSet.java
index f306a67..ac94b65 100644
--- a/guava/src/com/google/common/graph/IncidentEdgeSet.java
+++ b/guava/src/com/google/common/graph/IncidentEdgeSet.java
@@ -18,15 +18,16 @@
 
 import java.util.AbstractSet;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Abstract base class for an incident edges set that allows different implementations of {@link
  * AbstractSet#iterator()}.
  */
+@ElementTypesAreNonnullByDefault
 abstract class IncidentEdgeSet<N> extends AbstractSet<EndpointPair<N>> {
-  protected final N node;
-  protected final BaseGraph<N> graph;
+  final N node;
+  final BaseGraph<N> graph;
 
   IncidentEdgeSet(BaseGraph<N> graph, N node) {
     this.graph = graph;
@@ -34,7 +35,7 @@
   }
 
   @Override
-  public boolean remove(Object o) {
+  public boolean remove(@CheckForNull Object o) {
     throw new UnsupportedOperationException();
   }
 
@@ -50,7 +51,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object obj) {
+  public boolean contains(@CheckForNull Object obj) {
     if (!(obj instanceof EndpointPair)) {
       return false;
     }
diff --git a/guava/src/com/google/common/graph/MapIteratorCache.java b/guava/src/com/google/common/graph/MapIteratorCache.java
index 182a67f..aae9187 100644
--- a/guava/src/com/google/common/graph/MapIteratorCache.java
+++ b/guava/src/com/google/common/graph/MapIteratorCache.java
@@ -25,7 +25,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A map-like data structure that wraps a backing map and caches values while iterating through
@@ -41,6 +41,7 @@
  *
  * @author James Sexton
  */
+@ElementTypesAreNonnullByDefault
 class MapIteratorCache<K, V> {
   private final Map<K, V> backingMap;
 
@@ -53,43 +54,57 @@
    * while writing to it in another. All it does is help with _reading_ from multiple threads
    * concurrently. For more information, see AbstractNetworkTest.concurrentIteration.
    */
-  private transient volatile @Nullable Entry<K, V> cacheEntry;
+  @CheckForNull private transient volatile Entry<K, V> cacheEntry;
 
   MapIteratorCache(Map<K, V> backingMap) {
     this.backingMap = checkNotNull(backingMap);
   }
 
   @CanIgnoreReturnValue
-  public final V put(@Nullable K key, @Nullable V value) {
+  @CheckForNull
+  final V put(K key, V value) {
+    checkNotNull(key);
+    checkNotNull(value);
     clearCache();
     return backingMap.put(key, value);
   }
 
   @CanIgnoreReturnValue
-  public final V remove(@Nullable Object key) {
+  @CheckForNull
+  final V remove(Object key) {
+    checkNotNull(key);
     clearCache();
     return backingMap.remove(key);
   }
 
-  public final void clear() {
+  final void clear() {
     clearCache();
     backingMap.clear();
   }
 
-  public V get(@Nullable Object key) {
+  @CheckForNull
+  V get(Object key) {
+    checkNotNull(key);
     V value = getIfCached(key);
-    return (value != null) ? value : getWithoutCaching(key);
+    // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+    if (value == null) {
+      return getWithoutCaching(key);
+    } else {
+      return value;
+    }
   }
 
-  public final V getWithoutCaching(@Nullable Object key) {
+  @CheckForNull
+  final V getWithoutCaching(Object key) {
+    checkNotNull(key);
     return backingMap.get(key);
   }
 
-  public final boolean containsKey(@Nullable Object key) {
+  final boolean containsKey(@CheckForNull Object key) {
     return getIfCached(key) != null || backingMap.containsKey(key);
   }
 
-  public final Set<K> unmodifiableKeySet() {
+  final Set<K> unmodifiableKeySet() {
     return new AbstractSet<K>() {
       @Override
       public UnmodifiableIterator<K> iterator() {
@@ -116,15 +131,16 @@
       }
 
       @Override
-      public boolean contains(@Nullable Object key) {
+      public boolean contains(@CheckForNull Object key) {
         return containsKey(key);
       }
     };
   }
 
-  // Internal methods ('protected' is still package-visible, but treat as only subclass-visible)
+  // Internal methods (package-visible, but treat as only subclass-visible)
 
-  protected V getIfCached(@Nullable Object key) {
+  @CheckForNull
+  V getIfCached(@CheckForNull Object key) {
     Entry<K, V> entry = cacheEntry; // store local reference for thread-safety
 
     // Check cache. We use == on purpose because it's cheaper and a cache miss is ok.
@@ -134,7 +150,7 @@
     return null;
   }
 
-  protected void clearCache() {
+  void clearCache() {
     cacheEntry = null;
   }
 }
diff --git a/guava/src/com/google/common/graph/MapRetrievalCache.java b/guava/src/com/google/common/graph/MapRetrievalCache.java
index 3a406e9..ada78f2 100644
--- a/guava/src/com/google/common/graph/MapRetrievalCache.java
+++ b/guava/src/com/google/common/graph/MapRetrievalCache.java
@@ -16,8 +16,10 @@
 
 package com.google.common.graph;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import java.util.Map;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link MapIteratorCache} that adds additional caching. In addition to the caching provided by
@@ -25,10 +27,11 @@
  *
  * @author James Sexton
  */
-class MapRetrievalCache<K, V> extends MapIteratorCache<K, V> {
+@ElementTypesAreNonnullByDefault
+final class MapRetrievalCache<K, V> extends MapIteratorCache<K, V> {
   // See the note about volatile in the superclass.
-  private transient volatile @Nullable CacheEntry<K, V> cacheEntry1;
-  private transient volatile @Nullable CacheEntry<K, V> cacheEntry2;
+  @CheckForNull private transient volatile CacheEntry<K, V> cacheEntry1;
+  @CheckForNull private transient volatile CacheEntry<K, V> cacheEntry2;
 
   MapRetrievalCache(Map<K, V> backingMap) {
     super(backingMap);
@@ -36,7 +39,9 @@
 
   @SuppressWarnings("unchecked") // Safe because we only cast if key is found in map.
   @Override
-  public V get(@Nullable Object key) {
+  @CheckForNull
+  V get(Object key) {
+    checkNotNull(key);
     V value = getIfCached(key);
     if (value != null) {
       return value;
@@ -49,10 +54,11 @@
     return value;
   }
 
-  // Internal methods ('protected' is still package-visible, but treat as only subclass-visible)
+  // Internal methods (package-visible, but treat as only subclass-visible)
 
   @Override
-  protected V getIfCached(@Nullable Object key) {
+  @CheckForNull
+  V getIfCached(@CheckForNull Object key) {
     V value = super.getIfCached(key);
     if (value != null) {
       return value;
@@ -78,7 +84,7 @@
   }
 
   @Override
-  protected void clearCache() {
+  void clearCache() {
     super.clearCache();
     cacheEntry1 = null;
     cacheEntry2 = null;
diff --git a/guava/src/com/google/common/graph/MultiEdgesConnecting.java b/guava/src/com/google/common/graph/MultiEdgesConnecting.java
index 5bddfbb..8a4250e 100644
--- a/guava/src/com/google/common/graph/MultiEdgesConnecting.java
+++ b/guava/src/com/google/common/graph/MultiEdgesConnecting.java
@@ -24,7 +24,7 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A class to represent the set of edges connecting an (implicit) origin node to a target node.
@@ -35,6 +35,7 @@
  * @author James Sexton
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 abstract class MultiEdgesConnecting<E> extends AbstractSet<E> {
 
   private final Map<E, ?> outEdgeToNode;
@@ -50,6 +51,7 @@
     final Iterator<? extends Entry<E, ?>> entries = outEdgeToNode.entrySet().iterator();
     return new AbstractIterator<E>() {
       @Override
+      @CheckForNull
       protected E computeNext() {
         while (entries.hasNext()) {
           Entry<E, ?> entry = entries.next();
@@ -63,7 +65,7 @@
   }
 
   @Override
-  public boolean contains(@Nullable Object edge) {
+  public boolean contains(@CheckForNull Object edge) {
     return targetNode.equals(outEdgeToNode.get(edge));
   }
 }
diff --git a/guava/src/com/google/common/graph/MutableGraph.java b/guava/src/com/google/common/graph/MutableGraph.java
index 8324079..b1f3359 100644
--- a/guava/src/com/google/common/graph/MutableGraph.java
+++ b/guava/src/com/google/common/graph/MutableGraph.java
@@ -29,6 +29,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public interface MutableGraph<N> extends Graph<N> {
 
   /**
diff --git a/guava/src/com/google/common/graph/MutableNetwork.java b/guava/src/com/google/common/graph/MutableNetwork.java
index d702903..64acb13 100644
--- a/guava/src/com/google/common/graph/MutableNetwork.java
+++ b/guava/src/com/google/common/graph/MutableNetwork.java
@@ -30,6 +30,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public interface MutableNetwork<N, E> extends Network<N, E> {
 
   /**
diff --git a/guava/src/com/google/common/graph/MutableValueGraph.java b/guava/src/com/google/common/graph/MutableValueGraph.java
index 70b286d..f32d2ee 100644
--- a/guava/src/com/google/common/graph/MutableValueGraph.java
+++ b/guava/src/com/google/common/graph/MutableValueGraph.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import javax.annotation.CheckForNull;
 
 /**
  * A subinterface of {@link ValueGraph} which adds mutation methods. When mutation is not required,
@@ -29,6 +30,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public interface MutableValueGraph<N, V> extends ValueGraph<N, V> {
 
   /**
@@ -59,6 +61,7 @@
    *     #allowsSelfLoops()}
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V putEdgeValue(N nodeU, N nodeV, V value);
 
   /**
@@ -83,6 +86,7 @@
    * @since 27.1
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V putEdgeValue(EndpointPair<N> endpoints, V value);
 
   /**
@@ -100,6 +104,7 @@
    *     nodeV}, or null if there was no such edge.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V removeEdge(N nodeU, N nodeV);
 
   /**
@@ -112,5 +117,6 @@
    * @since 27.1
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   V removeEdge(EndpointPair<N> endpoints);
 }
diff --git a/guava/src/com/google/common/graph/Network.java b/guava/src/com/google/common/graph/Network.java
index 6bb8452..c700d33 100644
--- a/guava/src/com/google/common/graph/Network.java
+++ b/guava/src/com/google/common/graph/Network.java
@@ -20,7 +20,7 @@
 import com.google.errorprone.annotations.DoNotMock;
 import java.util.Optional;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An interface for <a
@@ -104,6 +104,7 @@
  */
 @Beta
 @DoNotMock("Use NetworkBuilder to create a real instance")
+@ElementTypesAreNonnullByDefault
 public interface Network<N, E> extends SuccessorsFunction<N>, PredecessorsFunction<N> {
   //
   // Network-level accessors
@@ -348,7 +349,7 @@
    *     network
    * @since 23.0
    */
-  @Nullable
+  @CheckForNull
   E edgeConnectingOrNull(N nodeU, N nodeV);
 
   /**
@@ -363,7 +364,7 @@
    * @throws IllegalArgumentException if the endpoints are unordered and the graph is directed
    * @since 27.1
    */
-  @Nullable
+  @CheckForNull
   E edgeConnectingOrNull(EndpointPair<N> endpoints);
 
   /**
@@ -415,7 +416,7 @@
    * <p>A reference implementation of this is provided by {@link AbstractNetwork#equals(Object)}.
    */
   @Override
-  boolean equals(@Nullable Object object);
+  boolean equals(@CheckForNull Object object);
 
   /**
    * Returns the hash code for this network. The hash code of a network is defined as the hash code
diff --git a/guava/src/com/google/common/graph/NetworkBuilder.java b/guava/src/com/google/common/graph/NetworkBuilder.java
index d289ee2..9689444 100644
--- a/guava/src/com/google/common/graph/NetworkBuilder.java
+++ b/guava/src/com/google/common/graph/NetworkBuilder.java
@@ -67,6 +67,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class NetworkBuilder<N, E> extends AbstractGraphBuilder<N> {
   boolean allowsParallelEdges = false;
   ElementOrder<? super E> edgeOrder = ElementOrder.insertion();
diff --git a/guava/src/com/google/common/graph/NetworkConnections.java b/guava/src/com/google/common/graph/NetworkConnections.java
index 16a68d6..94d1780 100644
--- a/guava/src/com/google/common/graph/NetworkConnections.java
+++ b/guava/src/com/google/common/graph/NetworkConnections.java
@@ -18,6 +18,7 @@
 
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 
 /**
  * An interface for representing and manipulating an origin node's adjacent nodes and incident edges
@@ -27,6 +28,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 interface NetworkConnections<N, E> {
 
   Set<N> adjacentNodes();
@@ -60,6 +62,7 @@
    * <p>In the undirected case, returns {@code null} if {@code isSelfLoop} is true.
    */
   @CanIgnoreReturnValue
+  @CheckForNull
   N removeInEdge(E edge, boolean isSelfLoop);
 
   /** Remove {@code edge} from the set of outgoing edges. Returns the former successor node. */
diff --git a/guava/src/com/google/common/graph/ParametricNullness.java b/guava/src/com/google/common/graph/ParametricNullness.java
new file mode 100644
index 0000000..62534eb
--- /dev/null
+++ b/guava/src/com/google/common/graph/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.graph;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/graph/PredecessorsFunction.java b/guava/src/com/google/common/graph/PredecessorsFunction.java
index f9ca48a..750a8ac 100644
--- a/guava/src/com/google/common/graph/PredecessorsFunction.java
+++ b/guava/src/com/google/common/graph/PredecessorsFunction.java
@@ -80,6 +80,7 @@
  */
 @Beta
 @DoNotMock("Implement with a lambda, or use GraphBuilder to build a Graph with the desired edges")
+@ElementTypesAreNonnullByDefault
 public interface PredecessorsFunction<N> {
 
   /**
diff --git a/guava/src/com/google/common/graph/StandardMutableGraph.java b/guava/src/com/google/common/graph/StandardMutableGraph.java
index 41acccf..1be9640 100644
--- a/guava/src/com/google/common/graph/StandardMutableGraph.java
+++ b/guava/src/com/google/common/graph/StandardMutableGraph.java
@@ -28,6 +28,7 @@
  * @author James Sexton
  * @param <N> Node parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class StandardMutableGraph<N> extends ForwardingGraph<N> implements MutableGraph<N> {
   private final MutableValueGraph<N, Presence> backingValueGraph;
 
@@ -37,7 +38,7 @@
   }
 
   @Override
-  protected BaseGraph<N> delegate() {
+  BaseGraph<N> delegate() {
     return backingValueGraph;
   }
 
diff --git a/guava/src/com/google/common/graph/StandardMutableNetwork.java b/guava/src/com/google/common/graph/StandardMutableNetwork.java
index 8cfe9c5..c58b6d3 100644
--- a/guava/src/com/google/common/graph/StandardMutableNetwork.java
+++ b/guava/src/com/google/common/graph/StandardMutableNetwork.java
@@ -22,6 +22,7 @@
 import static com.google.common.graph.GraphConstants.PARALLEL_EDGES_NOT_ALLOWED;
 import static com.google.common.graph.GraphConstants.REUSING_EDGE;
 import static com.google.common.graph.GraphConstants.SELF_LOOPS_NOT_ALLOWED;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableList;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -39,6 +40,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class StandardMutableNetwork<N, E> extends StandardNetwork<N, E>
     implements MutableNetwork<N, E> {
 
@@ -152,9 +154,10 @@
       return false;
     }
 
-    NetworkConnections<N, E> connectionsU = nodeConnections.get(nodeU);
+    // requireNonNull is safe because of the edgeToReferenceNode check above.
+    NetworkConnections<N, E> connectionsU = requireNonNull(nodeConnections.get(nodeU));
     N nodeV = connectionsU.adjacentNode(edge);
-    NetworkConnections<N, E> connectionsV = nodeConnections.get(nodeV);
+    NetworkConnections<N, E> connectionsV = requireNonNull(nodeConnections.get(nodeV));
     connectionsU.removeOutEdge(edge);
     connectionsV.removeInEdge(edge, allowsSelfLoops() && nodeU.equals(nodeV));
     edgeToReferenceNode.remove(edge);
diff --git a/guava/src/com/google/common/graph/StandardMutableValueGraph.java b/guava/src/com/google/common/graph/StandardMutableValueGraph.java
index 558d8d6..0ea641a 100644
--- a/guava/src/com/google/common/graph/StandardMutableValueGraph.java
+++ b/guava/src/com/google/common/graph/StandardMutableValueGraph.java
@@ -22,8 +22,10 @@
 import static com.google.common.graph.GraphConstants.SELF_LOOPS_NOT_ALLOWED;
 import static com.google.common.graph.Graphs.checkNonNegative;
 import static com.google.common.graph.Graphs.checkPositive;
+import static java.util.Objects.requireNonNull;
 
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import javax.annotation.CheckForNull;
 
 /**
  * Standard implementation of {@link MutableValueGraph} that supports both directed and undirected
@@ -38,6 +40,7 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class StandardMutableValueGraph<N, V> extends StandardValueGraph<N, V>
     implements MutableValueGraph<N, V> {
 
@@ -81,6 +84,7 @@
 
   @Override
   @CanIgnoreReturnValue
+  @CheckForNull
   public V putEdgeValue(N nodeU, N nodeV, V value) {
     checkNotNull(nodeU, "nodeU");
     checkNotNull(nodeV, "nodeV");
@@ -108,6 +112,7 @@
 
   @Override
   @CanIgnoreReturnValue
+  @CheckForNull
   public V putEdgeValue(EndpointPair<N> endpoints, V value) {
     validateEndpoints(endpoints);
     return putEdgeValue(endpoints.nodeU(), endpoints.nodeV(), value);
@@ -132,12 +137,16 @@
     }
 
     for (N successor : connections.successors()) {
-      nodeConnections.getWithoutCaching(successor).removePredecessor(node);
+      // requireNonNull is safe because the node is a successor.
+      requireNonNull(nodeConnections.getWithoutCaching(successor)).removePredecessor(node);
       --edgeCount;
     }
     if (isDirected()) { // In undirected graphs, the successor and predecessor sets are equal.
       for (N predecessor : connections.predecessors()) {
-        checkState(nodeConnections.getWithoutCaching(predecessor).removeSuccessor(node) != null);
+        // requireNonNull is safe because the node is a predecessor.
+        checkState(
+            requireNonNull(nodeConnections.getWithoutCaching(predecessor)).removeSuccessor(node)
+                != null);
         --edgeCount;
       }
     }
@@ -148,6 +157,7 @@
 
   @Override
   @CanIgnoreReturnValue
+  @CheckForNull
   public V removeEdge(N nodeU, N nodeV) {
     checkNotNull(nodeU, "nodeU");
     checkNotNull(nodeV, "nodeV");
@@ -168,6 +178,7 @@
 
   @Override
   @CanIgnoreReturnValue
+  @CheckForNull
   public V removeEdge(EndpointPair<N> endpoints) {
     validateEndpoints(endpoints);
     return removeEdge(endpoints.nodeU(), endpoints.nodeV());
diff --git a/guava/src/com/google/common/graph/StandardNetwork.java b/guava/src/com/google/common/graph/StandardNetwork.java
index 1b82301..2aa103f 100644
--- a/guava/src/com/google/common/graph/StandardNetwork.java
+++ b/guava/src/com/google/common/graph/StandardNetwork.java
@@ -22,12 +22,12 @@
 import static com.google.common.graph.GraphConstants.DEFAULT_NODE_COUNT;
 import static com.google.common.graph.GraphConstants.EDGE_NOT_IN_GRAPH;
 import static com.google.common.graph.GraphConstants.NODE_NOT_IN_GRAPH;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Standard implementation of {@link Network} that supports the options supplied by {@link
@@ -48,6 +48,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 class StandardNetwork<N, E> extends AbstractNetwork<N, E> {
   private final boolean isDirected;
   private final boolean allowsParallelEdges;
@@ -55,11 +56,11 @@
   private final ElementOrder<N> nodeOrder;
   private final ElementOrder<E> edgeOrder;
 
-  protected final MapIteratorCache<N, NetworkConnections<N, E>> nodeConnections;
+  final MapIteratorCache<N, NetworkConnections<N, E>> nodeConnections;
 
   // We could make this a Map<E, EndpointPair<N>>. It would make incidentNodes(edge) slightly
   // faster, but also make Networks consume 5 to 20+% (increasing with average degree) more memory.
-  protected final MapIteratorCache<E, N> edgeToReferenceNode; // referenceNode == source if directed
+  final MapIteratorCache<E, N> edgeToReferenceNode; // referenceNode == source if directed
 
   /** Constructs a graph with the properties specified in {@code builder}. */
   StandardNetwork(NetworkBuilder<? super N, ? super E> builder) {
@@ -135,7 +136,8 @@
   @Override
   public EndpointPair<N> incidentNodes(E edge) {
     N nodeU = checkedReferenceNode(edge);
-    N nodeV = nodeConnections.get(nodeU).adjacentNode(edge);
+    // requireNonNull is safe because checkedReferenceNode made sure the edge is in the network.
+    N nodeV = requireNonNull(nodeConnections.get(nodeU)).adjacentNode(edge);
     return EndpointPair.of(this, nodeU, nodeV);
   }
 
@@ -174,7 +176,7 @@
     return checkedConnections(node).successors();
   }
 
-  protected final NetworkConnections<N, E> checkedConnections(N node) {
+  final NetworkConnections<N, E> checkedConnections(N node) {
     NetworkConnections<N, E> connections = nodeConnections.get(node);
     if (connections == null) {
       checkNotNull(node);
@@ -183,7 +185,7 @@
     return connections;
   }
 
-  protected final N checkedReferenceNode(E edge) {
+  final N checkedReferenceNode(E edge) {
     N referenceNode = edgeToReferenceNode.get(edge);
     if (referenceNode == null) {
       checkNotNull(edge);
@@ -192,11 +194,11 @@
     return referenceNode;
   }
 
-  protected final boolean containsNode(@Nullable N node) {
+  final boolean containsNode(N node) {
     return nodeConnections.containsKey(node);
   }
 
-  protected final boolean containsEdge(@Nullable E edge) {
+  final boolean containsEdge(E edge) {
     return edgeToReferenceNode.containsKey(edge);
   }
 }
diff --git a/guava/src/com/google/common/graph/StandardValueGraph.java b/guava/src/com/google/common/graph/StandardValueGraph.java
index 8da0b0f..f2c71bc 100644
--- a/guava/src/com/google/common/graph/StandardValueGraph.java
+++ b/guava/src/com/google/common/graph/StandardValueGraph.java
@@ -24,7 +24,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Standard implementation of {@link ValueGraph} that supports the options supplied by {@link
@@ -43,14 +43,15 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
+@ElementTypesAreNonnullByDefault
 class StandardValueGraph<N, V> extends AbstractValueGraph<N, V> {
   private final boolean isDirected;
   private final boolean allowsSelfLoops;
   private final ElementOrder<N> nodeOrder;
 
-  protected final MapIteratorCache<N, GraphConnections<N, V>> nodeConnections;
+  final MapIteratorCache<N, GraphConnections<N, V>> nodeConnections;
 
-  protected long edgeCount; // must be updated when edges are added or removed
+  long edgeCount; // must be updated when edges are added or removed
 
   /** Constructs a graph with the properties specified in {@code builder}. */
   StandardValueGraph(AbstractGraphBuilder<? super N> builder) {
@@ -129,25 +130,27 @@
 
   @Override
   public boolean hasEdgeConnecting(N nodeU, N nodeV) {
-    return hasEdgeConnecting_internal(checkNotNull(nodeU), checkNotNull(nodeV));
+    return hasEdgeConnectingInternal(checkNotNull(nodeU), checkNotNull(nodeV));
   }
 
   @Override
   public boolean hasEdgeConnecting(EndpointPair<N> endpoints) {
     checkNotNull(endpoints);
     return isOrderingCompatible(endpoints)
-        && hasEdgeConnecting_internal(endpoints.nodeU(), endpoints.nodeV());
+        && hasEdgeConnectingInternal(endpoints.nodeU(), endpoints.nodeV());
   }
 
   @Override
-  public @Nullable V edgeValueOrDefault(N nodeU, N nodeV, @Nullable V defaultValue) {
-    return edgeValueOrDefault_internal(checkNotNull(nodeU), checkNotNull(nodeV), defaultValue);
+  @CheckForNull
+  public V edgeValueOrDefault(N nodeU, N nodeV, @CheckForNull V defaultValue) {
+    return edgeValueOrDefaultInternal(checkNotNull(nodeU), checkNotNull(nodeV), defaultValue);
   }
 
   @Override
-  public @Nullable V edgeValueOrDefault(EndpointPair<N> endpoints, @Nullable V defaultValue) {
+  @CheckForNull
+  public V edgeValueOrDefault(EndpointPair<N> endpoints, @CheckForNull V defaultValue) {
     validateEndpoints(endpoints);
-    return edgeValueOrDefault_internal(endpoints.nodeU(), endpoints.nodeV(), defaultValue);
+    return edgeValueOrDefaultInternal(endpoints.nodeU(), endpoints.nodeV(), defaultValue);
   }
 
   @Override
@@ -155,7 +158,7 @@
     return edgeCount;
   }
 
-  protected final GraphConnections<N, V> checkedConnections(N node) {
+  private final GraphConnections<N, V> checkedConnections(N node) {
     GraphConnections<N, V> connections = nodeConnections.get(node);
     if (connections == null) {
       checkNotNull(node);
@@ -164,18 +167,24 @@
     return connections;
   }
 
-  protected final boolean containsNode(@Nullable N node) {
+  final boolean containsNode(@CheckForNull N node) {
     return nodeConnections.containsKey(node);
   }
 
-  protected final boolean hasEdgeConnecting_internal(N nodeU, N nodeV) {
+  private final boolean hasEdgeConnectingInternal(N nodeU, N nodeV) {
     GraphConnections<N, V> connectionsU = nodeConnections.get(nodeU);
     return (connectionsU != null) && connectionsU.successors().contains(nodeV);
   }
 
-  protected final V edgeValueOrDefault_internal(N nodeU, N nodeV, V defaultValue) {
+  @CheckForNull
+  private final V edgeValueOrDefaultInternal(N nodeU, N nodeV, @CheckForNull V defaultValue) {
     GraphConnections<N, V> connectionsU = nodeConnections.get(nodeU);
     V value = (connectionsU == null) ? null : connectionsU.value(nodeV);
-    return value == null ? defaultValue : value;
+    // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+    if (value == null) {
+      return defaultValue;
+    } else {
+      return value;
+    }
   }
 }
diff --git a/guava/src/com/google/common/graph/SuccessorsFunction.java b/guava/src/com/google/common/graph/SuccessorsFunction.java
index f74f437..c29bb4b 100644
--- a/guava/src/com/google/common/graph/SuccessorsFunction.java
+++ b/guava/src/com/google/common/graph/SuccessorsFunction.java
@@ -80,6 +80,7 @@
  */
 @Beta
 @DoNotMock("Implement with a lambda, or use GraphBuilder to build a Graph with the desired edges")
+@ElementTypesAreNonnullByDefault
 public interface SuccessorsFunction<N> {
 
   /**
diff --git a/guava/src/com/google/common/graph/Traverser.java b/guava/src/com/google/common/graph/Traverser.java
index be0eecb..5a36f9f 100644
--- a/guava/src/com/google/common/graph/Traverser.java
+++ b/guava/src/com/google/common/graph/Traverser.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.collect.AbstractIterator;
@@ -28,7 +29,7 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An object that can traverse the nodes that are reachable from a specified (set of) start node(s)
@@ -63,6 +64,7 @@
 @DoNotMock(
     "Call forGraph or forTree, passing a lambda or a Graph with the desired edges (built with"
         + " GraphBuilder)")
+@ElementTypesAreNonnullByDefault
 public abstract class Traverser<N> {
   private final SuccessorsFunction<N> successorFunction;
 
@@ -383,10 +385,20 @@
       final Set<N> visited = new HashSet<>();
       return new Traversal<N>(graph) {
         @Override
+        @CheckForNull
         N visitNext(Deque<Iterator<? extends N>> horizon) {
           Iterator<? extends N> top = horizon.getFirst();
           while (top.hasNext()) {
-            N element = checkNotNull(top.next());
+            N element = top.next();
+            // requireNonNull is safe because horizon contains only graph nodes.
+            /*
+             * TODO(cpovirk): Replace these two statements with one (`N element =
+             * requireNonNull(top.next())`) once our checker supports it.
+             *
+             * (The problem is likely
+             * https://github.com/jspecify/nullness-checker-for-checker-framework/blob/61aafa4ae52594830cfc2d61c8b113009dbdb045/src/main/java/com/google/jspecify/nullness/NullSpecAnnotatedTypeFactory.java#L896)
+             */
+            requireNonNull(element);
             if (visited.add(element)) {
               return element;
             }
@@ -399,6 +411,7 @@
 
     static <N> Traversal<N> inTree(SuccessorsFunction<N> tree) {
       return new Traversal<N>(tree) {
+        @CheckForNull
         @Override
         N visitNext(Deque<Iterator<? extends N>> horizon) {
           Iterator<? extends N> top = horizon.getFirst();
@@ -430,6 +443,7 @@
       horizon.add(startNodes);
       return new AbstractIterator<N>() {
         @Override
+        @CheckForNull
         protected N computeNext() {
           do {
             N next = visitNext(horizon);
@@ -454,6 +468,7 @@
       horizon.add(startNodes);
       return new AbstractIterator<N>() {
         @Override
+        @CheckForNull
         protected N computeNext() {
           for (N next = visitNext(horizon); next != null; next = visitNext(horizon)) {
             Iterator<? extends N> successors = successorFunction.successors(next).iterator();
@@ -463,7 +478,11 @@
             horizon.addFirst(successors);
             ancestorStack.push(next);
           }
-          return ancestorStack.isEmpty() ? endOfData() : ancestorStack.pop();
+          // TODO(b/192579700): Use a ternary once it no longer confuses our nullness checker.
+          if (!ancestorStack.isEmpty()) {
+            return ancestorStack.pop();
+          }
+          return endOfData();
         }
       };
     }
@@ -478,7 +497,7 @@
      * into {@code horizon} between calls to {@code visitNext()}. This causes them to receive
      * additional values interleaved with those shown above.)
      */
-    @Nullable
+    @CheckForNull
     abstract N visitNext(Deque<Iterator<? extends N>> horizon);
   }
 
diff --git a/guava/src/com/google/common/graph/UndirectedGraphConnections.java b/guava/src/com/google/common/graph/UndirectedGraphConnections.java
index 49689f9..085e3a7 100644
--- a/guava/src/com/google/common/graph/UndirectedGraphConnections.java
+++ b/guava/src/com/google/common/graph/UndirectedGraphConnections.java
@@ -29,6 +29,7 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link GraphConnections} for undirected graphs.
@@ -37,6 +38,7 @@
  * @param <N> Node parameter type
  * @param <V> Value parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class UndirectedGraphConnections<N, V> implements GraphConnections<N, V> {
   private final Map<N, V> adjacentNodeValues;
 
@@ -89,6 +91,7 @@
   }
 
   @Override
+  @CheckForNull
   public V value(N node) {
     return adjacentNodeValues.get(node);
   }
@@ -100,6 +103,7 @@
   }
 
   @Override
+  @CheckForNull
   public V removeSuccessor(N node) {
     return adjacentNodeValues.remove(node);
   }
@@ -111,6 +115,7 @@
   }
 
   @Override
+  @CheckForNull
   public V addSuccessor(N node, V value) {
     return adjacentNodeValues.put(node, value);
   }
diff --git a/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java b/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
index a96a595..a5c45ca 100644
--- a/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
+++ b/guava/src/com/google/common/graph/UndirectedMultiNetworkConnections.java
@@ -30,7 +30,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An implementation of {@link NetworkConnections} for undirected networks with parallel edges.
@@ -39,6 +39,7 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class UndirectedMultiNetworkConnections<N, E>
     extends AbstractUndirectedNetworkConnections<N, E> {
 
@@ -55,7 +56,7 @@
     return new UndirectedMultiNetworkConnections<>(ImmutableMap.copyOf(incidentEdges));
   }
 
-  @LazyInit private transient Reference<Multiset<N>> adjacentNodesReference;
+  @CheckForNull @LazyInit private transient Reference<Multiset<N>> adjacentNodesReference;
 
   @Override
   public Set<N> adjacentNodes() {
@@ -82,6 +83,7 @@
   }
 
   @Override
+  @CheckForNull
   public N removeInEdge(E edge, boolean isSelfLoop) {
     if (!isSelfLoop) {
       return removeOutEdge(edge);
@@ -115,7 +117,8 @@
     }
   }
 
-  private static <T> @Nullable T getReference(@Nullable Reference<T> reference) {
+  @CheckForNull
+  private static <T> T getReference(@CheckForNull Reference<T> reference) {
     return (reference == null) ? null : reference.get();
   }
 }
diff --git a/guava/src/com/google/common/graph/UndirectedNetworkConnections.java b/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
index 1e253dd..38cb763 100644
--- a/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
+++ b/guava/src/com/google/common/graph/UndirectedNetworkConnections.java
@@ -32,9 +32,10 @@
  * @param <N> Node parameter type
  * @param <E> Edge parameter type
  */
+@ElementTypesAreNonnullByDefault
 final class UndirectedNetworkConnections<N, E> extends AbstractUndirectedNetworkConnections<N, E> {
 
-  protected UndirectedNetworkConnections(Map<E, N> incidentEdgeMap) {
+  UndirectedNetworkConnections(Map<E, N> incidentEdgeMap) {
     super(incidentEdgeMap);
   }
 
diff --git a/guava/src/com/google/common/graph/ValueGraph.java b/guava/src/com/google/common/graph/ValueGraph.java
index ed27058..a13e87e 100644
--- a/guava/src/com/google/common/graph/ValueGraph.java
+++ b/guava/src/com/google/common/graph/ValueGraph.java
@@ -20,7 +20,7 @@
 import java.util.Collection;
 import java.util.Optional;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An interface for <a
@@ -108,6 +108,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public interface ValueGraph<N, V> extends BaseGraph<N> {
   //
   // ValueGraph-level accessors
@@ -309,8 +310,8 @@
    * @throws IllegalArgumentException if {@code nodeU} or {@code nodeV} is not an element of this
    *     graph
    */
-  @Nullable
-  V edgeValueOrDefault(N nodeU, N nodeV, @Nullable V defaultValue);
+  @CheckForNull
+  V edgeValueOrDefault(N nodeU, N nodeV, @CheckForNull V defaultValue);
 
   /**
    * Returns the value of the edge that connects {@code endpoints} (in the order, if any, specified
@@ -322,8 +323,8 @@
    * @throws IllegalArgumentException if the endpoints are unordered and the graph is directed
    * @since 27.1
    */
-  @Nullable
-  V edgeValueOrDefault(EndpointPair<N> endpoints, @Nullable V defaultValue);
+  @CheckForNull
+  V edgeValueOrDefault(EndpointPair<N> endpoints, @CheckForNull V defaultValue);
 
   //
   // ValueGraph identity
@@ -350,7 +351,7 @@
    * <p>A reference implementation of this is provided by {@link AbstractValueGraph#equals(Object)}.
    */
   @Override
-  boolean equals(@Nullable Object object);
+  boolean equals(@CheckForNull Object object);
 
   /**
    * Returns the hash code for this graph. The hash code of a graph is defined as the hash code of a
diff --git a/guava/src/com/google/common/graph/ValueGraphBuilder.java b/guava/src/com/google/common/graph/ValueGraphBuilder.java
index 4fc752d..ce146c3 100644
--- a/guava/src/com/google/common/graph/ValueGraphBuilder.java
+++ b/guava/src/com/google/common/graph/ValueGraphBuilder.java
@@ -66,6 +66,7 @@
  * @since 20.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class ValueGraphBuilder<N, V> extends AbstractGraphBuilder<N> {
 
   /** Creates a new instance with the specified edge directionality. */
diff --git a/guava/src/com/google/common/hash/AbstractByteHasher.java b/guava/src/com/google/common/hash/AbstractByteHasher.java
index 48d48c4..9f7e041 100644
--- a/guava/src/com/google/common/hash/AbstractByteHasher.java
+++ b/guava/src/com/google/common/hash/AbstractByteHasher.java
@@ -32,6 +32,7 @@
  * @author Colin Decker
  */
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 abstract class AbstractByteHasher extends AbstractHasher {
   private final ByteBuffer scratch = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);
 
diff --git a/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java b/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
index 048e6c2..4b69bb7 100644
--- a/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
+++ b/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java
@@ -20,6 +20,7 @@
 import com.google.errorprone.annotations.Immutable;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An abstract composition of multiple hash functions. {@linkplain #newHasher()} delegates to the
@@ -29,6 +30,7 @@
  * @author Dimitris Andreou
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 abstract class AbstractCompositeHashFunction extends AbstractHashFunction {
 
   @SuppressWarnings("Immutable") // array not modified after creation
@@ -177,7 +179,8 @@
       }
 
       @Override
-      public <T> Hasher putObject(T instance, Funnel<? super T> funnel) {
+      public <T extends @Nullable Object> Hasher putObject(
+          @ParametricNullness T instance, Funnel<? super T> funnel) {
         for (Hasher hasher : hashers) {
           hasher.putObject(instance, funnel);
         }
diff --git a/guava/src/com/google/common/hash/AbstractHashFunction.java b/guava/src/com/google/common/hash/AbstractHashFunction.java
index 6184189..7308556 100644
--- a/guava/src/com/google/common/hash/AbstractHashFunction.java
+++ b/guava/src/com/google/common/hash/AbstractHashFunction.java
@@ -20,6 +20,7 @@
 import com.google.errorprone.annotations.Immutable;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Skeleton implementation of {@link HashFunction} in terms of {@link #newHasher()}.
@@ -27,9 +28,11 @@
  * <p>TODO(lowasser): make public
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 abstract class AbstractHashFunction implements HashFunction {
   @Override
-  public <T> HashCode hashObject(T instance, Funnel<? super T> funnel) {
+  public <T extends @Nullable Object> HashCode hashObject(
+      @ParametricNullness T instance, Funnel<? super T> funnel) {
     return newHasher().putObject(instance, funnel).hash();
   }
 
diff --git a/guava/src/com/google/common/hash/AbstractHasher.java b/guava/src/com/google/common/hash/AbstractHasher.java
index 326aa8d..c72e05b 100644
--- a/guava/src/com/google/common/hash/AbstractHasher.java
+++ b/guava/src/com/google/common/hash/AbstractHasher.java
@@ -18,6 +18,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An abstract implementation of {@link Hasher}, which only requires subtypes to implement {@link
@@ -26,6 +27,7 @@
  * @author Dimitris Andreou
  */
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 abstract class AbstractHasher implements Hasher {
   @Override
   public final Hasher putBoolean(boolean b) {
@@ -114,7 +116,8 @@
   }
 
   @Override
-  public <T> Hasher putObject(T instance, Funnel<? super T> funnel) {
+  public <T extends @Nullable Object> Hasher putObject(
+      @ParametricNullness T instance, Funnel<? super T> funnel) {
     funnel.funnel(instance, this);
     return this;
   }
diff --git a/guava/src/com/google/common/hash/AbstractNonStreamingHashFunction.java b/guava/src/com/google/common/hash/AbstractNonStreamingHashFunction.java
index 54c76de..4969e35 100644
--- a/guava/src/com/google/common/hash/AbstractNonStreamingHashFunction.java
+++ b/guava/src/com/google/common/hash/AbstractNonStreamingHashFunction.java
@@ -30,6 +30,7 @@
  * @author Dimitris Andreou
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 abstract class AbstractNonStreamingHashFunction extends AbstractHashFunction {
   @Override
   public Hasher newHasher() {
diff --git a/guava/src/com/google/common/hash/AbstractStreamingHasher.java b/guava/src/com/google/common/hash/AbstractStreamingHasher.java
index 67de74b..a987b48 100644
--- a/guava/src/com/google/common/hash/AbstractStreamingHasher.java
+++ b/guava/src/com/google/common/hash/AbstractStreamingHasher.java
@@ -29,6 +29,7 @@
  */
 // TODO(kevinb): this class still needs some design-and-document-for-inheritance love
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 abstract class AbstractStreamingHasher extends AbstractHasher {
   /** Buffer via which we pass data to the hash algorithm (the implementor) */
   private final ByteBuffer buffer;
diff --git a/guava/src/com/google/common/hash/BloomFilter.java b/guava/src/com/google/common/hash/BloomFilter.java
index ba493eb..e0affaa 100644
--- a/guava/src/com/google/common/hash/BloomFilter.java
+++ b/guava/src/com/google/common/hash/BloomFilter.java
@@ -34,6 +34,7 @@
 import java.io.Serializable;
 import java.math.RoundingMode;
 import java.util.stream.Collector;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -42,7 +43,7 @@
  * but if it claims that an element is <i>not</i> contained in it, then this is definitely true.
  *
  * <p>If you are unfamiliar with Bloom filters, this nice <a
- * href="http://llimllib.github.com/bloomfilter-tutorial/">tutorial</a> may help you understand how
+ * href="http://llimllib.github.io/bloomfilter-tutorial/">tutorial</a> may help you understand how
  * they work.
  *
  * <p>The false positive probability ({@code FPP}) of a Bloom filter is defined as the probability
@@ -64,7 +65,8 @@
  * @since 11.0 (thread-safe since 23.0)
  */
 @Beta
-public final class BloomFilter<T> implements Predicate<T>, Serializable {
+@ElementTypesAreNonnullByDefault
+public final class BloomFilter<T extends @Nullable Object> implements Predicate<T>, Serializable {
   /**
    * A strategy to translate T instances, to {@code numHashFunctions} bit indexes.
    *
@@ -77,15 +79,21 @@
      *
      * <p>Returns whether any bits changed as a result of this operation.
      */
-    <T> boolean put(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits);
+    <T extends @Nullable Object> boolean put(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits);
 
     /**
      * Queries {@code numHashFunctions} bits of the given bit array, by hashing a user element;
      * returns {@code true} if and only if all selected bits are set.
      */
-    <T> boolean mightContain(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits);
+    <T extends @Nullable Object> boolean mightContain(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits);
 
     /**
      * Identifier used to encode this strategy, when marshalled as part of a BloomFilter. Only
@@ -135,7 +143,7 @@
    * Returns {@code true} if the element <i>might</i> have been put in this Bloom filter, {@code
    * false} if this is <i>definitely</i> not the case.
    */
-  public boolean mightContain(T object) {
+  public boolean mightContain(@ParametricNullness T object) {
     return strategy.mightContain(object, funnel, numHashFunctions, bits);
   }
 
@@ -145,7 +153,7 @@
    */
   @Deprecated
   @Override
-  public boolean apply(T input) {
+  public boolean apply(@ParametricNullness T input) {
     return mightContain(input);
   }
 
@@ -161,7 +169,7 @@
    * @since 12.0 (present in 11.0 with {@code void} return type})
    */
   @CanIgnoreReturnValue
-  public boolean put(T object) {
+  public boolean put(@ParametricNullness T object) {
     return strategy.put(object, funnel, numHashFunctions, bits);
   }
 
@@ -268,7 +276,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
@@ -308,7 +316,7 @@
    * @return a {@code Collector} generating a {@code BloomFilter} of the received elements
    * @since 23.0
    */
-  public static <T> Collector<T, ?, BloomFilter<T>> toBloomFilter(
+  public static <T extends @Nullable Object> Collector<T, ?, BloomFilter<T>> toBloomFilter(
       Funnel<? super T> funnel, long expectedInsertions) {
     return toBloomFilter(funnel, expectedInsertions, 0.03);
   }
@@ -335,7 +343,7 @@
    * @return a {@code Collector} generating a {@code BloomFilter} of the received elements
    * @since 23.0
    */
-  public static <T> Collector<T, ?, BloomFilter<T>> toBloomFilter(
+  public static <T extends @Nullable Object> Collector<T, ?, BloomFilter<T>> toBloomFilter(
       Funnel<? super T> funnel, long expectedInsertions, double fpp) {
     checkNotNull(funnel);
     checkArgument(
@@ -373,7 +381,7 @@
    * @param fpp the desired false positive probability (must be positive and less than 1.0)
    * @return a {@code BloomFilter}
    */
-  public static <T> BloomFilter<T> create(
+  public static <T extends @Nullable Object> BloomFilter<T> create(
       Funnel<? super T> funnel, int expectedInsertions, double fpp) {
     return create(funnel, (long) expectedInsertions, fpp);
   }
@@ -399,13 +407,13 @@
    * @return a {@code BloomFilter}
    * @since 19.0
    */
-  public static <T> BloomFilter<T> create(
+  public static <T extends @Nullable Object> BloomFilter<T> create(
       Funnel<? super T> funnel, long expectedInsertions, double fpp) {
     return create(funnel, expectedInsertions, fpp, BloomFilterStrategies.MURMUR128_MITZ_64);
   }
 
   @VisibleForTesting
-  static <T> BloomFilter<T> create(
+  static <T extends @Nullable Object> BloomFilter<T> create(
       Funnel<? super T> funnel, long expectedInsertions, double fpp, Strategy strategy) {
     checkNotNull(funnel);
     checkArgument(
@@ -450,7 +458,8 @@
    *     BloomFilter}; must be positive
    * @return a {@code BloomFilter}
    */
-  public static <T> BloomFilter<T> create(Funnel<? super T> funnel, int expectedInsertions) {
+  public static <T extends @Nullable Object> BloomFilter<T> create(
+      Funnel<? super T> funnel, int expectedInsertions) {
     return create(funnel, (long) expectedInsertions);
   }
 
@@ -474,7 +483,8 @@
    * @return a {@code BloomFilter}
    * @since 19.0
    */
-  public static <T> BloomFilter<T> create(Funnel<? super T> funnel, long expectedInsertions) {
+  public static <T extends @Nullable Object> BloomFilter<T> create(
+      Funnel<? super T> funnel, long expectedInsertions) {
     return create(funnel, expectedInsertions, 0.03); // FYI, for 3%, we always get 5 hash functions
   }
 
@@ -527,7 +537,7 @@
     return new SerialForm<T>(this);
   }
 
-  private static class SerialForm<T> implements Serializable {
+  private static class SerialForm<T extends @Nullable Object> implements Serializable {
     final long[] data;
     final int numHashFunctions;
     final Funnel<? super T> funnel;
@@ -580,8 +590,8 @@
    * @throws IOException if the InputStream throws an {@code IOException}, or if its data does not
    *     appear to be a BloomFilter serialized using the {@linkplain #writeTo(OutputStream)} method.
    */
-  public static <T> BloomFilter<T> readFrom(InputStream in, Funnel<? super T> funnel)
-      throws IOException {
+  public static <T extends @Nullable Object> BloomFilter<T> readFrom(
+      InputStream in, Funnel<? super T> funnel) throws IOException {
     checkNotNull(in, "InputStream");
     checkNotNull(funnel, "Funnel");
     int strategyOrdinal = -1;
diff --git a/guava/src/com/google/common/hash/BloomFilterStrategies.java b/guava/src/com/google/common/hash/BloomFilterStrategies.java
index 1b4abea..3a012f3 100644
--- a/guava/src/com/google/common/hash/BloomFilterStrategies.java
+++ b/guava/src/com/google/common/hash/BloomFilterStrategies.java
@@ -22,6 +22,7 @@
 import java.math.RoundingMode;
 import java.util.Arrays;
 import java.util.concurrent.atomic.AtomicLongArray;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -36,6 +37,7 @@
  * @author Dimitris Andreou
  * @author Kurt Alfred Kluever
  */
+@ElementTypesAreNonnullByDefault
 enum BloomFilterStrategies implements BloomFilter.Strategy {
   /**
    * See "Less Hashing, Same Performance: Building a Better Bloom Filter" by Adam Kirsch and Michael
@@ -44,8 +46,11 @@
    */
   MURMUR128_MITZ_32() {
     @Override
-    public <T> boolean put(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits) {
+    public <T extends @Nullable Object> boolean put(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits) {
       long bitSize = bits.bitSize();
       long hash64 = Hashing.murmur3_128().hashObject(object, funnel).asLong();
       int hash1 = (int) hash64;
@@ -64,8 +69,11 @@
     }
 
     @Override
-    public <T> boolean mightContain(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits) {
+    public <T extends @Nullable Object> boolean mightContain(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits) {
       long bitSize = bits.bitSize();
       long hash64 = Hashing.murmur3_128().hashObject(object, funnel).asLong();
       int hash1 = (int) hash64;
@@ -92,8 +100,11 @@
    */
   MURMUR128_MITZ_64() {
     @Override
-    public <T> boolean put(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits) {
+    public <T extends @Nullable Object> boolean put(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits) {
       long bitSize = bits.bitSize();
       byte[] bytes = Hashing.murmur3_128().hashObject(object, funnel).getBytesInternal();
       long hash1 = lowerEight(bytes);
@@ -110,8 +121,11 @@
     }
 
     @Override
-    public <T> boolean mightContain(
-        T object, Funnel<? super T> funnel, int numHashFunctions, LockFreeBitArray bits) {
+    public <T extends @Nullable Object> boolean mightContain(
+        @ParametricNullness T object,
+        Funnel<? super T> funnel,
+        int numHashFunctions,
+        LockFreeBitArray bits) {
       long bitSize = bits.bitSize();
       byte[] bytes = Hashing.murmur3_128().hashObject(object, funnel).getBytesInternal();
       long hash1 = lowerEight(bytes);
@@ -271,7 +285,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof LockFreeBitArray) {
         LockFreeBitArray lockFreeBitArray = (LockFreeBitArray) o;
         // TODO(lowasser): avoid allocation here
diff --git a/guava/src/com/google/common/hash/ChecksumHashFunction.java b/guava/src/com/google/common/hash/ChecksumHashFunction.java
index 380c3a3..159adbb 100644
--- a/guava/src/com/google/common/hash/ChecksumHashFunction.java
+++ b/guava/src/com/google/common/hash/ChecksumHashFunction.java
@@ -27,6 +27,7 @@
  * @author Colin Decker
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class ChecksumHashFunction extends AbstractHashFunction implements Serializable {
   private final ImmutableSupplier<? extends Checksum> checksumSupplier;
   private final int bits;
diff --git a/guava/src/com/google/common/hash/Crc32cHashFunction.java b/guava/src/com/google/common/hash/Crc32cHashFunction.java
index 02db525..8e17e65 100644
--- a/guava/src/com/google/common/hash/Crc32cHashFunction.java
+++ b/guava/src/com/google/common/hash/Crc32cHashFunction.java
@@ -15,6 +15,7 @@
 package com.google.common.hash;
 
 import com.google.errorprone.annotations.Immutable;
+import java.nio.ByteBuffer;
 
 /**
  * This class generates a CRC32C checksum, defined by RFC 3720, Section 12.1. The generator
@@ -23,6 +24,7 @@
  * @author Kurt Alfred Kluever
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class Crc32cHashFunction extends AbstractHashFunction {
   static final HashFunction CRC_32_C = new Crc32cHashFunction();
 
@@ -41,88 +43,332 @@
     return "Hashing.crc32c()";
   }
 
-  static final class Crc32cHasher extends AbstractByteHasher {
+  static final class Crc32cHasher extends AbstractStreamingHasher {
 
-    // The CRC table, generated from the polynomial 0x11EDC6F41.
-    static final int[] CRC_TABLE = {
-      0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4,
-      0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb,
-      0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b,
-      0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24,
-      0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b,
-      0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,
-      0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54,
-      0x5d1d08bf, 0xaf768bbc, 0xbc267848, 0x4e4dfb4b,
-      0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,
-      0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35,
-      0xaa64d611, 0x580f5512, 0x4b5fa6e6, 0xb93425e5,
-      0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,
-      0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45,
-      0xf779deae, 0x05125dad, 0x1642ae59, 0xe4292d5a,
-      0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a,
-      0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595,
-      0x417b1dbc, 0xb3109ebf, 0xa0406d4b, 0x522bee48,
-      0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957,
-      0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687,
-      0x0c38d26c, 0xfe53516f, 0xed03a29b, 0x1f682198,
-      0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,
-      0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38,
-      0xdbfc821c, 0x2997011f, 0x3ac7f2eb, 0xc8ac71e8,
-      0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,
-      0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096,
-      0xa65c047d, 0x5437877e, 0x4767748a, 0xb50cf789,
-      0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859,
-      0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46,
-      0x7198540d, 0x83f3d70e, 0x90a324fa, 0x62c8a7f9,
-      0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6,
-      0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36,
-      0x3cdb9bdd, 0xceb018de, 0xdde0eb2a, 0x2f8b6829,
-      0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c,
-      0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93,
-      0x082f63b7, 0xfa44e0b4, 0xe9141340, 0x1b7f9043,
-      0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,
-      0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3,
-      0x55326b08, 0xa759e80b, 0xb4091bff, 0x466298fc,
-      0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,
-      0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033,
-      0xa24bb5a6, 0x502036a5, 0x4370c551, 0xb11b4652,
-      0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d,
-      0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d,
-      0xef087a76, 0x1d63f975, 0x0e330a81, 0xfc588982,
-      0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d,
-      0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622,
-      0x38cc2a06, 0xcaa7a905, 0xd9f75af1, 0x2b9cd9f2,
-      0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,
-      0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530,
-      0x0417b1db, 0xf67c32d8, 0xe52cc12c, 0x1747422f,
-      0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,
-      0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0,
-      0xd3d3e1ab, 0x21b862a8, 0x32e8915c, 0xc083125f,
-      0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,
-      0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90,
-      0x9e902e7b, 0x6cfbad78, 0x7fab5e8c, 0x8dc0dd8f,
-      0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee,
-      0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1,
-      0x69e9f0d5, 0x9b8273d6, 0x88d28022, 0x7ab90321,
-      0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e,
-      0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81,
-      0x34f4f86a, 0xc69f7b69, 0xd5cf889d, 0x27a40b9e,
-      0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,
+    /*
+     * The striding algorithm works roughly as follows: it is universally the case that
+     * CRC(x ^ y) == CRC(x) ^ CRC(y).  The approach we take is to break the message as follows,
+     * with each letter representing a 4-byte word: ABCDABCDABCDABCD... and to calculate
+     * CRC(A000A000A000...), CRC(0B000B000B...), CRC(00C000C000C...), CRC(000D000D000D...)
+     * and then to XOR them together.  The STRIDE_TABLE enables us to hash an int followed by 12
+     * zero bytes (3 ints), while the BYTE_TABLE is for advancing one byte at a time.
+     * This algorithm is due to the paper "Everything we know about CRC but [are] afraid to forget"
+     * by Kadatch and Jenkins, 2010.
+     */
+
+    Crc32cHasher() {
+      super(16);
+    }
+
+    private boolean finished = false;
+
+    /*
+     * This trick allows us to avoid having separate states for "first four ints" and "all other
+     * four int chunks."  The state we want after the first four bytes is
+     *
+     * crc0 = ~int0
+     * crc1 = int1
+     * crc2 = int2
+     * crc3 = int3
+     *
+     * ...so we set crc0 so that computeForWord(crc0) = -1 and xoring it with the first int
+     * gives us the desired result.  computeForWord(0) == 0, so all the others do the right thing.
+     */
+    private int crc0 = INVERSE_COMPUTE_FOR_WORD_OF_ALL_1S;
+    private int crc1 = 0;
+    private int crc2 = 0;
+    private int crc3 = 0;
+
+    @Override
+    protected void process(ByteBuffer bb) {
+      if (finished) {
+        throw new IllegalStateException(
+            "The behavior of calling any method after calling hash() is undefined.");
+      }
+      while (bb.remaining() >= 16) {
+        crc0 = computeForWord(crc0);
+        crc1 = computeForWord(crc1);
+        crc2 = computeForWord(crc2);
+        crc3 = computeForWord(crc3);
+        crc0 ^= bb.getInt();
+        crc1 ^= bb.getInt();
+        crc2 ^= bb.getInt();
+        crc3 ^= bb.getInt();
+      }
+    }
+
+    @Override
+    protected void processRemaining(ByteBuffer bb) {
+      if (finished) {
+        return;
+      }
+      crc0 = combine(0, crc0);
+      crc0 = combine(crc0, crc1);
+      crc0 = combine(crc0, crc2);
+      crc0 = combine(crc0, crc3);
+      while (bb.hasRemaining()) {
+        crc0 = (crc0 >>> 8) ^ BYTE_TABLE[(bb.get() ^ crc0) & 0xFF];
+      }
+      finished = true;
+    }
+
+    @Override
+    protected HashCode makeHash() {
+      if (!finished) {
+        // processRemaining does teardown we always want to do -- the folding together of the four
+        // rolling CRCs.  So we call it on an empty ByteBuffer if we didn't already.
+        processRemaining(EMPTY);
+      }
+      return HashCode.fromInt(~crc0);
+    }
+
+    static final int[] BYTE_TABLE = {
+      0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4, 0xc79a971f, 0x35f1141c,
+      0x26a1e7e8, 0xd4ca64eb, 0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b,
+      0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24, 0x105ec76f, 0xe235446c,
+      0xf165b798, 0x030e349b, 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,
+      0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54, 0x5d1d08bf, 0xaf768bbc,
+      0xbc267848, 0x4e4dfb4b, 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,
+      0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35, 0xaa64d611, 0x580f5512,
+      0x4b5fa6e6, 0xb93425e5, 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,
+      0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45, 0xf779deae, 0x05125dad,
+      0x1642ae59, 0xe4292d5a, 0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a,
+      0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595, 0x417b1dbc, 0xb3109ebf,
+      0xa0406d4b, 0x522bee48, 0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957,
+      0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687, 0x0c38d26c, 0xfe53516f,
+      0xed03a29b, 0x1f682198, 0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,
+      0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38, 0xdbfc821c, 0x2997011f,
+      0x3ac7f2eb, 0xc8ac71e8, 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,
+      0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096, 0xa65c047d, 0x5437877e,
+      0x4767748a, 0xb50cf789, 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859,
+      0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46, 0x7198540d, 0x83f3d70e,
+      0x90a324fa, 0x62c8a7f9, 0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6,
+      0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36, 0x3cdb9bdd, 0xceb018de,
+      0xdde0eb2a, 0x2f8b6829, 0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c,
+      0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93, 0x082f63b7, 0xfa44e0b4,
+      0xe9141340, 0x1b7f9043, 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,
+      0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3, 0x55326b08, 0xa759e80b,
+      0xb4091bff, 0x466298fc, 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,
+      0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033, 0xa24bb5a6, 0x502036a5,
+      0x4370c551, 0xb11b4652, 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d,
+      0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d, 0xef087a76, 0x1d63f975,
+      0x0e330a81, 0xfc588982, 0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d,
+      0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622, 0x38cc2a06, 0xcaa7a905,
+      0xd9f75af1, 0x2b9cd9f2, 0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,
+      0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530, 0x0417b1db, 0xf67c32d8,
+      0xe52cc12c, 0x1747422f, 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,
+      0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0, 0xd3d3e1ab, 0x21b862a8,
+      0x32e8915c, 0xc083125f, 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,
+      0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90, 0x9e902e7b, 0x6cfbad78,
+      0x7fab5e8c, 0x8dc0dd8f, 0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee,
+      0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1, 0x69e9f0d5, 0x9b8273d6,
+      0x88d28022, 0x7ab90321, 0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e,
+      0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81, 0x34f4f86a, 0xc69f7b69,
+      0xd5cf889d, 0x27a40b9e, 0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,
       0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351
     };
 
-    private int crc = 0;
+    static final int[][] STRIDE_TABLE = {
+      {
+        0x00000000, 0x30d23865, 0x61a470ca, 0x517648af, 0xc348e194, 0xf39ad9f1,
+        0xa2ec915e, 0x923ea93b, 0x837db5d9, 0xb3af8dbc, 0xe2d9c513, 0xd20bfd76,
+        0x4035544d, 0x70e76c28, 0x21912487, 0x11431ce2, 0x03171d43, 0x33c52526,
+        0x62b36d89, 0x526155ec, 0xc05ffcd7, 0xf08dc4b2, 0xa1fb8c1d, 0x9129b478,
+        0x806aa89a, 0xb0b890ff, 0xe1ced850, 0xd11ce035, 0x4322490e, 0x73f0716b,
+        0x228639c4, 0x125401a1, 0x062e3a86, 0x36fc02e3, 0x678a4a4c, 0x57587229,
+        0xc566db12, 0xf5b4e377, 0xa4c2abd8, 0x941093bd, 0x85538f5f, 0xb581b73a,
+        0xe4f7ff95, 0xd425c7f0, 0x461b6ecb, 0x76c956ae, 0x27bf1e01, 0x176d2664,
+        0x053927c5, 0x35eb1fa0, 0x649d570f, 0x544f6f6a, 0xc671c651, 0xf6a3fe34,
+        0xa7d5b69b, 0x97078efe, 0x8644921c, 0xb696aa79, 0xe7e0e2d6, 0xd732dab3,
+        0x450c7388, 0x75de4bed, 0x24a80342, 0x147a3b27, 0x0c5c750c, 0x3c8e4d69,
+        0x6df805c6, 0x5d2a3da3, 0xcf149498, 0xffc6acfd, 0xaeb0e452, 0x9e62dc37,
+        0x8f21c0d5, 0xbff3f8b0, 0xee85b01f, 0xde57887a, 0x4c692141, 0x7cbb1924,
+        0x2dcd518b, 0x1d1f69ee, 0x0f4b684f, 0x3f99502a, 0x6eef1885, 0x5e3d20e0,
+        0xcc0389db, 0xfcd1b1be, 0xada7f911, 0x9d75c174, 0x8c36dd96, 0xbce4e5f3,
+        0xed92ad5c, 0xdd409539, 0x4f7e3c02, 0x7fac0467, 0x2eda4cc8, 0x1e0874ad,
+        0x0a724f8a, 0x3aa077ef, 0x6bd63f40, 0x5b040725, 0xc93aae1e, 0xf9e8967b,
+        0xa89eded4, 0x984ce6b1, 0x890ffa53, 0xb9ddc236, 0xe8ab8a99, 0xd879b2fc,
+        0x4a471bc7, 0x7a9523a2, 0x2be36b0d, 0x1b315368, 0x096552c9, 0x39b76aac,
+        0x68c12203, 0x58131a66, 0xca2db35d, 0xfaff8b38, 0xab89c397, 0x9b5bfbf2,
+        0x8a18e710, 0xbacadf75, 0xebbc97da, 0xdb6eafbf, 0x49500684, 0x79823ee1,
+        0x28f4764e, 0x18264e2b, 0x18b8ea18, 0x286ad27d, 0x791c9ad2, 0x49cea2b7,
+        0xdbf00b8c, 0xeb2233e9, 0xba547b46, 0x8a864323, 0x9bc55fc1, 0xab1767a4,
+        0xfa612f0b, 0xcab3176e, 0x588dbe55, 0x685f8630, 0x3929ce9f, 0x09fbf6fa,
+        0x1baff75b, 0x2b7dcf3e, 0x7a0b8791, 0x4ad9bff4, 0xd8e716cf, 0xe8352eaa,
+        0xb9436605, 0x89915e60, 0x98d24282, 0xa8007ae7, 0xf9763248, 0xc9a40a2d,
+        0x5b9aa316, 0x6b489b73, 0x3a3ed3dc, 0x0aecebb9, 0x1e96d09e, 0x2e44e8fb,
+        0x7f32a054, 0x4fe09831, 0xddde310a, 0xed0c096f, 0xbc7a41c0, 0x8ca879a5,
+        0x9deb6547, 0xad395d22, 0xfc4f158d, 0xcc9d2de8, 0x5ea384d3, 0x6e71bcb6,
+        0x3f07f419, 0x0fd5cc7c, 0x1d81cddd, 0x2d53f5b8, 0x7c25bd17, 0x4cf78572,
+        0xdec92c49, 0xee1b142c, 0xbf6d5c83, 0x8fbf64e6, 0x9efc7804, 0xae2e4061,
+        0xff5808ce, 0xcf8a30ab, 0x5db49990, 0x6d66a1f5, 0x3c10e95a, 0x0cc2d13f,
+        0x14e49f14, 0x2436a771, 0x7540efde, 0x4592d7bb, 0xd7ac7e80, 0xe77e46e5,
+        0xb6080e4a, 0x86da362f, 0x97992acd, 0xa74b12a8, 0xf63d5a07, 0xc6ef6262,
+        0x54d1cb59, 0x6403f33c, 0x3575bb93, 0x05a783f6, 0x17f38257, 0x2721ba32,
+        0x7657f29d, 0x4685caf8, 0xd4bb63c3, 0xe4695ba6, 0xb51f1309, 0x85cd2b6c,
+        0x948e378e, 0xa45c0feb, 0xf52a4744, 0xc5f87f21, 0x57c6d61a, 0x6714ee7f,
+        0x3662a6d0, 0x06b09eb5, 0x12caa592, 0x22189df7, 0x736ed558, 0x43bced3d,
+        0xd1824406, 0xe1507c63, 0xb02634cc, 0x80f40ca9, 0x91b7104b, 0xa165282e,
+        0xf0136081, 0xc0c158e4, 0x52fff1df, 0x622dc9ba, 0x335b8115, 0x0389b970,
+        0x11ddb8d1, 0x210f80b4, 0x7079c81b, 0x40abf07e, 0xd2955945, 0xe2476120,
+        0xb331298f, 0x83e311ea, 0x92a00d08, 0xa272356d, 0xf3047dc2, 0xc3d645a7,
+        0x51e8ec9c, 0x613ad4f9, 0x304c9c56, 0x009ea433,
+      },
+      {
+        0x00000000, 0x54075546, 0xa80eaa8c, 0xfc09ffca, 0x55f123e9, 0x01f676af,
+        0xfdff8965, 0xa9f8dc23, 0xabe247d2, 0xffe51294, 0x03eced5e, 0x57ebb818,
+        0xfe13643b, 0xaa14317d, 0x561dceb7, 0x021a9bf1, 0x5228f955, 0x062fac13,
+        0xfa2653d9, 0xae21069f, 0x07d9dabc, 0x53de8ffa, 0xafd77030, 0xfbd02576,
+        0xf9cabe87, 0xadcdebc1, 0x51c4140b, 0x05c3414d, 0xac3b9d6e, 0xf83cc828,
+        0x043537e2, 0x503262a4, 0xa451f2aa, 0xf056a7ec, 0x0c5f5826, 0x58580d60,
+        0xf1a0d143, 0xa5a78405, 0x59ae7bcf, 0x0da92e89, 0x0fb3b578, 0x5bb4e03e,
+        0xa7bd1ff4, 0xf3ba4ab2, 0x5a429691, 0x0e45c3d7, 0xf24c3c1d, 0xa64b695b,
+        0xf6790bff, 0xa27e5eb9, 0x5e77a173, 0x0a70f435, 0xa3882816, 0xf78f7d50,
+        0x0b86829a, 0x5f81d7dc, 0x5d9b4c2d, 0x099c196b, 0xf595e6a1, 0xa192b3e7,
+        0x086a6fc4, 0x5c6d3a82, 0xa064c548, 0xf463900e, 0x4d4f93a5, 0x1948c6e3,
+        0xe5413929, 0xb1466c6f, 0x18beb04c, 0x4cb9e50a, 0xb0b01ac0, 0xe4b74f86,
+        0xe6add477, 0xb2aa8131, 0x4ea37efb, 0x1aa42bbd, 0xb35cf79e, 0xe75ba2d8,
+        0x1b525d12, 0x4f550854, 0x1f676af0, 0x4b603fb6, 0xb769c07c, 0xe36e953a,
+        0x4a964919, 0x1e911c5f, 0xe298e395, 0xb69fb6d3, 0xb4852d22, 0xe0827864,
+        0x1c8b87ae, 0x488cd2e8, 0xe1740ecb, 0xb5735b8d, 0x497aa447, 0x1d7df101,
+        0xe91e610f, 0xbd193449, 0x4110cb83, 0x15179ec5, 0xbcef42e6, 0xe8e817a0,
+        0x14e1e86a, 0x40e6bd2c, 0x42fc26dd, 0x16fb739b, 0xeaf28c51, 0xbef5d917,
+        0x170d0534, 0x430a5072, 0xbf03afb8, 0xeb04fafe, 0xbb36985a, 0xef31cd1c,
+        0x133832d6, 0x473f6790, 0xeec7bbb3, 0xbac0eef5, 0x46c9113f, 0x12ce4479,
+        0x10d4df88, 0x44d38ace, 0xb8da7504, 0xecdd2042, 0x4525fc61, 0x1122a927,
+        0xed2b56ed, 0xb92c03ab, 0x9a9f274a, 0xce98720c, 0x32918dc6, 0x6696d880,
+        0xcf6e04a3, 0x9b6951e5, 0x6760ae2f, 0x3367fb69, 0x317d6098, 0x657a35de,
+        0x9973ca14, 0xcd749f52, 0x648c4371, 0x308b1637, 0xcc82e9fd, 0x9885bcbb,
+        0xc8b7de1f, 0x9cb08b59, 0x60b97493, 0x34be21d5, 0x9d46fdf6, 0xc941a8b0,
+        0x3548577a, 0x614f023c, 0x635599cd, 0x3752cc8b, 0xcb5b3341, 0x9f5c6607,
+        0x36a4ba24, 0x62a3ef62, 0x9eaa10a8, 0xcaad45ee, 0x3eced5e0, 0x6ac980a6,
+        0x96c07f6c, 0xc2c72a2a, 0x6b3ff609, 0x3f38a34f, 0xc3315c85, 0x973609c3,
+        0x952c9232, 0xc12bc774, 0x3d2238be, 0x69256df8, 0xc0ddb1db, 0x94dae49d,
+        0x68d31b57, 0x3cd44e11, 0x6ce62cb5, 0x38e179f3, 0xc4e88639, 0x90efd37f,
+        0x39170f5c, 0x6d105a1a, 0x9119a5d0, 0xc51ef096, 0xc7046b67, 0x93033e21,
+        0x6f0ac1eb, 0x3b0d94ad, 0x92f5488e, 0xc6f21dc8, 0x3afbe202, 0x6efcb744,
+        0xd7d0b4ef, 0x83d7e1a9, 0x7fde1e63, 0x2bd94b25, 0x82219706, 0xd626c240,
+        0x2a2f3d8a, 0x7e2868cc, 0x7c32f33d, 0x2835a67b, 0xd43c59b1, 0x803b0cf7,
+        0x29c3d0d4, 0x7dc48592, 0x81cd7a58, 0xd5ca2f1e, 0x85f84dba, 0xd1ff18fc,
+        0x2df6e736, 0x79f1b270, 0xd0096e53, 0x840e3b15, 0x7807c4df, 0x2c009199,
+        0x2e1a0a68, 0x7a1d5f2e, 0x8614a0e4, 0xd213f5a2, 0x7beb2981, 0x2fec7cc7,
+        0xd3e5830d, 0x87e2d64b, 0x73814645, 0x27861303, 0xdb8fecc9, 0x8f88b98f,
+        0x267065ac, 0x727730ea, 0x8e7ecf20, 0xda799a66, 0xd8630197, 0x8c6454d1,
+        0x706dab1b, 0x246afe5d, 0x8d92227e, 0xd9957738, 0x259c88f2, 0x719bddb4,
+        0x21a9bf10, 0x75aeea56, 0x89a7159c, 0xdda040da, 0x74589cf9, 0x205fc9bf,
+        0xdc563675, 0x88516333, 0x8a4bf8c2, 0xde4cad84, 0x2245524e, 0x76420708,
+        0xdfbadb2b, 0x8bbd8e6d, 0x77b471a7, 0x23b324e1,
+      },
+      {
+        0x00000000, 0x678efd01, 0xcf1dfa02, 0xa8930703, 0x9bd782f5, 0xfc597ff4,
+        0x54ca78f7, 0x334485f6, 0x3243731b, 0x55cd8e1a, 0xfd5e8919, 0x9ad07418,
+        0xa994f1ee, 0xce1a0cef, 0x66890bec, 0x0107f6ed, 0x6486e636, 0x03081b37,
+        0xab9b1c34, 0xcc15e135, 0xff5164c3, 0x98df99c2, 0x304c9ec1, 0x57c263c0,
+        0x56c5952d, 0x314b682c, 0x99d86f2f, 0xfe56922e, 0xcd1217d8, 0xaa9cead9,
+        0x020fedda, 0x658110db, 0xc90dcc6c, 0xae83316d, 0x0610366e, 0x619ecb6f,
+        0x52da4e99, 0x3554b398, 0x9dc7b49b, 0xfa49499a, 0xfb4ebf77, 0x9cc04276,
+        0x34534575, 0x53ddb874, 0x60993d82, 0x0717c083, 0xaf84c780, 0xc80a3a81,
+        0xad8b2a5a, 0xca05d75b, 0x6296d058, 0x05182d59, 0x365ca8af, 0x51d255ae,
+        0xf94152ad, 0x9ecfafac, 0x9fc85941, 0xf846a440, 0x50d5a343, 0x375b5e42,
+        0x041fdbb4, 0x639126b5, 0xcb0221b6, 0xac8cdcb7, 0x97f7ee29, 0xf0791328,
+        0x58ea142b, 0x3f64e92a, 0x0c206cdc, 0x6bae91dd, 0xc33d96de, 0xa4b36bdf,
+        0xa5b49d32, 0xc23a6033, 0x6aa96730, 0x0d279a31, 0x3e631fc7, 0x59ede2c6,
+        0xf17ee5c5, 0x96f018c4, 0xf371081f, 0x94fff51e, 0x3c6cf21d, 0x5be20f1c,
+        0x68a68aea, 0x0f2877eb, 0xa7bb70e8, 0xc0358de9, 0xc1327b04, 0xa6bc8605,
+        0x0e2f8106, 0x69a17c07, 0x5ae5f9f1, 0x3d6b04f0, 0x95f803f3, 0xf276fef2,
+        0x5efa2245, 0x3974df44, 0x91e7d847, 0xf6692546, 0xc52da0b0, 0xa2a35db1,
+        0x0a305ab2, 0x6dbea7b3, 0x6cb9515e, 0x0b37ac5f, 0xa3a4ab5c, 0xc42a565d,
+        0xf76ed3ab, 0x90e02eaa, 0x387329a9, 0x5ffdd4a8, 0x3a7cc473, 0x5df23972,
+        0xf5613e71, 0x92efc370, 0xa1ab4686, 0xc625bb87, 0x6eb6bc84, 0x09384185,
+        0x083fb768, 0x6fb14a69, 0xc7224d6a, 0xa0acb06b, 0x93e8359d, 0xf466c89c,
+        0x5cf5cf9f, 0x3b7b329e, 0x2a03aaa3, 0x4d8d57a2, 0xe51e50a1, 0x8290ada0,
+        0xb1d42856, 0xd65ad557, 0x7ec9d254, 0x19472f55, 0x1840d9b8, 0x7fce24b9,
+        0xd75d23ba, 0xb0d3debb, 0x83975b4d, 0xe419a64c, 0x4c8aa14f, 0x2b045c4e,
+        0x4e854c95, 0x290bb194, 0x8198b697, 0xe6164b96, 0xd552ce60, 0xb2dc3361,
+        0x1a4f3462, 0x7dc1c963, 0x7cc63f8e, 0x1b48c28f, 0xb3dbc58c, 0xd455388d,
+        0xe711bd7b, 0x809f407a, 0x280c4779, 0x4f82ba78, 0xe30e66cf, 0x84809bce,
+        0x2c139ccd, 0x4b9d61cc, 0x78d9e43a, 0x1f57193b, 0xb7c41e38, 0xd04ae339,
+        0xd14d15d4, 0xb6c3e8d5, 0x1e50efd6, 0x79de12d7, 0x4a9a9721, 0x2d146a20,
+        0x85876d23, 0xe2099022, 0x878880f9, 0xe0067df8, 0x48957afb, 0x2f1b87fa,
+        0x1c5f020c, 0x7bd1ff0d, 0xd342f80e, 0xb4cc050f, 0xb5cbf3e2, 0xd2450ee3,
+        0x7ad609e0, 0x1d58f4e1, 0x2e1c7117, 0x49928c16, 0xe1018b15, 0x868f7614,
+        0xbdf4448a, 0xda7ab98b, 0x72e9be88, 0x15674389, 0x2623c67f, 0x41ad3b7e,
+        0xe93e3c7d, 0x8eb0c17c, 0x8fb73791, 0xe839ca90, 0x40aacd93, 0x27243092,
+        0x1460b564, 0x73ee4865, 0xdb7d4f66, 0xbcf3b267, 0xd972a2bc, 0xbefc5fbd,
+        0x166f58be, 0x71e1a5bf, 0x42a52049, 0x252bdd48, 0x8db8da4b, 0xea36274a,
+        0xeb31d1a7, 0x8cbf2ca6, 0x242c2ba5, 0x43a2d6a4, 0x70e65352, 0x1768ae53,
+        0xbffba950, 0xd8755451, 0x74f988e6, 0x137775e7, 0xbbe472e4, 0xdc6a8fe5,
+        0xef2e0a13, 0x88a0f712, 0x2033f011, 0x47bd0d10, 0x46bafbfd, 0x213406fc,
+        0x89a701ff, 0xee29fcfe, 0xdd6d7908, 0xbae38409, 0x1270830a, 0x75fe7e0b,
+        0x107f6ed0, 0x77f193d1, 0xdf6294d2, 0xb8ec69d3, 0x8ba8ec25, 0xec261124,
+        0x44b51627, 0x233beb26, 0x223c1dcb, 0x45b2e0ca, 0xed21e7c9, 0x8aaf1ac8,
+        0xb9eb9f3e, 0xde65623f, 0x76f6653c, 0x1178983d,
+      },
+      {
+        0x00000000, 0xf20c0dfe, 0xe1f46d0d, 0x13f860f3, 0xc604aceb, 0x3408a115,
+        0x27f0c1e6, 0xd5fccc18, 0x89e52f27, 0x7be922d9, 0x6811422a, 0x9a1d4fd4,
+        0x4fe183cc, 0xbded8e32, 0xae15eec1, 0x5c19e33f, 0x162628bf, 0xe42a2541,
+        0xf7d245b2, 0x05de484c, 0xd0228454, 0x222e89aa, 0x31d6e959, 0xc3dae4a7,
+        0x9fc30798, 0x6dcf0a66, 0x7e376a95, 0x8c3b676b, 0x59c7ab73, 0xabcba68d,
+        0xb833c67e, 0x4a3fcb80, 0x2c4c517e, 0xde405c80, 0xcdb83c73, 0x3fb4318d,
+        0xea48fd95, 0x1844f06b, 0x0bbc9098, 0xf9b09d66, 0xa5a97e59, 0x57a573a7,
+        0x445d1354, 0xb6511eaa, 0x63add2b2, 0x91a1df4c, 0x8259bfbf, 0x7055b241,
+        0x3a6a79c1, 0xc866743f, 0xdb9e14cc, 0x29921932, 0xfc6ed52a, 0x0e62d8d4,
+        0x1d9ab827, 0xef96b5d9, 0xb38f56e6, 0x41835b18, 0x527b3beb, 0xa0773615,
+        0x758bfa0d, 0x8787f7f3, 0x947f9700, 0x66739afe, 0x5898a2fc, 0xaa94af02,
+        0xb96ccff1, 0x4b60c20f, 0x9e9c0e17, 0x6c9003e9, 0x7f68631a, 0x8d646ee4,
+        0xd17d8ddb, 0x23718025, 0x3089e0d6, 0xc285ed28, 0x17792130, 0xe5752cce,
+        0xf68d4c3d, 0x048141c3, 0x4ebe8a43, 0xbcb287bd, 0xaf4ae74e, 0x5d46eab0,
+        0x88ba26a8, 0x7ab62b56, 0x694e4ba5, 0x9b42465b, 0xc75ba564, 0x3557a89a,
+        0x26afc869, 0xd4a3c597, 0x015f098f, 0xf3530471, 0xe0ab6482, 0x12a7697c,
+        0x74d4f382, 0x86d8fe7c, 0x95209e8f, 0x672c9371, 0xb2d05f69, 0x40dc5297,
+        0x53243264, 0xa1283f9a, 0xfd31dca5, 0x0f3dd15b, 0x1cc5b1a8, 0xeec9bc56,
+        0x3b35704e, 0xc9397db0, 0xdac11d43, 0x28cd10bd, 0x62f2db3d, 0x90fed6c3,
+        0x8306b630, 0x710abbce, 0xa4f677d6, 0x56fa7a28, 0x45021adb, 0xb70e1725,
+        0xeb17f41a, 0x191bf9e4, 0x0ae39917, 0xf8ef94e9, 0x2d1358f1, 0xdf1f550f,
+        0xcce735fc, 0x3eeb3802, 0xb13145f8, 0x433d4806, 0x50c528f5, 0xa2c9250b,
+        0x7735e913, 0x8539e4ed, 0x96c1841e, 0x64cd89e0, 0x38d46adf, 0xcad86721,
+        0xd92007d2, 0x2b2c0a2c, 0xfed0c634, 0x0cdccbca, 0x1f24ab39, 0xed28a6c7,
+        0xa7176d47, 0x551b60b9, 0x46e3004a, 0xb4ef0db4, 0x6113c1ac, 0x931fcc52,
+        0x80e7aca1, 0x72eba15f, 0x2ef24260, 0xdcfe4f9e, 0xcf062f6d, 0x3d0a2293,
+        0xe8f6ee8b, 0x1afae375, 0x09028386, 0xfb0e8e78, 0x9d7d1486, 0x6f711978,
+        0x7c89798b, 0x8e857475, 0x5b79b86d, 0xa975b593, 0xba8dd560, 0x4881d89e,
+        0x14983ba1, 0xe694365f, 0xf56c56ac, 0x07605b52, 0xd29c974a, 0x20909ab4,
+        0x3368fa47, 0xc164f7b9, 0x8b5b3c39, 0x795731c7, 0x6aaf5134, 0x98a35cca,
+        0x4d5f90d2, 0xbf539d2c, 0xacabfddf, 0x5ea7f021, 0x02be131e, 0xf0b21ee0,
+        0xe34a7e13, 0x114673ed, 0xc4babff5, 0x36b6b20b, 0x254ed2f8, 0xd742df06,
+        0xe9a9e704, 0x1ba5eafa, 0x085d8a09, 0xfa5187f7, 0x2fad4bef, 0xdda14611,
+        0xce5926e2, 0x3c552b1c, 0x604cc823, 0x9240c5dd, 0x81b8a52e, 0x73b4a8d0,
+        0xa64864c8, 0x54446936, 0x47bc09c5, 0xb5b0043b, 0xff8fcfbb, 0x0d83c245,
+        0x1e7ba2b6, 0xec77af48, 0x398b6350, 0xcb876eae, 0xd87f0e5d, 0x2a7303a3,
+        0x766ae09c, 0x8466ed62, 0x979e8d91, 0x6592806f, 0xb06e4c77, 0x42624189,
+        0x519a217a, 0xa3962c84, 0xc5e5b67a, 0x37e9bb84, 0x2411db77, 0xd61dd689,
+        0x03e11a91, 0xf1ed176f, 0xe215779c, 0x10197a62, 0x4c00995d, 0xbe0c94a3,
+        0xadf4f450, 0x5ff8f9ae, 0x8a0435b6, 0x78083848, 0x6bf058bb, 0x99fc5545,
+        0xd3c39ec5, 0x21cf933b, 0x3237f3c8, 0xc03bfe36, 0x15c7322e, 0xe7cb3fd0,
+        0xf4335f23, 0x063f52dd, 0x5a26b1e2, 0xa82abc1c, 0xbbd2dcef, 0x49ded111,
+        0x9c221d09, 0x6e2e10f7, 0x7dd67004, 0x8fda7dfa,
+      },
+    };
 
-    @Override
-    public void update(byte b) {
-      crc ^= 0xFFFFFFFF;
-      // See Hacker's Delight 2nd Edition, Figure 14-7.
-      crc = ~((crc >>> 8) ^ CRC_TABLE[(crc ^ b) & 0xFF]);
+    // Value x picked so computeForWord(x) == ~0, found by exhaustive search.
+    static final int INVERSE_COMPUTE_FOR_WORD_OF_ALL_1S = 0xeee3ddcd;
+
+    static int computeForWord(int word) {
+      return STRIDE_TABLE[3][word & 0xFF]
+          ^ STRIDE_TABLE[2][(word >>> 8) & 0xFF]
+          ^ STRIDE_TABLE[1][(word >>> 16) & 0xFF]
+          ^ STRIDE_TABLE[0][word >>> 24];
     }
 
-    @Override
-    public HashCode hash() {
-      return HashCode.fromInt(crc);
+    static int combine(int csum, int crc) {
+      csum ^= crc;
+      for (int i = 0; i < 4; i++) {
+        csum = (csum >>> 8) ^ BYTE_TABLE[csum & 0xFF];
+      }
+      return csum;
     }
+
+    private static final ByteBuffer EMPTY = ByteBuffer.allocate(0);
   }
 }
diff --git a/guava/src/com/google/common/hash/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/hash/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..a2382b3
--- /dev/null
+++ b/guava/src/com/google/common/hash/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.hash;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/hash/FarmHashFingerprint64.java b/guava/src/com/google/common/hash/FarmHashFingerprint64.java
index 30eab5f..7d6a398 100644
--- a/guava/src/com/google/common/hash/FarmHashFingerprint64.java
+++ b/guava/src/com/google/common/hash/FarmHashFingerprint64.java
@@ -38,6 +38,7 @@
  * @author Kyle Maddison
  * @author Geoff Pike
  */
+@ElementTypesAreNonnullByDefault
 final class FarmHashFingerprint64 extends AbstractNonStreamingHashFunction {
   static final HashFunction FARMHASH_FINGERPRINT_64 = new FarmHashFingerprint64();
 
diff --git a/guava/src/com/google/common/hash/Funnel.java b/guava/src/com/google/common/hash/Funnel.java
index 2c6a7b9..9d80dab 100644
--- a/guava/src/com/google/common/hash/Funnel.java
+++ b/guava/src/com/google/common/hash/Funnel.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.Beta;
 import com.google.errorprone.annotations.DoNotMock;
 import java.io.Serializable;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An object which can send data from an object of type {@code T} into a {@code PrimitiveSink}.
@@ -43,7 +44,8 @@
  */
 @Beta
 @DoNotMock("Implement with a lambda")
-public interface Funnel<T> extends Serializable {
+@ElementTypesAreNonnullByDefault
+public interface Funnel<T extends @Nullable Object> extends Serializable {
 
   /**
    * Sends a stream of data from the {@code from} object into the sink {@code into}. There is no
@@ -51,5 +53,5 @@
    *
    * @since 12.0 (in Guava 11.0, {@code PrimitiveSink} was named {@code Sink})
    */
-  void funnel(T from, PrimitiveSink into);
+  void funnel(@ParametricNullness T from, PrimitiveSink into);
 }
diff --git a/guava/src/com/google/common/hash/Funnels.java b/guava/src/com/google/common/hash/Funnels.java
index 6051bfd..6673836 100644
--- a/guava/src/com/google/common/hash/Funnels.java
+++ b/guava/src/com/google/common/hash/Funnels.java
@@ -19,6 +19,7 @@
 import java.io.OutputStream;
 import java.io.Serializable;
 import java.nio.charset.Charset;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -28,6 +29,7 @@
  * @since 11.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class Funnels {
   private Funnels() {}
 
@@ -103,7 +105,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof StringCharsetFunnel) {
         StringCharsetFunnel funnel = (StringCharsetFunnel) o;
         return this.charset.equals(funnel.charset);
@@ -164,11 +166,13 @@
    *
    * @since 15.0
    */
-  public static <E> Funnel<Iterable<? extends E>> sequentialFunnel(Funnel<E> elementFunnel) {
+  public static <E extends @Nullable Object> Funnel<Iterable<? extends E>> sequentialFunnel(
+      Funnel<E> elementFunnel) {
     return new SequentialFunnel<E>(elementFunnel);
   }
 
-  private static class SequentialFunnel<E> implements Funnel<Iterable<? extends E>>, Serializable {
+  private static class SequentialFunnel<E extends @Nullable Object>
+      implements Funnel<Iterable<? extends E>>, Serializable {
     private final Funnel<E> elementFunnel;
 
     SequentialFunnel(Funnel<E> elementFunnel) {
@@ -188,7 +192,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object o) {
+    public boolean equals(@CheckForNull Object o) {
       if (o instanceof SequentialFunnel) {
         SequentialFunnel<?> funnel = (SequentialFunnel<?>) o;
         return elementFunnel.equals(funnel.elementFunnel);
diff --git a/guava/src/com/google/common/hash/HashCode.java b/guava/src/com/google/common/hash/HashCode.java
index b6a5ff8..fde2a86 100644
--- a/guava/src/com/google/common/hash/HashCode.java
+++ b/guava/src/com/google/common/hash/HashCode.java
@@ -18,13 +18,12 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
 import com.google.common.primitives.Ints;
 import com.google.common.primitives.UnsignedInts;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable hash code of arbitrary bit length.
@@ -33,7 +32,7 @@
  * @author Kurt Alfred Kluever
  * @since 11.0
  */
-@Beta
+@ElementTypesAreNonnullByDefault
 public abstract class HashCode {
   HashCode() {}
 
@@ -369,7 +368,7 @@
    * to protect against <a href="http://en.wikipedia.org/wiki/Timing_attack">timing attacks</a>.
    */
   @Override
-  public final boolean equals(@Nullable Object object) {
+  public final boolean equals(@CheckForNull Object object) {
     if (object instanceof HashCode) {
       HashCode that = (HashCode) object;
       return bits() == that.bits() && equalsSameBits(that);
@@ -402,10 +401,10 @@
    * Returns a string containing each byte of {@link #asBytes}, in order, as a two-digit unsigned
    * hexadecimal number in lower case.
    *
-   * <p>Note that if the output is considered to be a single hexadecimal number, this hash code's
-   * bytes are the <i>big-endian</i> representation of that number. This may be surprising since
-   * everything else in the hashing API uniformly treats multibyte values as little-endian. But this
-   * format conveniently matches that of utilities such as the UNIX {@code md5sum} command.
+   * <p>Note that if the output is considered to be a single hexadecimal number, whether this string
+   * is big-endian or little-endian depends on the byte order of {@link #asBytes}. This may be
+   * surprising for implementations of {@code HashCode} that represent the number in big-endian
+   * since everything else in the hashing API uniformly treats multibyte values as little-endian.
    *
    * <p>To create a {@code HashCode} from its string representation, see {@link #fromString}.
    */
diff --git a/guava/src/com/google/common/hash/HashFunction.java b/guava/src/com/google/common/hash/HashFunction.java
index 7884259..d4b7f8a 100644
--- a/guava/src/com/google/common/hash/HashFunction.java
+++ b/guava/src/com/google/common/hash/HashFunction.java
@@ -14,11 +14,11 @@
 
 package com.google.common.hash;
 
-import com.google.common.annotations.Beta;
 import com.google.common.primitives.Ints;
 import com.google.errorprone.annotations.Immutable;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A hash function is a collision-averse pure function that maps an arbitrary block of data to a
@@ -115,8 +115,8 @@
  * @author Kevin Bourrillion
  * @since 11.0
  */
-@Beta
 @Immutable
+@ElementTypesAreNonnullByDefault
 public interface HashFunction {
   /**
    * Begins a new hash code computation by returning an initialized, stateful {@code Hasher}
@@ -211,7 +211,8 @@
    *
    * @since 14.0
    */
-  <T> HashCode hashObject(T instance, Funnel<? super T> funnel);
+  <T extends @Nullable Object> HashCode hashObject(
+      @ParametricNullness T instance, Funnel<? super T> funnel);
 
   /**
    * Returns the number of bits (a multiple of 32) that each hash code produced by this hash
diff --git a/guava/src/com/google/common/hash/Hasher.java b/guava/src/com/google/common/hash/Hasher.java
index ae9ae5f..b3f24fa 100644
--- a/guava/src/com/google/common/hash/Hasher.java
+++ b/guava/src/com/google/common/hash/Hasher.java
@@ -18,6 +18,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link PrimitiveSink} that can compute a hash code after reading the input. Each hasher should
@@ -54,6 +55,7 @@
  */
 @Beta
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 public interface Hasher extends PrimitiveSink {
   @Override
   Hasher putByte(byte b);
@@ -119,7 +121,8 @@
   Hasher putString(CharSequence charSequence, Charset charset);
 
   /** A simple convenience for {@code funnel.funnel(object, this)}. */
-  <T> Hasher putObject(T instance, Funnel<? super T> funnel);
+  <T extends @Nullable Object> Hasher putObject(
+      @ParametricNullness T instance, Funnel<? super T> funnel);
 
   /**
    * Computes a hash code based on the data that have been provided to this hasher. The result is
diff --git a/guava/src/com/google/common/hash/Hashing.java b/guava/src/com/google/common/hash/Hashing.java
index a5340a6..dd65367 100644
--- a/guava/src/com/google/common/hash/Hashing.java
+++ b/guava/src/com/google/common/hash/Hashing.java
@@ -27,8 +27,8 @@
 import java.util.zip.Adler32;
 import java.util.zip.CRC32;
 import java.util.zip.Checksum;
+import javax.annotation.CheckForNull;
 import javax.crypto.spec.SecretKeySpec;
-import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Static methods to obtain {@link HashFunction} instances, and other static hashing-related
@@ -43,6 +43,7 @@
  * @since 11.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class Hashing {
   /**
    * Returns a general-purpose, <b>temporary-use</b>, non-cryptographic hash function. The algorithm
@@ -93,12 +94,53 @@
   /**
    * Returns a hash function implementing the <a
    * href="https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp">32-bit murmur3
+   * algorithm, x86 variant</a> (little-endian variant), using the given seed value, <b>with a known
+   * bug</b> as described in the deprecation text.
+   *
+   * <p>The C++ equivalent is the MurmurHash3_x86_32 function (Murmur3A), which however does not
+   * have the bug.
+   *
+   * @deprecated This implementation produces incorrect hash values from the {@link
+   *     HashFunction#hashString} method if the string contains non-BMP characters. Use {@link
+   *     #murmur3_32_fixed(int)} instead.
+   */
+  @Deprecated
+  public static HashFunction murmur3_32(int seed) {
+    return new Murmur3_32HashFunction(seed, /* supplementaryPlaneFix= */ false);
+  }
+
+  /**
+   * Returns a hash function implementing the <a
+   * href="https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp">32-bit murmur3
+   * algorithm, x86 variant</a> (little-endian variant), using the given seed value, <b>with a known
+   * bug</b> as described in the deprecation text.
+   *
+   * <p>The C++ equivalent is the MurmurHash3_x86_32 function (Murmur3A), which however does not
+   * have the bug.
+   *
+   * @deprecated This implementation produces incorrect hash values from the {@link
+   *     HashFunction#hashString} method if the string contains non-BMP characters. Use {@link
+   *     #murmur3_32_fixed()} instead.
+   */
+  @Deprecated
+  public static HashFunction murmur3_32() {
+    return Murmur3_32HashFunction.MURMUR3_32;
+  }
+
+  /**
+   * Returns a hash function implementing the <a
+   * href="https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp">32-bit murmur3
    * algorithm, x86 variant</a> (little-endian variant), using the given seed value.
    *
    * <p>The exact C++ equivalent is the MurmurHash3_x86_32 function (Murmur3A).
+   *
+   * <p>This method is called {@code murmur3_32_fixed} because it fixes a bug in the {@code
+   * HashFunction} returned by the original {@code murmur3_32} method.
+   *
+   * @since 31.0
    */
-  public static HashFunction murmur3_32(int seed) {
-    return new Murmur3_32HashFunction(seed);
+  public static HashFunction murmur3_32_fixed(int seed) {
+    return new Murmur3_32HashFunction(seed, /* supplementaryPlaneFix= */ true);
   }
 
   /**
@@ -107,9 +149,14 @@
    * algorithm, x86 variant</a> (little-endian variant), using a seed value of zero.
    *
    * <p>The exact C++ equivalent is the MurmurHash3_x86_32 function (Murmur3A).
+   *
+   * <p>This method is called {@code murmur3_32_fixed} because it fixes a bug in the {@code
+   * HashFunction} returned by the original {@code murmur3_32} method.
+   *
+   * @since 31.0
    */
-  public static HashFunction murmur3_32() {
-    return Murmur3_32HashFunction.MURMUR3_32;
+  public static HashFunction murmur3_32_fixed() {
+    return Murmur3_32HashFunction.MURMUR3_32_FIXED;
   }
 
   /**
@@ -234,7 +281,6 @@
    * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
    * MD5 (128 hash bits) hash function and the given secret key.
    *
-   *
    * @param key the secret key
    * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
    * @since 20.0
@@ -248,7 +294,6 @@
    * MD5 (128 hash bits) hash function and a {@link SecretKeySpec} created from the given byte array
    * and the MD5 algorithm.
    *
-   *
    * @param key the key material of the secret key
    * @since 20.0
    */
@@ -260,7 +305,6 @@
    * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
    * SHA-1 (160 hash bits) hash function and the given secret key.
    *
-   *
    * @param key the secret key
    * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
    * @since 20.0
@@ -274,7 +318,6 @@
    * SHA-1 (160 hash bits) hash function and a {@link SecretKeySpec} created from the given byte
    * array and the SHA-1 algorithm.
    *
-   *
    * @param key the key material of the secret key
    * @since 20.0
    */
@@ -286,7 +329,6 @@
    * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
    * SHA-256 (256 hash bits) hash function and the given secret key.
    *
-   *
    * @param key the secret key
    * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
    * @since 20.0
@@ -300,7 +342,6 @@
    * SHA-256 (256 hash bits) hash function and a {@link SecretKeySpec} created from the given byte
    * array and the SHA-256 algorithm.
    *
-   *
    * @param key the key material of the secret key
    * @since 20.0
    */
@@ -312,7 +353,6 @@
    * Returns a hash function implementing the Message Authentication Code (MAC) algorithm, using the
    * SHA-512 (512 hash bits) hash function and the given secret key.
    *
-   *
    * @param key the secret key
    * @throws IllegalArgumentException if the given key is inappropriate for initializing this MAC
    * @since 20.0
@@ -326,7 +366,6 @@
    * SHA-512 (512 hash bits) hash function and a {@link SecretKeySpec} created from the given byte
    * array and the SHA-512 algorithm.
    *
-   *
    * @param key the key material of the secret key
    * @since 20.0
    */
@@ -457,7 +496,6 @@
    *       traffic to {@code charlie}, rather than letting {@code bravo} keep its traffic.
    * </ul>
    *
-   *
    * <p>See the <a href="http://en.wikipedia.org/wiki/Consistent_hashing">Wikipedia article on
    * consistent hashing</a> for more information.
    */
@@ -492,7 +530,6 @@
    *       traffic to {@code charlie}, rather than letting {@code bravo} keep its traffic.
    * </ul>
    *
-   *
    * <p>See the <a href="http://en.wikipedia.org/wiki/Consistent_hashing">Wikipedia article on
    * consistent hashing</a> for more information.
    */
@@ -643,7 +680,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof ConcatenatedHashFunction) {
         ConcatenatedHashFunction other = (ConcatenatedHashFunction) object;
         return Arrays.equals(functions, other.functions);
diff --git a/guava/src/com/google/common/hash/HashingInputStream.java b/guava/src/com/google/common/hash/HashingInputStream.java
index f49dfd6..bf9464c 100644
--- a/guava/src/com/google/common/hash/HashingInputStream.java
+++ b/guava/src/com/google/common/hash/HashingInputStream.java
@@ -29,6 +29,7 @@
  * @since 16.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class HashingInputStream extends FilterInputStream {
   private final Hasher hasher;
 
diff --git a/guava/src/com/google/common/hash/HashingOutputStream.java b/guava/src/com/google/common/hash/HashingOutputStream.java
index 7a1c8d8..f138bba 100644
--- a/guava/src/com/google/common/hash/HashingOutputStream.java
+++ b/guava/src/com/google/common/hash/HashingOutputStream.java
@@ -28,6 +28,7 @@
  * @since 16.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class HashingOutputStream extends FilterOutputStream {
   private final Hasher hasher;
 
diff --git a/guava/src/com/google/common/hash/ImmutableSupplier.java b/guava/src/com/google/common/hash/ImmutableSupplier.java
index f90352a..24f711a 100644
--- a/guava/src/com/google/common/hash/ImmutableSupplier.java
+++ b/guava/src/com/google/common/hash/ImmutableSupplier.java
@@ -21,5 +21,7 @@
  * Explicitly named subinterface of {@link Supplier} that can be marked {@literal @}{@link
  * Immutable}.
  */
+// TODO(cpovirk): Should we just use ChecksumType directly instead of defining this type?
 @Immutable
+@ElementTypesAreNonnullByDefault
 interface ImmutableSupplier<T> extends Supplier<T> {}
diff --git a/guava/src/com/google/common/hash/Java8Compatibility.java b/guava/src/com/google/common/hash/Java8Compatibility.java
index 52f71e7..c15f2b3 100644
--- a/guava/src/com/google/common/hash/Java8Compatibility.java
+++ b/guava/src/com/google/common/hash/Java8Compatibility.java
@@ -22,6 +22,7 @@
  * https://github.com/google/guava/issues/3990
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class Java8Compatibility {
   static void clear(Buffer b) {
     b.clear();
diff --git a/guava/src/com/google/common/hash/LittleEndianByteArray.java b/guava/src/com/google/common/hash/LittleEndianByteArray.java
index 22ef4f0..15d8b2c 100644
--- a/guava/src/com/google/common/hash/LittleEndianByteArray.java
+++ b/guava/src/com/google/common/hash/LittleEndianByteArray.java
@@ -24,6 +24,7 @@
  * @author Kevin Damm
  * @author Kyle Maddison
  */
+@ElementTypesAreNonnullByDefault
 final class LittleEndianByteArray {
 
   /** The instance that actually does the work; delegates to Unsafe or a pure-Java fallback. */
diff --git a/guava/src/com/google/common/hash/LongAddable.java b/guava/src/com/google/common/hash/LongAddable.java
index a95eece..5c6a7f0 100644
--- a/guava/src/com/google/common/hash/LongAddable.java
+++ b/guava/src/com/google/common/hash/LongAddable.java
@@ -14,11 +14,13 @@
 
 package com.google.common.hash;
 
+
 /**
  * Abstract interface for objects that can concurrently add longs.
  *
  * @author Louis Wasserman
  */
+@ElementTypesAreNonnullByDefault
 interface LongAddable {
   void increment();
 
diff --git a/guava/src/com/google/common/hash/LongAddables.java b/guava/src/com/google/common/hash/LongAddables.java
index d2768bc..370030d 100644
--- a/guava/src/com/google/common/hash/LongAddables.java
+++ b/guava/src/com/google/common/hash/LongAddables.java
@@ -22,6 +22,7 @@
  *
  * @author Louis Wasserman
  */
+@ElementTypesAreNonnullByDefault
 final class LongAddables {
   private static final Supplier<LongAddable> SUPPLIER;
 
diff --git a/guava/src/com/google/common/hash/LongAdder.java b/guava/src/com/google/common/hash/LongAdder.java
index bd08428..dc864aa 100644
--- a/guava/src/com/google/common/hash/LongAdder.java
+++ b/guava/src/com/google/common/hash/LongAdder.java
@@ -38,6 +38,7 @@
  * @since 1.8
  * @author Doug Lea
  */
+@ElementTypesAreNonnullByDefault
 final class LongAdder extends Striped64 implements Serializable, LongAddable {
   private static final long serialVersionUID = 7249069246863182397L;
 
diff --git a/guava/src/com/google/common/hash/MacHashFunction.java b/guava/src/com/google/common/hash/MacHashFunction.java
index ed1841c..031b1c0 100644
--- a/guava/src/com/google/common/hash/MacHashFunction.java
+++ b/guava/src/com/google/common/hash/MacHashFunction.java
@@ -30,6 +30,7 @@
  * @author Kurt Alfred Kluever
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class MacHashFunction extends AbstractHashFunction {
 
   @SuppressWarnings("Immutable") // cloned before each use
diff --git a/guava/src/com/google/common/hash/MessageDigestHashFunction.java b/guava/src/com/google/common/hash/MessageDigestHashFunction.java
index 5c48c7d..48b47b0 100644
--- a/guava/src/com/google/common/hash/MessageDigestHashFunction.java
+++ b/guava/src/com/google/common/hash/MessageDigestHashFunction.java
@@ -32,6 +32,7 @@
  * @author Dimitris Andreou
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class MessageDigestHashFunction extends AbstractHashFunction implements Serializable {
 
   @SuppressWarnings("Immutable") // cloned before each use
diff --git a/guava/src/com/google/common/hash/Murmur3_128HashFunction.java b/guava/src/com/google/common/hash/Murmur3_128HashFunction.java
index 4cb7adc..d1304f8 100644
--- a/guava/src/com/google/common/hash/Murmur3_128HashFunction.java
+++ b/guava/src/com/google/common/hash/Murmur3_128HashFunction.java
@@ -31,7 +31,7 @@
 import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * See MurmurHash3_x64_128 in <a href="http://smhasher.googlecode.com/svn/trunk/MurmurHash3.cpp">the
@@ -41,6 +41,7 @@
  * @author Dimitris Andreou
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class Murmur3_128HashFunction extends AbstractHashFunction implements Serializable {
   static final HashFunction MURMUR3_128 = new Murmur3_128HashFunction(0);
 
@@ -70,7 +71,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Murmur3_128HashFunction) {
       Murmur3_128HashFunction other = (Murmur3_128HashFunction) object;
       return seed == other.seed;
diff --git a/guava/src/com/google/common/hash/Murmur3_32HashFunction.java b/guava/src/com/google/common/hash/Murmur3_32HashFunction.java
index 4a21383..a47184b 100644
--- a/guava/src/com/google/common/hash/Murmur3_32HashFunction.java
+++ b/guava/src/com/google/common/hash/Murmur3_32HashFunction.java
@@ -39,7 +39,7 @@
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.charset.Charset;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * See MurmurHash3_x86_32 in <a
@@ -51,11 +51,17 @@
  * @author Kurt Alfred Kluever
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class Murmur3_32HashFunction extends AbstractHashFunction implements Serializable {
-  static final HashFunction MURMUR3_32 = new Murmur3_32HashFunction(0);
+  static final HashFunction MURMUR3_32 =
+      new Murmur3_32HashFunction(0, /* supplementaryPlaneFix= */ false);
+  static final HashFunction MURMUR3_32_FIXED =
+      new Murmur3_32HashFunction(0, /* supplementaryPlaneFix= */ true);
 
+  // We can include the non-BMP fix here because Hashing.goodFastHash stresses that the hash is a
+  // temporary-use one. Therefore it shouldn't be persisted.
   static final HashFunction GOOD_FAST_HASH_32 =
-      new Murmur3_32HashFunction(Hashing.GOOD_FAST_HASH_SEED);
+      new Murmur3_32HashFunction(Hashing.GOOD_FAST_HASH_SEED, /* supplementaryPlaneFix= */ true);
 
   private static final int CHUNK_SIZE = 4;
 
@@ -63,9 +69,11 @@
   private static final int C2 = 0x1b873593;
 
   private final int seed;
+  private final boolean supplementaryPlaneFix;
 
-  Murmur3_32HashFunction(int seed) {
+  Murmur3_32HashFunction(int seed, boolean supplementaryPlaneFix) {
     this.seed = seed;
+    this.supplementaryPlaneFix = supplementaryPlaneFix;
   }
 
   @Override
@@ -84,10 +92,10 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof Murmur3_32HashFunction) {
       Murmur3_32HashFunction other = (Murmur3_32HashFunction) object;
-      return seed == other.seed;
+      return seed == other.seed && supplementaryPlaneFix == other.supplementaryPlaneFix;
     }
     return false;
   }
@@ -190,6 +198,9 @@
           }
           i++;
           buffer |= codePointToFourUtf8Bytes(codePoint) << shift;
+          if (supplementaryPlaneFix) { // bug compatibility: earlier versions did not have this add
+            shift += 32;
+          }
           len += 4;
         }
 
@@ -391,20 +402,22 @@
   }
 
   private static long codePointToFourUtf8Bytes(int codePoint) {
-    return (((0xFL << 4) | (codePoint >>> 18)) & 0xFF)
+    // codePoint has at most 21 bits
+    return ((0xFL << 4) | (codePoint >>> 18))
         | ((0x80L | (0x3F & (codePoint >>> 12))) << 8)
         | ((0x80L | (0x3F & (codePoint >>> 6))) << 16)
         | ((0x80L | (0x3F & codePoint)) << 24);
   }
 
   private static long charToThreeUtf8Bytes(char c) {
-    return (((0xF << 5) | (c >>> 12)) & 0xFF)
+    return ((0x7L << 5) | (c >>> 12))
         | ((0x80 | (0x3F & (c >>> 6))) << 8)
         | ((0x80 | (0x3F & c)) << 16);
   }
 
   private static long charToTwoUtf8Bytes(char c) {
-    return (((0xF << 6) | (c >>> 6)) & 0xFF) | ((0x80 | (0x3F & c)) << 8);
+    // c has at most 11 bits
+    return ((0x3L << 6) | (c >>> 6)) | ((0x80 | (0x3F & c)) << 8);
   }
 
   private static final long serialVersionUID = 0L;
diff --git a/guava/src/com/google/common/hash/ParametricNullness.java b/guava/src/com/google/common/hash/ParametricNullness.java
new file mode 100644
index 0000000..2ae8d42
--- /dev/null
+++ b/guava/src/com/google/common/hash/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.hash;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/hash/PrimitiveSink.java b/guava/src/com/google/common/hash/PrimitiveSink.java
index ffeb8fd..a29ba4e 100644
--- a/guava/src/com/google/common/hash/PrimitiveSink.java
+++ b/guava/src/com/google/common/hash/PrimitiveSink.java
@@ -27,6 +27,7 @@
  */
 @Beta
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 public interface PrimitiveSink {
   /**
    * Puts a byte into this sink.
diff --git a/guava/src/com/google/common/hash/SipHashFunction.java b/guava/src/com/google/common/hash/SipHashFunction.java
index 6ec8a63..a226b61 100644
--- a/guava/src/com/google/common/hash/SipHashFunction.java
+++ b/guava/src/com/google/common/hash/SipHashFunction.java
@@ -24,7 +24,7 @@
 import com.google.errorprone.annotations.Immutable;
 import java.io.Serializable;
 import java.nio.ByteBuffer;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * {@link HashFunction} implementation of SipHash-c-d.
@@ -34,6 +34,7 @@
  * @author Daniel J. Bernstein
  */
 @Immutable
+@ElementTypesAreNonnullByDefault
 final class SipHashFunction extends AbstractHashFunction implements Serializable {
   static final HashFunction SIP_HASH_24 =
       new SipHashFunction(2, 4, 0x0706050403020100L, 0x0f0e0d0c0b0a0908L);
@@ -81,7 +82,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object instanceof SipHashFunction) {
       SipHashFunction other = (SipHashFunction) object;
       return (c == other.c) && (d == other.d) && (k0 == other.k0) && (k1 == other.k1);
diff --git a/guava/src/com/google/common/hash/Striped64.java b/guava/src/com/google/common/hash/Striped64.java
index 3f6cf1b..1a0671c 100644
--- a/guava/src/com/google/common/hash/Striped64.java
+++ b/guava/src/com/google/common/hash/Striped64.java
@@ -13,6 +13,7 @@
 
 import com.google.common.annotations.GwtIncompatible;
 import java.util.Random;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -21,6 +22,7 @@
  * so.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class Striped64 extends Number {
   /*
    * This class maintains a lazily-initialized table of atomically
@@ -125,7 +127,7 @@
    * class, we use a suboptimal int[] representation to avoid introducing a new type that can impede
    * class-unloading when ThreadLocals are not removed.
    */
-  static final ThreadLocal<int[]> threadHashCode = new ThreadLocal<>();
+  static final ThreadLocal<int @Nullable []> threadHashCode = new ThreadLocal<>();
 
   /** Generator of new random hash codes */
   static final Random rng = new Random();
@@ -134,7 +136,7 @@
   static final int NCPU = Runtime.getRuntime().availableProcessors();
 
   /** Table of cells. When non-null, size is a power of 2. */
-  transient volatile Cell @Nullable [] cells;
+  @CheckForNull transient volatile Cell[] cells;
 
   /**
    * Base value, used mainly when there is no contention, but also as a fallback during table
@@ -177,7 +179,7 @@
    * @param hc the hash code holder
    * @param wasUncontended false if CAS failed before call
    */
-  final void retryUpdate(long x, int @Nullable [] hc, boolean wasUncontended) {
+  final void retryUpdate(long x, @CheckForNull int[] hc, boolean wasUncontended) {
     int h;
     if (hc == null) {
       threadHashCode.set(hc = new int[1]); // Initialize randomly
diff --git a/guava/src/com/google/common/html/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/html/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..a28b716
--- /dev/null
+++ b/guava/src/com/google/common/html/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.html;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/html/HtmlEscapers.java b/guava/src/com/google/common/html/HtmlEscapers.java
index 29eebe8..c426388 100644
--- a/guava/src/com/google/common/html/HtmlEscapers.java
+++ b/guava/src/com/google/common/html/HtmlEscapers.java
@@ -35,6 +35,7 @@
  * @since 15.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class HtmlEscapers {
   /**
    * Returns an {@link Escaper} instance that escapes HTML metacharacters as specified by <a
diff --git a/guava/src/com/google/common/html/ParametricNullness.java b/guava/src/com/google/common/html/ParametricNullness.java
new file mode 100644
index 0000000..9a62c35
--- /dev/null
+++ b/guava/src/com/google/common/html/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.html;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/io/AppendableWriter.java b/guava/src/com/google/common/io/AppendableWriter.java
index 85b137e..d9aab34 100644
--- a/guava/src/com/google/common/io/AppendableWriter.java
+++ b/guava/src/com/google/common/io/AppendableWriter.java
@@ -21,7 +21,7 @@
 import java.io.Flushable;
 import java.io.IOException;
 import java.io.Writer;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Writer that places all output on an {@link Appendable} target. If the target is {@link Flushable}
@@ -32,6 +32,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 class AppendableWriter extends Writer {
   private final Appendable target;
   private boolean closed;
@@ -68,13 +69,15 @@
   }
 
   @Override
-  public void write(@Nullable String str) throws IOException {
+  public void write(String str) throws IOException {
+    checkNotNull(str);
     checkNotClosed();
     target.append(str);
   }
 
   @Override
-  public void write(@Nullable String str, int off, int len) throws IOException {
+  public void write(String str, int off, int len) throws IOException {
+    checkNotNull(str);
     checkNotClosed();
     // tricky: append takes start, end pair...
     target.append(str, off, off + len);
@@ -104,14 +107,14 @@
   }
 
   @Override
-  public Writer append(@Nullable CharSequence charSeq) throws IOException {
+  public Writer append(@CheckForNull CharSequence charSeq) throws IOException {
     checkNotClosed();
     target.append(charSeq);
     return this;
   }
 
   @Override
-  public Writer append(@Nullable CharSequence charSeq, int start, int end) throws IOException {
+  public Writer append(@CheckForNull CharSequence charSeq, int start, int end) throws IOException {
     checkNotClosed();
     target.append(charSeq, start, end);
     return this;
diff --git a/guava/src/com/google/common/io/BaseEncoding.java b/guava/src/com/google/common/io/BaseEncoding.java
index e2b7e00..f42857c 100644
--- a/guava/src/com/google/common/io/BaseEncoding.java
+++ b/guava/src/com/google/common/io/BaseEncoding.java
@@ -35,7 +35,7 @@
 import java.io.Reader;
 import java.io.Writer;
 import java.util.Arrays;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A binary encoding scheme for reversibly translating between byte sequences and printable ASCII
@@ -122,6 +122,7 @@
  * @since 14.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public abstract class BaseEncoding {
   // TODO(lowasser): consider making encodeTo(Appendable, byte[], int, int) public.
 
@@ -190,11 +191,10 @@
   private static byte[] extract(byte[] result, int length) {
     if (length == result.length) {
       return result;
-    } else {
-      byte[] trunc = new byte[length];
-      System.arraycopy(result, 0, trunc, 0, length);
-      return trunc;
     }
+    byte[] trunc = new byte[length];
+    System.arraycopy(result, 0, trunc, 0, length);
+    return trunc;
   }
 
   /**
@@ -226,7 +226,8 @@
    *
    * @throws DecodingException if the input is not a valid encoded string according to this
    *     encoding.
-   */ final byte[] decodeChecked(CharSequence chars)
+   */
+  final byte[] decodeChecked(CharSequence chars)
       throws DecodingException {
     chars = trimTrailingPadding(chars);
     byte[] tmp = new byte[maxDecodedSize(chars.length())];
@@ -516,27 +517,25 @@
     Alphabet upperCase() {
       if (!hasLowerCase()) {
         return this;
-      } else {
-        checkState(!hasUpperCase(), "Cannot call upperCase() on a mixed-case alphabet");
-        char[] upperCased = new char[chars.length];
-        for (int i = 0; i < chars.length; i++) {
-          upperCased[i] = Ascii.toUpperCase(chars[i]);
-        }
-        return new Alphabet(name + ".upperCase()", upperCased);
       }
+      checkState(!hasUpperCase(), "Cannot call upperCase() on a mixed-case alphabet");
+      char[] upperCased = new char[chars.length];
+      for (int i = 0; i < chars.length; i++) {
+        upperCased[i] = Ascii.toUpperCase(chars[i]);
+      }
+      return new Alphabet(name + ".upperCase()", upperCased);
     }
 
     Alphabet lowerCase() {
       if (!hasUpperCase()) {
         return this;
-      } else {
-        checkState(!hasLowerCase(), "Cannot call lowerCase() on a mixed-case alphabet");
-        char[] lowerCased = new char[chars.length];
-        for (int i = 0; i < chars.length; i++) {
-          lowerCased[i] = Ascii.toLowerCase(chars[i]);
-        }
-        return new Alphabet(name + ".lowerCase()", lowerCased);
       }
+      checkState(!hasLowerCase(), "Cannot call lowerCase() on a mixed-case alphabet");
+      char[] lowerCased = new char[chars.length];
+      for (int i = 0; i < chars.length; i++) {
+        lowerCased[i] = Ascii.toLowerCase(chars[i]);
+      }
+      return new Alphabet(name + ".lowerCase()", lowerCased);
     }
 
     public boolean matches(char c) {
@@ -549,7 +548,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object other) {
+    public boolean equals(@CheckForNull Object other) {
       if (other instanceof Alphabet) {
         Alphabet that = (Alphabet) other;
         return Arrays.equals(this.chars, that.chars);
@@ -567,13 +566,13 @@
     // TODO(lowasser): provide a useful toString
     final Alphabet alphabet;
 
-    final @Nullable Character paddingChar;
+    @CheckForNull final Character paddingChar;
 
-    StandardBaseEncoding(String name, String alphabetChars, @Nullable Character paddingChar) {
+    StandardBaseEncoding(String name, String alphabetChars, @CheckForNull Character paddingChar) {
       this(new Alphabet(name, alphabetChars.toCharArray()), paddingChar);
     }
 
-    StandardBaseEncoding(Alphabet alphabet, @Nullable Character paddingChar) {
+    StandardBaseEncoding(Alphabet alphabet, @CheckForNull Character paddingChar) {
       this.alphabet = checkNotNull(alphabet);
       checkArgument(
           paddingChar == null || !alphabet.matches(paddingChar),
@@ -831,8 +830,8 @@
       return new SeparatedBaseEncoding(this, separator, afterEveryChars);
     }
 
-    @LazyInit private transient @Nullable BaseEncoding upperCase;
-    @LazyInit private transient @Nullable BaseEncoding lowerCase;
+    @LazyInit @CheckForNull private transient BaseEncoding upperCase;
+    @LazyInit @CheckForNull private transient BaseEncoding lowerCase;
 
     @Override
     public BaseEncoding upperCase() {
@@ -854,7 +853,7 @@
       return result;
     }
 
-    BaseEncoding newInstance(Alphabet alphabet, @Nullable Character paddingChar) {
+    BaseEncoding newInstance(Alphabet alphabet, @CheckForNull Character paddingChar) {
       return new StandardBaseEncoding(alphabet, paddingChar);
     }
 
@@ -873,7 +872,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object other) {
+    public boolean equals(@CheckForNull Object other) {
       if (other instanceof StandardBaseEncoding) {
         StandardBaseEncoding that = (StandardBaseEncoding) other;
         return this.alphabet.equals(that.alphabet)
@@ -930,17 +929,17 @@
     }
 
     @Override
-    BaseEncoding newInstance(Alphabet alphabet, @Nullable Character paddingChar) {
+    BaseEncoding newInstance(Alphabet alphabet, @CheckForNull Character paddingChar) {
       return new Base16Encoding(alphabet);
     }
   }
 
   static final class Base64Encoding extends StandardBaseEncoding {
-    Base64Encoding(String name, String alphabetChars, @Nullable Character paddingChar) {
+    Base64Encoding(String name, String alphabetChars, @CheckForNull Character paddingChar) {
       this(new Alphabet(name, alphabetChars.toCharArray()), paddingChar);
     }
 
-    private Base64Encoding(Alphabet alphabet, @Nullable Character paddingChar) {
+    private Base64Encoding(Alphabet alphabet, @CheckForNull Character paddingChar) {
       super(alphabet, paddingChar);
       checkArgument(alphabet.chars.length == 64);
     }
@@ -987,7 +986,7 @@
     }
 
     @Override
-    BaseEncoding newInstance(Alphabet alphabet, @Nullable Character paddingChar) {
+    BaseEncoding newInstance(Alphabet alphabet, @CheckForNull Character paddingChar) {
       return new Base64Encoding(alphabet, paddingChar);
     }
   }
@@ -1038,12 +1037,12 @@
       }
 
       @Override
-      public Appendable append(@Nullable CharSequence chars, int off, int len) throws IOException {
+      public Appendable append(@CheckForNull CharSequence chars, int off, int len) {
         throw new UnsupportedOperationException();
       }
 
       @Override
-      public Appendable append(@Nullable CharSequence chars) throws IOException {
+      public Appendable append(@CheckForNull CharSequence chars) {
         throw new UnsupportedOperationException();
       }
     };
diff --git a/guava/src/com/google/common/io/ByteArrayDataInput.java b/guava/src/com/google/common/io/ByteArrayDataInput.java
index bef1431..cf84fcc 100644
--- a/guava/src/com/google/common/io/ByteArrayDataInput.java
+++ b/guava/src/com/google/common/io/ByteArrayDataInput.java
@@ -18,6 +18,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.DataInput;
 import java.io.IOException;
+import javax.annotation.CheckForNull;
 
 /**
  * An extension of {@code DataInput} for reading from in-memory byte arrays; its methods offer
@@ -32,6 +33,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface ByteArrayDataInput extends DataInput {
   @Override
   void readFully(byte b[]);
@@ -86,6 +88,7 @@
 
   @CanIgnoreReturnValue // to skip a line
   @Override
+  @CheckForNull
   String readLine();
 
   @CanIgnoreReturnValue // to skip a field
diff --git a/guava/src/com/google/common/io/ByteArrayDataOutput.java b/guava/src/com/google/common/io/ByteArrayDataOutput.java
index e1ad6ab..3739073 100644
--- a/guava/src/com/google/common/io/ByteArrayDataOutput.java
+++ b/guava/src/com/google/common/io/ByteArrayDataOutput.java
@@ -26,6 +26,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface ByteArrayDataOutput extends DataOutput {
   @Override
   void write(int b);
diff --git a/guava/src/com/google/common/io/ByteProcessor.java b/guava/src/com/google/common/io/ByteProcessor.java
index 115c735..98ea3ff 100644
--- a/guava/src/com/google/common/io/ByteProcessor.java
+++ b/guava/src/com/google/common/io/ByteProcessor.java
@@ -19,6 +19,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.DoNotMock;
 import java.io.IOException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A callback interface to process bytes from a stream.
@@ -32,7 +33,8 @@
 @Beta
 @DoNotMock("Implement it normally")
 @GwtIncompatible
-public interface ByteProcessor<T> {
+@ElementTypesAreNonnullByDefault
+public interface ByteProcessor<T extends @Nullable Object> {
   /**
    * This method will be called for each chunk of bytes in an input stream. The implementation
    * should process the bytes from {@code buf[off]} through {@code buf[off + len - 1]} (inclusive).
@@ -46,5 +48,6 @@
   boolean processBytes(byte[] buf, int off, int len) throws IOException;
 
   /** Return the result of processing all the bytes. */
+  @ParametricNullness
   T getResult();
 }
diff --git a/guava/src/com/google/common/io/ByteSink.java b/guava/src/com/google/common/io/ByteSink.java
index ffba6e0..7a6af6f 100644
--- a/guava/src/com/google/common/io/ByteSink.java
+++ b/guava/src/com/google/common/io/ByteSink.java
@@ -46,6 +46,7 @@
  * @author Colin Decker
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ByteSink {
 
   /** Constructor for use by subclasses. */
diff --git a/guava/src/com/google/common/io/ByteSource.java b/guava/src/com/google/common/io/ByteSource.java
index 19f3a43..c8da967 100644
--- a/guava/src/com/google/common/io/ByteSource.java
+++ b/guava/src/com/google/common/io/ByteSource.java
@@ -40,6 +40,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A readable source of bytes, such as a file. Unlike an {@link InputStream}, a {@code ByteSource}
@@ -57,10 +58,23 @@
  *       doing something and finally closing the stream that was opened.
  * </ul>
  *
+ * <p><b>Note:</b> In general, {@code ByteSource} is intended to be used for "file-like" sources
+ * that provide streams that are:
+ *
+ * <ul>
+ *   <li><b>Finite:</b> Many operations, such as {@link #size()} and {@link #read()}, will either
+ *       block indefinitely or fail if the source creates an infinite stream.
+ *   <li><b>Non-destructive:</b> A <i>destructive</i> stream will consume or otherwise alter the
+ *       bytes of the source as they are read from it. A source that provides such streams will not
+ *       be reusable, and operations that read from the stream (including {@link #size()}, in some
+ *       implementations) will prevent further operations from completing as expected.
+ * </ul>
+ *
  * @since 14.0
  * @author Colin Decker
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ByteSource {
 
   /** Constructor for use by subclasses. */
@@ -302,7 +316,7 @@
    */
   @Beta
   @CanIgnoreReturnValue // some processors won't return a useful result
-  public <T> T read(ByteProcessor<T> processor) throws IOException {
+  public <T extends @Nullable Object> T read(ByteProcessor<T> processor) throws IOException {
     checkNotNull(processor);
 
     Closer closer = Closer.create();
@@ -416,7 +430,7 @@
    * Returns a view of the given byte array as a {@link ByteSource}. To view only a specific range
    * in the array, use {@code ByteSource.wrap(b).slice(offset, length)}.
    *
-   * <p>Note that the given byte array may be be passed directly to methods on, for example, {@code
+   * <p>Note that the given byte array may be passed directly to methods on, for example, {@code
    * OutputStream} (when {@code copyTo(OutputStream)} is called on the resulting {@code
    * ByteSource}). This could allow a malicious {@code OutputStream} implementation to modify the
    * contents of the array, but provides better performance in the normal case.
@@ -606,7 +620,8 @@
 
     @SuppressWarnings("CheckReturnValue") // it doesn't matter what processBytes returns here
     @Override
-    public <T> T read(ByteProcessor<T> processor) throws IOException {
+    @ParametricNullness
+    public <T extends @Nullable Object> T read(ByteProcessor<T> processor) throws IOException {
       processor.processBytes(bytes, offset, length);
       return processor.getResult();
     }
diff --git a/guava/src/com/google/common/io/ByteStreams.java b/guava/src/com/google/common/io/ByteStreams.java
index bdb24db..2f1f669 100644
--- a/guava/src/com/google/common/io/ByteStreams.java
+++ b/guava/src/com/google/common/io/ByteStreams.java
@@ -41,6 +41,8 @@
 import java.util.ArrayDeque;
 import java.util.Arrays;
 import java.util.Queue;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides utility methods for working with byte arrays and I/O streams.
@@ -50,6 +52,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ByteStreams {
 
   private static final int BUFFER_SIZE = 8192;
@@ -438,6 +441,7 @@
     }
 
     @Override
+    @CheckForNull
     public String readLine() {
       try {
         return input.readLine();
@@ -869,7 +873,9 @@
    */
   @Beta
   @CanIgnoreReturnValue // some processors won't return a useful result
-  public static <T> T readBytes(InputStream input, ByteProcessor<T> processor) throws IOException {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T readBytes(
+      InputStream input, ByteProcessor<T> processor) throws IOException {
     checkNotNull(input);
     checkNotNull(processor);
 
diff --git a/guava/src/com/google/common/io/CharSequenceReader.java b/guava/src/com/google/common/io/CharSequenceReader.java
index 4cbeda1..790e266 100644
--- a/guava/src/com/google/common/io/CharSequenceReader.java
+++ b/guava/src/com/google/common/io/CharSequenceReader.java
@@ -17,11 +17,13 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtIncompatible;
 import java.io.IOException;
 import java.io.Reader;
 import java.nio.CharBuffer;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link Reader} that reads the characters in a {@link CharSequence}. Like {@code StringReader},
@@ -31,9 +33,10 @@
  */
 // TODO(cgdecker): make this public? as a type, or a method in CharStreams?
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class CharSequenceReader extends Reader {
 
-  private CharSequence seq;
+  @CheckForNull private CharSequence seq;
   private int pos;
   private int mark;
 
@@ -53,13 +56,27 @@
   }
 
   private int remaining() {
+    requireNonNull(seq); // safe as long as we call this only after checkOpen
     return seq.length() - pos;
   }
 
+  /*
+   * To avoid the need to call requireNonNull so much, we could consider more clever approaches,
+   * such as:
+   *
+   * - Make checkOpen return the non-null `seq`. Then callers can assign that to a local variable or
+   *   even back to `this.seq`. However, that may suggest that we're defending against concurrent
+   *   mutation, which is not an actual risk because we use `synchronized`.
+   * - Make `remaining` require a non-null `seq` argument. But this is a bit weird because the
+   *   method, while it would avoid the instance field `seq` would still access the instance field
+   *   `pos`.
+   */
+
   @Override
   public synchronized int read(CharBuffer target) throws IOException {
     checkNotNull(target);
     checkOpen();
+    requireNonNull(seq); // safe because of checkOpen
     if (!hasRemaining()) {
       return -1;
     }
@@ -73,6 +90,7 @@
   @Override
   public synchronized int read() throws IOException {
     checkOpen();
+    requireNonNull(seq); // safe because of checkOpen
     return hasRemaining() ? seq.charAt(pos++) : -1;
   }
 
@@ -80,6 +98,7 @@
   public synchronized int read(char[] cbuf, int off, int len) throws IOException {
     checkPositionIndexes(off, off + len, cbuf.length);
     checkOpen();
+    requireNonNull(seq); // safe because of checkOpen
     if (!hasRemaining()) {
       return -1;
     }
diff --git a/guava/src/com/google/common/io/CharSink.java b/guava/src/com/google/common/io/CharSink.java
index 7197265..f804dae 100644
--- a/guava/src/com/google/common/io/CharSink.java
+++ b/guava/src/com/google/common/io/CharSink.java
@@ -51,6 +51,7 @@
  * @author Colin Decker
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class CharSink {
 
   /** Constructor for use by subclasses. */
diff --git a/guava/src/com/google/common/io/CharSource.java b/guava/src/com/google/common/io/CharSource.java
index ac3df0c..24a67af 100644
--- a/guava/src/com/google/common/io/CharSource.java
+++ b/guava/src/com/google/common/io/CharSource.java
@@ -39,6 +39,7 @@
 import java.util.List;
 import java.util.function.Consumer;
 import java.util.stream.Stream;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -65,10 +66,23 @@
  * <p>Any {@link ByteSource} containing text encoded with a specific {@linkplain Charset character
  * encoding} may be viewed as a {@code CharSource} using {@link ByteSource#asCharSource(Charset)}.
  *
+ * <p><b>Note:</b> In general, {@code CharSource} is intended to be used for "file-like" sources
+ * that provide readers that are:
+ *
+ * <ul>
+ *   <li><b>Finite:</b> Many operations, such as {@link #length()} and {@link #read()}, will either
+ *       block indefinitely or fail if the source creates an infinite reader.
+ *   <li><b>Non-destructive:</b> A <i>destructive</i> reader will consume or otherwise alter the
+ *       source as they are read from it. A source that provides such readers will not be reusable,
+ *       and operations that read from the stream (including {@link #length()}, in some
+ *       implementations) will prevent further operations from completing as expected.
+ * </ul>
+ *
  * @since 14.0
  * @author Colin Decker
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class CharSource {
 
   /** Constructor for use by subclasses. */
@@ -295,7 +309,8 @@
    *
    * @throws IOException if an I/O error occurs while reading from this source
    */
-  public @Nullable String readFirstLine() throws IOException {
+  @CheckForNull
+  public String readFirstLine() throws IOException {
     Closer closer = Closer.create();
     try {
       BufferedReader reader = closer.register(openBufferedStream());
@@ -351,7 +366,8 @@
    */
   @Beta
   @CanIgnoreReturnValue // some processors won't return a useful result
-  public <T> T readLines(LineProcessor<T> processor) throws IOException {
+  @ParametricNullness
+  public <T extends @Nullable Object> T readLines(LineProcessor<T> processor) throws IOException {
     checkNotNull(processor);
 
     Closer closer = Closer.create();
@@ -563,6 +579,7 @@
         Iterator<String> lines = LINE_SPLITTER.split(seq).iterator();
 
         @Override
+        @CheckForNull
         protected String computeNext() {
           if (lines.hasNext()) {
             String next = lines.next();
@@ -582,6 +599,7 @@
     }
 
     @Override
+    @CheckForNull
     public String readFirstLine() {
       Iterator<String> lines = linesIterator();
       return lines.hasNext() ? lines.next() : null;
@@ -593,7 +611,8 @@
     }
 
     @Override
-    public <T> T readLines(LineProcessor<T> processor) throws IOException {
+    @ParametricNullness
+    public <T extends @Nullable Object> T readLines(LineProcessor<T> processor) throws IOException {
       Iterator<String> lines = linesIterator();
       while (lines.hasNext()) {
         if (!processor.processLine(lines.next())) {
diff --git a/guava/src/com/google/common/io/CharStreams.java b/guava/src/com/google/common/io/CharStreams.java
index dd54253..c414194 100644
--- a/guava/src/com/google/common/io/CharStreams.java
+++ b/guava/src/com/google/common/io/CharStreams.java
@@ -28,6 +28,7 @@
 import java.nio.CharBuffer;
 import java.util.ArrayList;
 import java.util.List;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -45,6 +46,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class CharStreams {
 
   // 2K chars (4K bytes)
@@ -77,19 +79,19 @@
       } else {
         return copyReaderToWriter((Reader) from, asWriter(to));
       }
-    } else {
-      checkNotNull(from);
-      checkNotNull(to);
-      long total = 0;
-      CharBuffer buf = createBuffer();
-      while (from.read(buf) != -1) {
-        Java8Compatibility.flip(buf);
-        to.append(buf);
-        total += buf.remaining();
-        Java8Compatibility.clear(buf);
-      }
-      return total;
     }
+
+    checkNotNull(from);
+    checkNotNull(to);
+    long total = 0;
+    CharBuffer buf = createBuffer();
+    while (from.read(buf) != -1) {
+      Java8Compatibility.flip(buf);
+      to.append(buf);
+      total += buf.remaining();
+      Java8Compatibility.clear(buf);
+    }
+    return total;
   }
 
   // TODO(lukes): consider allowing callers to pass in a buffer to use, some callers would be able
@@ -215,7 +217,9 @@
    */
   @Beta
   @CanIgnoreReturnValue // some processors won't return a useful result
-  public static <T> T readLines(Readable readable, LineProcessor<T> processor) throws IOException {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T readLines(
+      Readable readable, LineProcessor<T> processor) throws IOException {
     checkNotNull(readable);
     checkNotNull(processor);
 
@@ -307,12 +311,12 @@
     }
 
     @Override
-    public Writer append(@Nullable CharSequence csq) {
+    public Writer append(@CheckForNull CharSequence csq) {
       return this;
     }
 
     @Override
-    public Writer append(@Nullable CharSequence csq, int start, int end) {
+    public Writer append(@CheckForNull CharSequence csq, int start, int end) {
       checkPositionIndexes(start, end, csq == null ? "null".length() : csq.length());
       return this;
     }
diff --git a/guava/src/com/google/common/io/Closeables.java b/guava/src/com/google/common/io/Closeables.java
index 3adcb19..b45f5f0 100644
--- a/guava/src/com/google/common/io/Closeables.java
+++ b/guava/src/com/google/common/io/Closeables.java
@@ -23,7 +23,7 @@
 import java.io.Reader;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Utility methods for working with {@link Closeable} objects.
@@ -33,6 +33,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Closeables {
   @VisibleForTesting static final Logger logger = Logger.getLogger(Closeables.class.getName());
 
@@ -69,7 +70,7 @@
    * @throws IOException if {@code swallowIOException} is false and {@code close} throws an {@code
    *     IOException}.
    */
-  public static void close(@Nullable Closeable closeable, boolean swallowIOException)
+  public static void close(@CheckForNull Closeable closeable, boolean swallowIOException)
       throws IOException {
     if (closeable == null) {
       return;
@@ -99,7 +100,7 @@
    *     does nothing
    * @since 17.0
    */
-  public static void closeQuietly(@Nullable InputStream inputStream) {
+  public static void closeQuietly(@CheckForNull InputStream inputStream) {
     try {
       close(inputStream, true);
     } catch (IOException impossible) {
@@ -120,7 +121,7 @@
    * @param reader the reader to be closed, or {@code null} in which case this method does nothing
    * @since 17.0
    */
-  public static void closeQuietly(@Nullable Reader reader) {
+  public static void closeQuietly(@CheckForNull Reader reader) {
     try {
       close(reader, true);
     } catch (IOException impossible) {
diff --git a/guava/src/com/google/common/io/Closer.java b/guava/src/com/google/common/io/Closer.java
index 82cfcb4..12998ef 100644
--- a/guava/src/com/google/common/io/Closer.java
+++ b/guava/src/com/google/common/io/Closer.java
@@ -27,6 +27,7 @@
 import java.util.ArrayDeque;
 import java.util.Deque;
 import java.util.logging.Level;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -88,13 +89,16 @@
 // Coffee's for {@link Closer closers} only.
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Closer implements Closeable {
 
   /** The suppressor implementation to use for the current Java version. */
-  private static final Suppressor SUPPRESSOR =
-      SuppressingSuppressor.isAvailable()
-          ? SuppressingSuppressor.INSTANCE
-          : LoggingSuppressor.INSTANCE;
+  private static final Suppressor SUPPRESSOR;
+
+  static {
+    SuppressingSuppressor suppressingSuppressor = SuppressingSuppressor.tryCreate();
+    SUPPRESSOR = suppressingSuppressor == null ? LoggingSuppressor.INSTANCE : suppressingSuppressor;
+  }
 
   /** Creates a new {@link Closer}. */
   public static Closer create() {
@@ -105,7 +109,7 @@
 
   // only need space for 2 elements in most cases, so try to use the smallest array possible
   private final Deque<Closeable> stack = new ArrayDeque<>(4);
-  private @Nullable Throwable thrown;
+  @CheckForNull private Throwable thrown;
 
   @VisibleForTesting
   Closer(Suppressor suppressor) {
@@ -120,7 +124,8 @@
    */
   // close. this word no longer has any meaning to me.
   @CanIgnoreReturnValue
-  public <C extends Closeable> C register(@Nullable C closeable) {
+  @ParametricNullness
+  public <C extends @Nullable Closeable> C register(@ParametricNullness C closeable) {
     if (closeable != null) {
       stack.addFirst(closeable);
     }
@@ -257,21 +262,21 @@
    */
   @VisibleForTesting
   static final class SuppressingSuppressor implements Suppressor {
-
-    static final SuppressingSuppressor INSTANCE = new SuppressingSuppressor();
-
-    static boolean isAvailable() {
-      return addSuppressed != null;
-    }
-
-    static final Method addSuppressed = addSuppressedMethodOrNull();
-
-    private static Method addSuppressedMethodOrNull() {
+    @CheckForNull
+    static SuppressingSuppressor tryCreate() {
+      Method addSuppressed;
       try {
-        return Throwable.class.getMethod("addSuppressed", Throwable.class);
+        addSuppressed = Throwable.class.getMethod("addSuppressed", Throwable.class);
       } catch (Throwable e) {
         return null;
       }
+      return new SuppressingSuppressor(addSuppressed);
+    }
+
+    private final Method addSuppressed;
+
+    private SuppressingSuppressor(Method addSuppressed) {
+      this.addSuppressed = addSuppressed;
     }
 
     @Override
diff --git a/guava/src/com/google/common/io/CountingInputStream.java b/guava/src/com/google/common/io/CountingInputStream.java
index b015aca..a37807a 100644
--- a/guava/src/com/google/common/io/CountingInputStream.java
+++ b/guava/src/com/google/common/io/CountingInputStream.java
@@ -30,6 +30,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class CountingInputStream extends FilterInputStream {
 
   private long count;
diff --git a/guava/src/com/google/common/io/CountingOutputStream.java b/guava/src/com/google/common/io/CountingOutputStream.java
index 8a3d170..cf62b9c 100644
--- a/guava/src/com/google/common/io/CountingOutputStream.java
+++ b/guava/src/com/google/common/io/CountingOutputStream.java
@@ -16,7 +16,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import java.io.FilterOutputStream;
 import java.io.IOException;
@@ -28,8 +27,8 @@
  * @author Chris Nokleberg
  * @since 1.0
  */
-@Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class CountingOutputStream extends FilterOutputStream {
 
   private long count;
diff --git a/guava/src/com/google/common/io/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/io/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..48bc10f
--- /dev/null
+++ b/guava/src/com/google/common/io/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.io;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/io/FileBackedOutputStream.java b/guava/src/com/google/common/io/FileBackedOutputStream.java
index 8d8effc..9912e2f 100644
--- a/guava/src/com/google/common/io/FileBackedOutputStream.java
+++ b/guava/src/com/google/common/io/FileBackedOutputStream.java
@@ -14,6 +14,8 @@
 
 package com.google.common.io;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -26,7 +28,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An {@link OutputStream} that starts buffering to a byte array, but switches to file buffering
@@ -50,20 +52,23 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class FileBackedOutputStream extends OutputStream {
   private final int fileThreshold;
   private final boolean resetOnFinalize;
   private final ByteSource source;
-  @Nullable private final File parentDirectory;
+  @CheckForNull private final File parentDirectory;
 
   @GuardedBy("this")
   private OutputStream out;
 
   @GuardedBy("this")
+  @CheckForNull
   private MemoryOutput memory;
 
   @GuardedBy("this")
-  private @Nullable File file;
+  @CheckForNull
+  private File file;
 
   /** ByteArrayOutputStream that exposes its internals. */
   private static class MemoryOutput extends ByteArrayOutputStream {
@@ -78,6 +83,7 @@
 
   /** Returns the file holding the data (possibly null). */
   @VisibleForTesting
+  @CheckForNull
   synchronized File getFile() {
     return file;
   }
@@ -105,7 +111,7 @@
   }
 
   private FileBackedOutputStream(
-      int fileThreshold, boolean resetOnFinalize, @Nullable File parentDirectory) {
+      int fileThreshold, boolean resetOnFinalize, @CheckForNull File parentDirectory) {
     this.fileThreshold = fileThreshold;
     this.resetOnFinalize = resetOnFinalize;
     this.parentDirectory = parentDirectory;
@@ -153,6 +159,8 @@
     if (file != null) {
       return new FileInputStream(file);
     } else {
+      // requireNonNull is safe because we always have either `file` or `memory`.
+      requireNonNull(memory);
       return new ByteArrayInputStream(memory.getBuffer(), 0, memory.getCount());
     }
   }
@@ -216,19 +224,24 @@
    */
   @GuardedBy("this")
   private void update(int len) throws IOException {
-    if (file == null && (memory.getCount() + len > fileThreshold)) {
+    if (memory != null && (memory.getCount() + len > fileThreshold)) {
       File temp = File.createTempFile("FileBackedOutputStream", null, parentDirectory);
       if (resetOnFinalize) {
         // Finalizers are not guaranteed to be called on system shutdown;
         // this is insurance.
         temp.deleteOnExit();
       }
-      FileOutputStream transfer = new FileOutputStream(temp);
-      transfer.write(memory.getBuffer(), 0, memory.getCount());
-      transfer.flush();
+      try {
+        FileOutputStream transfer = new FileOutputStream(temp);
+        transfer.write(memory.getBuffer(), 0, memory.getCount());
+        transfer.flush();
+        // We've successfully transferred the data; switch to writing to file
+        out = transfer;
+      } catch (IOException e) {
+        temp.delete();
+        throw e;
+      }
 
-      // We've successfully transferred the data; switch to writing to file
-      out = transfer;
       file = temp;
       memory = null;
     }
diff --git a/guava/src/com/google/common/io/FileWriteMode.java b/guava/src/com/google/common/io/FileWriteMode.java
index 2c69a2e..86872d1 100644
--- a/guava/src/com/google/common/io/FileWriteMode.java
+++ b/guava/src/com/google/common/io/FileWriteMode.java
@@ -23,6 +23,7 @@
  * @author Colin Decker
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public enum FileWriteMode {
   /** Specifies that writes to the opened file should append to the end of the file. */
   APPEND
diff --git a/guava/src/com/google/common/io/Files.java b/guava/src/com/google/common/io/Files.java
index 73eb656..bf6289e 100644
--- a/guava/src/com/google/common/io/Files.java
+++ b/guava/src/com/google/common/io/Files.java
@@ -52,6 +52,8 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides utility methods for working with {@linkplain File files}.
@@ -64,6 +66,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Files {
 
   /** Maximum loop count when creating temp directories. */
@@ -529,6 +532,7 @@
    */
   @Beta
   @Deprecated
+  @CheckForNull
   public
   static String readFirstLine(File file, Charset charset) throws IOException {
     return asCharSource(file, charset).readFirstLine();
@@ -588,8 +592,10 @@
   @Beta
   @Deprecated
   @CanIgnoreReturnValue // some processors won't return a useful result
+  @ParametricNullness
   public
-  static <T> T readLines(File file, Charset charset, LineProcessor<T> callback) throws IOException {
+  static <T extends @Nullable Object> T readLines(
+      File file, Charset charset, LineProcessor<T> callback) throws IOException {
     return asCharSource(file, charset).readLines(callback);
   }
 
@@ -608,8 +614,10 @@
   @Beta
   @Deprecated
   @CanIgnoreReturnValue // some processors won't return a useful result
+  @ParametricNullness
   public
-  static <T> T readBytes(File file, ByteProcessor<T> processor) throws IOException {
+  static <T extends @Nullable Object> T readBytes(File file, ByteProcessor<T> processor)
+      throws IOException {
     return asByteSource(file).read(processor);
   }
 
diff --git a/guava/src/com/google/common/io/Flushables.java b/guava/src/com/google/common/io/Flushables.java
index 9b1d6a0..1f795a2 100644
--- a/guava/src/com/google/common/io/Flushables.java
+++ b/guava/src/com/google/common/io/Flushables.java
@@ -29,6 +29,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Flushables {
   private static final Logger logger = Logger.getLogger(Flushables.class.getName());
 
diff --git a/guava/src/com/google/common/io/InsecureRecursiveDeleteException.java b/guava/src/com/google/common/io/InsecureRecursiveDeleteException.java
index 7d07805..4140936 100644
--- a/guava/src/com/google/common/io/InsecureRecursiveDeleteException.java
+++ b/guava/src/com/google/common/io/InsecureRecursiveDeleteException.java
@@ -21,7 +21,7 @@
 import com.google.j2objc.annotations.J2ObjCIncompatible;
 import java.nio.file.FileSystemException;
 import java.nio.file.SecureDirectoryStream;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Exception indicating that a recursive delete can't be performed because the file system does not
@@ -38,9 +38,10 @@
 @Beta
 @GwtIncompatible
 @J2ObjCIncompatible // java.nio.file
+@ElementTypesAreNonnullByDefault
 public final class InsecureRecursiveDeleteException extends FileSystemException {
 
-  public InsecureRecursiveDeleteException(@Nullable String file) {
+  public InsecureRecursiveDeleteException(@CheckForNull String file) {
     super(file, null, "unable to guarantee security of recursive delete");
   }
 }
diff --git a/guava/src/com/google/common/io/Java8Compatibility.java b/guava/src/com/google/common/io/Java8Compatibility.java
index 62b5c2e..705d97b 100644
--- a/guava/src/com/google/common/io/Java8Compatibility.java
+++ b/guava/src/com/google/common/io/Java8Compatibility.java
@@ -22,6 +22,7 @@
  * https://github.com/google/guava/issues/3990
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class Java8Compatibility {
   static void clear(Buffer b) {
     b.clear();
@@ -35,9 +36,17 @@
     b.limit(limit);
   }
 
+  static void mark(Buffer b) {
+    b.mark();
+  }
+
   static void position(Buffer b, int position) {
     b.position(position);
   }
 
+  static void reset(Buffer b) {
+    b.reset();
+  }
+
   private Java8Compatibility() {}
 }
diff --git a/guava/src/com/google/common/io/LineBuffer.java b/guava/src/com/google/common/io/LineBuffer.java
index a8e775c..f944abc 100644
--- a/guava/src/com/google/common/io/LineBuffer.java
+++ b/guava/src/com/google/common/io/LineBuffer.java
@@ -30,6 +30,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class LineBuffer {
   /** Holds partial line contents. */
   private StringBuilder line = new StringBuilder();
diff --git a/guava/src/com/google/common/io/LineProcessor.java b/guava/src/com/google/common/io/LineProcessor.java
index 65ded53..e28bebc 100644
--- a/guava/src/com/google/common/io/LineProcessor.java
+++ b/guava/src/com/google/common/io/LineProcessor.java
@@ -18,6 +18,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.IOException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A callback to be used with the streaming {@code readLines} methods.
@@ -30,7 +31,8 @@
  */
 @Beta
 @GwtIncompatible
-public interface LineProcessor<T> {
+@ElementTypesAreNonnullByDefault
+public interface LineProcessor<T extends @Nullable Object> {
 
   /**
    * This method will be called once for each line.
@@ -42,5 +44,6 @@
   boolean processLine(String line) throws IOException;
 
   /** Return the result of processing all the lines. */
+  @ParametricNullness
   T getResult();
 }
diff --git a/guava/src/com/google/common/io/LineReader.java b/guava/src/com/google/common/io/LineReader.java
index 55b659f2..2c57ac4 100644
--- a/guava/src/com/google/common/io/LineReader.java
+++ b/guava/src/com/google/common/io/LineReader.java
@@ -23,9 +23,9 @@
 import java.io.IOException;
 import java.io.Reader;
 import java.nio.CharBuffer;
-import java.util.LinkedList;
+import java.util.ArrayDeque;
 import java.util.Queue;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A class for reading lines of text. Provides the same functionality as {@link
@@ -37,13 +37,14 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class LineReader {
   private final Readable readable;
-  private final @Nullable Reader reader;
+  @CheckForNull private final Reader reader;
   private final CharBuffer cbuf = createBuffer();
   private final char[] buf = cbuf.array();
 
-  private final Queue<String> lines = new LinkedList<>();
+  private final Queue<String> lines = new ArrayDeque<>();
   private final LineBuffer lineBuf =
       new LineBuffer() {
         @Override
@@ -68,6 +69,7 @@
    * @throws IOException if an I/O error occurs
    */
   @CanIgnoreReturnValue // to skip a line
+  @CheckForNull
   public String readLine() throws IOException {
     while (lines.peek() == null) {
       Java8Compatibility.clear(cbuf);
diff --git a/guava/src/com/google/common/io/LittleEndianDataInputStream.java b/guava/src/com/google/common/io/LittleEndianDataInputStream.java
index 7d9c88b..88c8e27 100644
--- a/guava/src/com/google/common/io/LittleEndianDataInputStream.java
+++ b/guava/src/com/google/common/io/LittleEndianDataInputStream.java
@@ -20,6 +20,7 @@
 import com.google.common.primitives.Ints;
 import com.google.common.primitives.Longs;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import java.io.DataInput;
 import java.io.DataInputStream;
 import java.io.EOFException;
@@ -40,6 +41,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class LittleEndianDataInputStream extends FilterInputStream implements DataInput {
 
   /**
@@ -54,6 +56,7 @@
   /** This method will throw an {@link UnsupportedOperationException}. */
   @CanIgnoreReturnValue // to skip a line
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public String readLine() {
     throw new UnsupportedOperationException("readLine is not supported");
   }
diff --git a/guava/src/com/google/common/io/LittleEndianDataOutputStream.java b/guava/src/com/google/common/io/LittleEndianDataOutputStream.java
index e5e398f..6e51aff 100644
--- a/guava/src/com/google/common/io/LittleEndianDataOutputStream.java
+++ b/guava/src/com/google/common/io/LittleEndianDataOutputStream.java
@@ -37,6 +37,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class LittleEndianDataOutputStream extends FilterOutputStream implements DataOutput {
 
   /**
diff --git a/guava/src/com/google/common/io/MoreFiles.java b/guava/src/com/google/common/io/MoreFiles.java
index 364d5c6..ffe200d 100644
--- a/guava/src/com/google/common/io/MoreFiles.java
+++ b/guava/src/com/google/common/io/MoreFiles.java
@@ -17,7 +17,9 @@
 package com.google.common.io;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterables.getOnlyElement;
 import static java.nio.file.LinkOption.NOFOLLOW_LINKS;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -53,7 +55,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.stream.Stream;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utilities for use with {@link Path} instances, intended to complement {@link Files}.
@@ -68,6 +70,7 @@
 @Beta
 @GwtIncompatible
 @J2ObjCIncompatible // java.nio.file
+@ElementTypesAreNonnullByDefault
 public final class MoreFiles {
 
   private MoreFiles() {}
@@ -532,7 +535,13 @@
         if (parent instanceof SecureDirectoryStream) {
           sdsSupported = true;
           exceptions =
-              deleteRecursivelySecure((SecureDirectoryStream<Path>) parent, path.getFileName());
+              deleteRecursivelySecure(
+                  (SecureDirectoryStream<Path>) parent,
+                  /*
+                   * requireNonNull is safe because paths have file names when they have parents,
+                   * and we checked for a parent at the beginning of the method.
+                   */
+                  requireNonNull(path.getFileName()));
         }
       }
 
@@ -612,7 +621,8 @@
    * Secure recursive delete using {@code SecureDirectoryStream}. Returns a collection of exceptions
    * that occurred or null if no exceptions were thrown.
    */
-  private static @Nullable Collection<IOException> deleteRecursivelySecure(
+  @CheckForNull
+  private static Collection<IOException> deleteRecursivelySecure(
       SecureDirectoryStream<Path> dir, Path path) {
     Collection<IOException> exceptions = null;
     try {
@@ -640,7 +650,8 @@
    * Secure method for deleting the contents of a directory using {@code SecureDirectoryStream}.
    * Returns a collection of exceptions that occurred or null if no exceptions were thrown.
    */
-  private static @Nullable Collection<IOException> deleteDirectoryContentsSecure(
+  @CheckForNull
+  private static Collection<IOException> deleteDirectoryContentsSecure(
       SecureDirectoryStream<Path> dir) {
     Collection<IOException> exceptions = null;
     try {
@@ -658,7 +669,8 @@
    * Insecure recursive delete for file systems that don't support {@code SecureDirectoryStream}.
    * Returns a collection of exceptions that occurred or null if no exceptions were thrown.
    */
-  private static @Nullable Collection<IOException> deleteRecursivelyInsecure(Path path) {
+  @CheckForNull
+  private static Collection<IOException> deleteRecursivelyInsecure(Path path) {
     Collection<IOException> exceptions = null;
     try {
       if (Files.isDirectory(path, NOFOLLOW_LINKS)) {
@@ -684,7 +696,8 @@
    * support {@code SecureDirectoryStream}. Returns a collection of exceptions that occurred or null
    * if no exceptions were thrown.
    */
-  private static @Nullable Collection<IOException> deleteDirectoryContentsInsecure(
+  @CheckForNull
+  private static Collection<IOException> deleteDirectoryContentsInsecure(
       DirectoryStream<Path> dir) {
     Collection<IOException> exceptions = null;
     try {
@@ -703,7 +716,8 @@
    * path, this is simple. Otherwise, we need to do some trickier things. Returns null if the path
    * is a root or is the empty path.
    */
-  private static @Nullable Path getParentPath(Path path) {
+  @CheckForNull
+  private static Path getParentPath(Path path) {
     Path parent = path.getParent();
 
     // Paths that have a parent:
@@ -749,7 +763,7 @@
    * the collection.
    */
   private static Collection<IOException> addException(
-      @Nullable Collection<IOException> exceptions, IOException e) {
+      @CheckForNull Collection<IOException> exceptions, IOException e) {
     if (exceptions == null) {
       exceptions = new ArrayList<>(); // don't need Set semantics
     }
@@ -762,8 +776,10 @@
    * null, the other collection is returned. Otherwise, the elements of {@code other} are added to
    * {@code exceptions} and {@code exceptions} is returned.
    */
-  private static @Nullable Collection<IOException> concat(
-      @Nullable Collection<IOException> exceptions, @Nullable Collection<IOException> other) {
+  @CheckForNull
+  private static Collection<IOException> concat(
+      @CheckForNull Collection<IOException> exceptions,
+      @CheckForNull Collection<IOException> other) {
     if (exceptions == null) {
       return other;
     } else if (other != null) {
@@ -773,11 +789,19 @@
   }
 
   /**
-   * Throws an exception indicating that one or more files couldn't be deleted. The thrown exception
-   * contains all the exceptions in the given collection as suppressed exceptions.
+   * Throws an exception indicating that one or more files couldn't be deleted when deleting {@code
+   * path} or its contents.
+   *
+   * <p>If there is only one exception in the collection, and it is a {@link NoSuchFileException}
+   * thrown because {@code path} itself didn't exist, then throws that exception. Otherwise, the
+   * thrown exception contains all the exceptions in the given collection as suppressed exceptions.
    */
   private static void throwDeleteFailed(Path path, Collection<IOException> exceptions)
       throws FileSystemException {
+    NoSuchFileException pathNotFound = pathNotFound(path, exceptions);
+    if (pathNotFound != null) {
+      throw pathNotFound;
+    }
     // TODO(cgdecker): Should there be a custom exception type for this?
     // Also, should we try to include the Path of each file we may have failed to delete rather
     // than just the exceptions that occurred?
@@ -791,4 +815,53 @@
     }
     throw deleteFailed;
   }
+
+  @CheckForNull
+  private static NoSuchFileException pathNotFound(Path path, Collection<IOException> exceptions) {
+    if (exceptions.size() != 1) {
+      return null;
+    }
+    IOException exception = getOnlyElement(exceptions);
+    if (!(exception instanceof NoSuchFileException)) {
+      return null;
+    }
+    NoSuchFileException noSuchFileException = (NoSuchFileException) exception;
+    String exceptionFile = noSuchFileException.getFile();
+    if (exceptionFile == null) {
+      /*
+       * It's not clear whether this happens in practice, especially with the filesystem
+       * implementations that are built into java.nio.
+       */
+      return null;
+    }
+    Path parentPath = getParentPath(path);
+    if (parentPath == null) {
+      /*
+       * This is probably impossible:
+       *
+       * - In deleteRecursively, we require the path argument to have a parent.
+       *
+       * - In deleteDirectoryContents, the path argument may have no parent. Fortunately, all the
+       *   *other* paths we process will be descendants of that. That leaves only the original path
+       *   argument for us to consider. And the only place we call pathNotFound is from
+       *   throwDeleteFailed, and the other place that we call throwDeleteFailed inside
+       *   deleteDirectoryContents is when an exception is thrown during the recursive steps. Any
+       *   failure during the initial lookup of the path argument itself is rethrown directly. So
+       *   any exception that we're seeing here is from a descendant, which naturally has a parent.
+       *   I think.
+       *
+       * Still, if this can happen somehow (a weird filesystem implementation that lets callers
+       * change its working directly concurrently with a call to deleteDirectoryContents?), it makes
+       * more sense for us to fall back to a generic FileSystemException (by returning null here)
+       * than to dereference parentPath and end up producing NullPointerException.
+       */
+      return null;
+    }
+    // requireNonNull is safe because paths have file names when they have parents.
+    Path pathResolvedFromParent = parentPath.resolve(requireNonNull(path.getFileName()));
+    if (exceptionFile.equals(pathResolvedFromParent.toString())) {
+      return noSuchFileException;
+    }
+    return null;
+  }
 }
diff --git a/guava/src/com/google/common/io/MultiInputStream.java b/guava/src/com/google/common/io/MultiInputStream.java
index 71a97d3..9a7e0fd 100644
--- a/guava/src/com/google/common/io/MultiInputStream.java
+++ b/guava/src/com/google/common/io/MultiInputStream.java
@@ -20,7 +20,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An {@link InputStream} that concatenates multiple substreams. At most one stream will be open at
@@ -30,10 +30,11 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class MultiInputStream extends InputStream {
 
   private Iterator<? extends ByteSource> it;
-  private @Nullable InputStream in;
+  @CheckForNull private InputStream in;
 
   /**
    * Creates a new instance.
@@ -90,7 +91,8 @@
   }
 
   @Override
-  public int read(byte @Nullable [] b, int off, int len) throws IOException {
+  public int read(byte[] b, int off, int len) throws IOException {
+    checkNotNull(b);
     while (in != null) {
       int result = in.read(b, off, len);
       if (result != -1) {
diff --git a/guava/src/com/google/common/io/MultiReader.java b/guava/src/com/google/common/io/MultiReader.java
index 135f32e..cc36e52 100644
--- a/guava/src/com/google/common/io/MultiReader.java
+++ b/guava/src/com/google/common/io/MultiReader.java
@@ -14,12 +14,14 @@
 
 package com.google.common.io;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Preconditions;
 import java.io.IOException;
 import java.io.Reader;
 import java.util.Iterator;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link Reader} that concatenates multiple readers.
@@ -28,9 +30,10 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 class MultiReader extends Reader {
   private final Iterator<? extends CharSource> it;
-  private @Nullable Reader current;
+  @CheckForNull private Reader current;
 
   MultiReader(Iterator<? extends CharSource> readers) throws IOException {
     this.it = readers;
@@ -46,7 +49,8 @@
   }
 
   @Override
-  public int read(char @Nullable [] cbuf, int off, int len) throws IOException {
+  public int read(char[] cbuf, int off, int len) throws IOException {
+    checkNotNull(cbuf);
     if (current == null) {
       return -1;
     }
diff --git a/guava/src/com/google/common/io/ParametricNullness.java b/guava/src/com/google/common/io/ParametricNullness.java
new file mode 100644
index 0000000..afa0db1
--- /dev/null
+++ b/guava/src/com/google/common/io/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.io;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/io/PatternFilenameFilter.java b/guava/src/com/google/common/io/PatternFilenameFilter.java
index 4058e7d..3cb2371 100644
--- a/guava/src/com/google/common/io/PatternFilenameFilter.java
+++ b/guava/src/com/google/common/io/PatternFilenameFilter.java
@@ -21,7 +21,6 @@
 import java.io.FilenameFilter;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
-import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * File name filter that only accepts files matching a regular expression. This class is thread-safe
@@ -32,6 +31,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class PatternFilenameFilter implements FilenameFilter {
 
   private final Pattern pattern;
@@ -55,8 +55,21 @@
     this.pattern = Preconditions.checkNotNull(pattern);
   }
 
+  /*
+   * Our implementation works fine with a null `dir`. However, there's nothing in the documentation
+   * of the supertype that suggests that implementations are expected to tolerate null. That said, I
+   * see calls in Google code that pass a null `dir` to a FilenameFilter.... So let's declare the
+   * parameter as non-nullable (since passing null to a FilenameFilter is unsafe in general), but if
+   * someone still manages to pass null, let's continue to have the method work.
+   *
+   * (PatternFilenameFilter is of course one of those classes that shouldn't be a publicly visible
+   * class to begin with but rather something returned from a static factory method whose declared
+   * return type is plain FilenameFilter. If we made such a change, then the annotation we choose
+   * here would have no significance to end users, who would be forced to conform to the signature
+   * used in FilenameFilter.)
+   */
   @Override
-  public boolean accept(@Nullable File dir, String fileName) {
+  public boolean accept(File dir, String fileName) {
     return pattern.matcher(fileName).matches();
   }
 }
diff --git a/guava/src/com/google/common/io/ReaderInputStream.java b/guava/src/com/google/common/io/ReaderInputStream.java
index eeb64e4..75f8a3e 100644
--- a/guava/src/com/google/common/io/ReaderInputStream.java
+++ b/guava/src/com/google/common/io/ReaderInputStream.java
@@ -44,6 +44,7 @@
  * @author Chris Nokleberg
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class ReaderInputStream extends InputStream {
   private final Reader reader;
   private final CharsetEncoder encoder;
diff --git a/guava/src/com/google/common/io/RecursiveDeleteOption.java b/guava/src/com/google/common/io/RecursiveDeleteOption.java
index 20ec7d2..1bb27a1 100644
--- a/guava/src/com/google/common/io/RecursiveDeleteOption.java
+++ b/guava/src/com/google/common/io/RecursiveDeleteOption.java
@@ -31,6 +31,7 @@
 @Beta
 @GwtIncompatible
 @J2ObjCIncompatible // java.nio.file
+@ElementTypesAreNonnullByDefault
 public enum RecursiveDeleteOption {
   /**
    * Specifies that the recursive delete should not throw an exception when it can't be guaranteed
diff --git a/guava/src/com/google/common/io/Resources.java b/guava/src/com/google/common/io/Resources.java
index d64bf3d..cc595fc 100644
--- a/guava/src/com/google/common/io/Resources.java
+++ b/guava/src/com/google/common/io/Resources.java
@@ -29,6 +29,7 @@
 import java.net.URL;
 import java.nio.charset.Charset;
 import java.util.List;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Provides utility methods for working with resources in the classpath. Note that even though these
@@ -44,6 +45,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Resources {
   private Resources() {}
 
@@ -121,8 +123,9 @@
    * @throws IOException if an I/O error occurs
    */
   @CanIgnoreReturnValue // some processors won't return a useful result
-  public static <T> T readLines(URL url, Charset charset, LineProcessor<T> callback)
-      throws IOException {
+  @ParametricNullness
+  public static <T extends @Nullable Object> T readLines(
+      URL url, Charset charset, LineProcessor<T> callback) throws IOException {
     return asCharSource(url, charset).readLines(callback);
   }
 
diff --git a/guava/src/com/google/common/math/BigDecimalMath.java b/guava/src/com/google/common/math/BigDecimalMath.java
index b5c23f8..33a55d3 100644
--- a/guava/src/com/google/common/math/BigDecimalMath.java
+++ b/guava/src/com/google/common/math/BigDecimalMath.java
@@ -25,6 +25,7 @@
  * @since 30.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public class BigDecimalMath {
   private BigDecimalMath() {}
 
diff --git a/guava/src/com/google/common/math/BigIntegerMath.java b/guava/src/com/google/common/math/BigIntegerMath.java
index bf443e9..6ef1e81 100644
--- a/guava/src/com/google/common/math/BigIntegerMath.java
+++ b/guava/src/com/google/common/math/BigIntegerMath.java
@@ -48,6 +48,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class BigIntegerMath {
   /**
    * Returns the smallest power of two greater than or equal to {@code x}. This is equivalent to
diff --git a/guava/src/com/google/common/math/DoubleMath.java b/guava/src/com/google/common/math/DoubleMath.java
index 8745e41..cdd0a4b 100644
--- a/guava/src/com/google/common/math/DoubleMath.java
+++ b/guava/src/com/google/common/math/DoubleMath.java
@@ -46,6 +46,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class DoubleMath {
   /*
    * This method returns a value y such that rounding y DOWN (towards zero) gives the same result as
@@ -432,7 +433,7 @@
   @Deprecated
   public static double mean(int... values) {
     checkArgument(values.length > 0, "Cannot take mean of 0 values");
-    // The upper bound on the the length of an array and the bounds on the int values mean that, in
+    // The upper bound on the length of an array and the bounds on the int values mean that, in
     // this case only, we can compute the sum as a long without risking overflow or loss of
     // precision. So we do that, as it's slightly quicker than the Knuth algorithm.
     long sum = 0;
diff --git a/guava/src/com/google/common/math/DoubleUtils.java b/guava/src/com/google/common/math/DoubleUtils.java
index 4183195..d4a07e9 100644
--- a/guava/src/com/google/common/math/DoubleUtils.java
+++ b/guava/src/com/google/common/math/DoubleUtils.java
@@ -33,6 +33,7 @@
  * @author Louis Wasserman
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class DoubleUtils {
   private DoubleUtils() {}
 
diff --git a/guava/src/com/google/common/math/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/math/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..84999ea
--- /dev/null
+++ b/guava/src/com/google/common/math/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.math;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/math/IntMath.java b/guava/src/com/google/common/math/IntMath.java
index 78aedda..17a18c6 100644
--- a/guava/src/com/google/common/math/IntMath.java
+++ b/guava/src/com/google/common/math/IntMath.java
@@ -48,6 +48,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class IntMath {
   // NOTE: Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
 
diff --git a/guava/src/com/google/common/math/LinearTransformation.java b/guava/src/com/google/common/math/LinearTransformation.java
index 485b046..4cc1eb8 100644
--- a/guava/src/com/google/common/math/LinearTransformation.java
+++ b/guava/src/com/google/common/math/LinearTransformation.java
@@ -21,6 +21,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.concurrent.LazyInit;
+import javax.annotation.CheckForNull;
 
 /**
  * The representation of a linear transformation between real numbers {@code x} and {@code y}.
@@ -35,6 +36,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class LinearTransformation {
 
   /**
@@ -161,7 +163,7 @@
     final double slope;
     final double yIntercept;
 
-    @LazyInit LinearTransformation inverse;
+    @CheckForNull @LazyInit LinearTransformation inverse;
 
     RegularLinearTransformation(double slope, double yIntercept) {
       this.slope = slope;
@@ -219,7 +221,7 @@
 
     final double x;
 
-    @LazyInit LinearTransformation inverse;
+    @CheckForNull @LazyInit LinearTransformation inverse;
 
     VerticalLinearTransformation(double x) {
       this.x = x;
diff --git a/guava/src/com/google/common/math/LongMath.java b/guava/src/com/google/common/math/LongMath.java
index 420b48a..1e67812 100644
--- a/guava/src/com/google/common/math/LongMath.java
+++ b/guava/src/com/google/common/math/LongMath.java
@@ -49,6 +49,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class LongMath {
   // NOTE: Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
 
diff --git a/guava/src/com/google/common/math/MathPreconditions.java b/guava/src/com/google/common/math/MathPreconditions.java
index ec860d0..37d608a 100644
--- a/guava/src/com/google/common/math/MathPreconditions.java
+++ b/guava/src/com/google/common/math/MathPreconditions.java
@@ -18,7 +18,6 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.math.BigInteger;
 import java.math.RoundingMode;
-import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A collection of preconditions for math functions.
@@ -27,50 +26,51 @@
  */
 @GwtCompatible
 @CanIgnoreReturnValue
+@ElementTypesAreNonnullByDefault
 final class MathPreconditions {
-  static int checkPositive(@Nullable String role, int x) {
+  static int checkPositive(String role, int x) {
     if (x <= 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be > 0");
     }
     return x;
   }
 
-  static long checkPositive(@Nullable String role, long x) {
+  static long checkPositive(String role, long x) {
     if (x <= 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be > 0");
     }
     return x;
   }
 
-  static BigInteger checkPositive(@Nullable String role, BigInteger x) {
+  static BigInteger checkPositive(String role, BigInteger x) {
     if (x.signum() <= 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be > 0");
     }
     return x;
   }
 
-  static int checkNonNegative(@Nullable String role, int x) {
+  static int checkNonNegative(String role, int x) {
     if (x < 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be >= 0");
     }
     return x;
   }
 
-  static long checkNonNegative(@Nullable String role, long x) {
+  static long checkNonNegative(String role, long x) {
     if (x < 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be >= 0");
     }
     return x;
   }
 
-  static BigInteger checkNonNegative(@Nullable String role, BigInteger x) {
+  static BigInteger checkNonNegative(String role, BigInteger x) {
     if (x.signum() < 0) {
       throw new IllegalArgumentException(role + " (" + x + ") must be >= 0");
     }
     return x;
   }
 
-  static double checkNonNegative(@Nullable String role, double x) {
+  static double checkNonNegative(String role, double x) {
     if (!(x >= 0)) { // not x < 0, to work with NaN.
       throw new IllegalArgumentException(role + " (" + x + ") must be >= 0");
     }
diff --git a/guava/src/com/google/common/math/PairedStats.java b/guava/src/com/google/common/math/PairedStats.java
index 6b9c778..31ab9b7 100644
--- a/guava/src/com/google/common/math/PairedStats.java
+++ b/guava/src/com/google/common/math/PairedStats.java
@@ -28,7 +28,7 @@
 import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable value object capturing some basic statistics about a collection of paired double
@@ -39,6 +39,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class PairedStats implements Serializable {
 
   private final Stats xStats;
@@ -213,7 +214,7 @@
    * guarantees {@code strictfp}-like semantics.)
    */
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == null) {
       return false;
     }
diff --git a/guava/src/com/google/common/math/PairedStatsAccumulator.java b/guava/src/com/google/common/math/PairedStatsAccumulator.java
index a988495..072ef13 100644
--- a/guava/src/com/google/common/math/PairedStatsAccumulator.java
+++ b/guava/src/com/google/common/math/PairedStatsAccumulator.java
@@ -32,6 +32,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class PairedStatsAccumulator {
 
   // These fields must satisfy the requirements of PairedStats' constructor as well as those of the
diff --git a/guava/src/com/google/common/math/ParametricNullness.java b/guava/src/com/google/common/math/ParametricNullness.java
new file mode 100644
index 0000000..c079b97
--- /dev/null
+++ b/guava/src/com/google/common/math/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.math;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/math/Quantiles.java b/guava/src/com/google/common/math/Quantiles.java
index 7aac58f..6ddea9b 100644
--- a/guava/src/com/google/common/math/Quantiles.java
+++ b/guava/src/com/google/common/math/Quantiles.java
@@ -128,6 +128,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Quantiles {
 
   /** Specifies the computation of a median (i.e. the 1st 2-quantile). */
diff --git a/guava/src/com/google/common/math/Stats.java b/guava/src/com/google/common/math/Stats.java
index 74537a7..20c9466 100644
--- a/guava/src/com/google/common/math/Stats.java
+++ b/guava/src/com/google/common/math/Stats.java
@@ -36,7 +36,7 @@
 import java.util.stream.DoubleStream;
 import java.util.stream.IntStream;
 import java.util.stream.LongStream;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A bundle of statistical summary values -- sum, count, mean/average, min and max, and several
@@ -64,6 +64,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Stats implements Serializable {
 
   private final long count;
@@ -416,7 +417,7 @@
    * {@code strictfp}-like semantics.)
    */
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == null) {
       return false;
     }
diff --git a/guava/src/com/google/common/math/StatsAccumulator.java b/guava/src/com/google/common/math/StatsAccumulator.java
index 0670cb1..b28229c 100644
--- a/guava/src/com/google/common/math/StatsAccumulator.java
+++ b/guava/src/com/google/common/math/StatsAccumulator.java
@@ -37,6 +37,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class StatsAccumulator {
 
   // These fields must satisfy the requirements of Stats' constructor as well as those of the stat
diff --git a/guava/src/com/google/common/math/ToDoubleRounder.java b/guava/src/com/google/common/math/ToDoubleRounder.java
index 7525e3f..2e7e7fa 100644
--- a/guava/src/com/google/common/math/ToDoubleRounder.java
+++ b/guava/src/com/google/common/math/ToDoubleRounder.java
@@ -25,6 +25,7 @@
  * a {@link RoundingMode}.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class ToDoubleRounder<X extends Number & Comparable<X>> {
   /**
    * Returns x rounded to either the greatest double less than or equal to the precise value of x,
diff --git a/guava/src/com/google/common/net/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/net/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..d8cfd73
--- /dev/null
+++ b/guava/src/com/google/common/net/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.net;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/net/HostAndPort.java b/guava/src/com/google/common/net/HostAndPort.java
index c01b87a..19e6b67 100644
--- a/guava/src/com/google/common/net/HostAndPort.java
+++ b/guava/src/com/google/common/net/HostAndPort.java
@@ -20,11 +20,12 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.base.CharMatcher;
 import com.google.common.base.Objects;
 import com.google.common.base.Strings;
 import com.google.errorprone.annotations.Immutable;
 import java.io.Serializable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable representation of a host and port.
@@ -62,6 +63,7 @@
 @Beta
 @Immutable
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class HostAndPort implements Serializable {
   /** Magic value indicating the absence of a port number. */
   private static final int NO_PORT = -1;
@@ -189,7 +191,10 @@
     if (!Strings.isNullOrEmpty(portString)) {
       // Try to parse the whole port string as a number.
       // JDK7 accepts leading plus signs. We don't want to.
-      checkArgument(!portString.startsWith("+"), "Unparseable port number: %s", hostPortString);
+      checkArgument(
+          !portString.startsWith("+") && CharMatcher.ascii().matchesAllOf(portString),
+          "Unparseable port number: %s",
+          hostPortString);
       try {
         port = Integer.parseInt(portString);
       } catch (NumberFormatException e) {
@@ -209,14 +214,12 @@
    * @throws IllegalArgumentException if parsing the bracketed host-port string fails.
    */
   private static String[] getHostAndPortFromBracketedHost(String hostPortString) {
-    int colonIndex = 0;
-    int closeBracketIndex = 0;
     checkArgument(
         hostPortString.charAt(0) == '[',
         "Bracketed host-port string must start with a bracket: %s",
         hostPortString);
-    colonIndex = hostPortString.indexOf(':');
-    closeBracketIndex = hostPortString.lastIndexOf(']');
+    int colonIndex = hostPortString.indexOf(':');
+    int closeBracketIndex = hostPortString.lastIndexOf(']');
     checkArgument(
         colonIndex > -1 && closeBracketIndex > colonIndex,
         "Invalid bracketed host/port: %s",
@@ -277,7 +280,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object other) {
+  public boolean equals(@CheckForNull Object other) {
     if (this == other) {
       return true;
     }
diff --git a/guava/src/com/google/common/net/HostSpecifier.java b/guava/src/com/google/common/net/HostSpecifier.java
index bb523a0..7448944 100644
--- a/guava/src/com/google/common/net/HostSpecifier.java
+++ b/guava/src/com/google/common/net/HostSpecifier.java
@@ -19,7 +19,7 @@
 import com.google.common.base.Preconditions;
 import java.net.InetAddress;
 import java.text.ParseException;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A syntactically valid host specifier, suitable for use in a URI. This may be either a numeric IP
@@ -43,6 +43,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class HostSpecifier {
 
   private final String canonicalForm;
@@ -137,7 +138,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object other) {
+  public boolean equals(@CheckForNull Object other) {
     if (this == other) {
       return true;
     }
diff --git a/guava/src/com/google/common/net/HttpHeaders.java b/guava/src/com/google/common/net/HttpHeaders.java
index 11a5b50..f318da1 100644
--- a/guava/src/com/google/common/net/HttpHeaders.java
+++ b/guava/src/com/google/common/net/HttpHeaders.java
@@ -28,11 +28,11 @@
  *   <li><a href="http://www.ietf.org/rfc/rfc5988.txt">RFC 5988</a>
  * </ul>
  *
- *
  * @author Kurt Alfred Kluever
  * @since 11.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class HttpHeaders {
   private HttpHeaders() {}
 
@@ -129,6 +129,13 @@
   public static final String MAX_FORWARDS = "Max-Forwards";
   /** The HTTP {@code Origin} header field name. */
   public static final String ORIGIN = "Origin";
+  /**
+   * The HTTP <a href="https://github.com/WICG/origin-isolation">{@code Origin-Isolation}</a> header
+   * field name.
+   *
+   * @since 30.1
+   */
+  public static final String ORIGIN_ISOLATION = "Origin-Isolation";
   /** The HTTP {@code Proxy-Authorization} header field name. */
   public static final String PROXY_AUTHORIZATION = "Proxy-Authorization";
   /** The HTTP {@code Range} header field name. */
@@ -298,6 +305,12 @@
   /** The HTTP {@code Location} header field name. */
   public static final String LOCATION = "Location";
   /**
+   * The HTTP {@code Keep-Alive} header field name.
+   *
+   * @since 31.0
+   */
+  public static final String KEEP_ALIVE = "Keep-Alive";
+  /**
    * The HTTP <a href="https://googlechrome.github.io/OriginTrials/#header">{@code Origin-Trial}</a>
    * header field name.
    *
@@ -375,6 +388,45 @@
   public static final String DNT = "DNT";
   /** The HTTP {@code X-Content-Type-Options} header field name. */
   public static final String X_CONTENT_TYPE_OPTIONS = "X-Content-Type-Options";
+  /**
+   * The HTTP <a
+   * href="https://iabtechlab.com/wp-content/uploads/2019/06/VAST_4.2_final_june26.pdf">{@code
+   * X-Device-IP}</a> header field name. Header used for VAST requests to provide the IP address of
+   * the device on whose behalf the request is being made.
+   *
+   * @since 31.0
+   */
+  public static final String X_DEVICE_IP = "X-Device-IP";
+  /**
+   * The HTTP <a
+   * href="https://iabtechlab.com/wp-content/uploads/2019/06/VAST_4.2_final_june26.pdf">{@code
+   * X-Device-Referer}</a> header field name. Header used for VAST requests to provide the {@link
+   * #REFERER} header value that the on-behalf-of client would have used when making a request
+   * itself.
+   *
+   * @since 31.0
+   */
+  public static final String X_DEVICE_REFERER = "X-Device-Referer";
+  /**
+   * The HTTP <a
+   * href="https://iabtechlab.com/wp-content/uploads/2019/06/VAST_4.2_final_june26.pdf">{@code
+   * X-Device-Accept-Language}</a> header field name. Header used for VAST requests to provide the
+   * {@link #ACCEPT_LANGUAGE} header value that the on-behalf-of client would have used when making
+   * a request itself.
+   *
+   * @since 31.0
+   */
+  public static final String X_DEVICE_ACCEPT_LANGUAGE = "X-Device-Accept-Language";
+  /**
+   * The HTTP <a
+   * href="https://iabtechlab.com/wp-content/uploads/2019/06/VAST_4.2_final_june26.pdf">{@code
+   * X-Device-Requested-With}</a> header field name. Header used for VAST requests to provide the
+   * {@link #X_REQUESTED_WITH} header value that the on-behalf-of client would have used when making
+   * a request itself.
+   *
+   * @since 31.0
+   */
+  public static final String X_DEVICE_REQUESTED_WITH = "X-Device-Requested-With";
   /** The HTTP {@code X-Do-Not-Track} header field name. */
   public static final String X_DO_NOT_TRACK = "X-Do-Not-Track";
   /** The HTTP {@code X-Forwarded-For} header field name (superseded by {@code Forwarded}). */
@@ -411,6 +463,12 @@
    * @since 15.0
    */
   @Beta public static final String PUBLIC_KEY_PINS_REPORT_ONLY = "Public-Key-Pins-Report-Only";
+  /**
+   * The HTTP {@code X-Request-ID} header field name.
+   *
+   * @since 30.1
+   */
+  public static final String X_REQUEST_ID = "X-Request-ID";
   /** The HTTP {@code X-Requested-With} header field name. */
   public static final String X_REQUESTED_WITH = "X-Requested-With";
   /** The HTTP {@code X-User-IP} header field name. */
@@ -475,6 +533,100 @@
   public static final String X_MOZ = "X-Moz";
 
   /**
+   * The HTTP <a
+   * href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Device-Memory">{@code
+   * Device-Memory}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String DEVICE_MEMORY = "Device-Memory";
+
+  /**
+   * The HTTP <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Downlink">{@code
+   * Downlink}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String DOWNLINK = "Downlink";
+
+  /**
+   * The HTTP <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ECT">{@code
+   * ECT}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String ECT = "ECT";
+
+  /**
+   * The HTTP <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/RTT">{@code
+   * RTT}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String RTT = "RTT";
+
+  /**
+   * The HTTP <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Save-Data">{@code
+   * Save-Data}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String SAVE_DATA = "Save-Data";
+
+  /**
+   * The HTTP <a
+   * href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Viewport-Width">{@code
+   * Viewport-Width}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String VIEWPORT_WIDTH = "Viewport-Width";
+
+  /**
+   * The HTTP <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Width">{@code
+   * Width}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String WIDTH = "Width";
+
+  /**
+   * The HTTP <a href="https://www.w3.org/TR/permissions-policy-1/">{@code Permissions-Policy}</a>
+   * header field name.
+   *
+   * @since 31.0
+   */
+  public static final String PERMISSIONS_POLICY = "Permissions-Policy";
+
+  /**
+   * The HTTP <a
+   * href="https://wicg.github.io/user-preference-media-features-headers/#sec-ch-prefers-color-scheme">{@code
+   * Sec-CH-Prefers-Color-Scheme}</a> header field name.
+   *
+   * <p>This header is experimental.
+   *
+   * @since 31.0
+   */
+  public static final String SEC_CH_PREFERS_COLOR_SCHEME = "Sec-CH-Prefers-Color-Scheme";
+
+  /**
+   * The HTTP <a
+   * href="https://www.rfc-editor.org/rfc/rfc8942#name-the-accept-ch-response-head">{@code
+   * Accept-CH}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String ACCEPT_CH = "Accept-CH";
+  /**
+   * The HTTP <a
+   * href="https://datatracker.ietf.org/doc/html/draft-davidben-http-client-hint-reliability-03.txt#section-3">{@code
+   * Critical-CH}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String CRITICAL_CH = "Critical-CH";
+
+  /**
    * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua">{@code Sec-CH-UA}</a>
    * header field name.
    *
@@ -482,47 +634,54 @@
    */
   public static final String SEC_CH_UA = "Sec-CH-UA";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-arch">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-arch">{@code
    * Sec-CH-UA-Arch}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_ARCH = "Sec-CH-UA-Arch";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-model">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-model">{@code
    * Sec-CH-UA-Model}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_MODEL = "Sec-CH-UA-Model";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-platform">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-platform">{@code
    * Sec-CH-UA-Platform}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_PLATFORM = "Sec-CH-UA-Platform";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-platform-version">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-platform-version">{@code
    * Sec-CH-UA-Platform-Version}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_PLATFORM_VERSION = "Sec-CH-UA-Platform-Version";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-full-version">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-full-version">{@code
    * Sec-CH-UA-Full-Version}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_FULL_VERSION = "Sec-CH-UA-Full-Version";
   /**
-   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-mobile">{@code
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-mobile">{@code
    * Sec-CH-UA-Mobile}</a> header field name.
    *
    * @since 30.0
    */
   public static final String SEC_CH_UA_MOBILE = "Sec-CH-UA-Mobile";
+  /**
+   * The HTTP <a href="https://wicg.github.io/ua-client-hints/#sec-ch-ua-bitness">{@code
+   * Sec-CH-UA-Bitness}</a> header field name.
+   *
+   * @since 31.0
+   */
+  public static final String SEC_CH_UA_BITNESS = "Sec-CH-UA-Bitness";
 
   /**
    * The HTTP <a href="https://w3c.github.io/webappsec-fetch-metadata/">{@code Sec-Fetch-Dest}</a>
diff --git a/guava/src/com/google/common/net/InetAddresses.java b/guava/src/com/google/common/net/InetAddresses.java
index d0881e8..4e2aa69 100644
--- a/guava/src/com/google/common/net/InetAddresses.java
+++ b/guava/src/com/google/common/net/InetAddresses.java
@@ -32,7 +32,7 @@
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.Locale;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@link InetAddress} instances.
@@ -97,6 +97,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class InetAddresses {
   private static final int IPV4_PART_COUNT = 4;
   private static final int IPV6_PART_COUNT = 8;
@@ -133,6 +134,11 @@
    *
    * <p>Anything after a {@code %} in an IPv6 address is ignored (assumed to be a Scope ID).
    *
+   * <p>This method accepts non-ASCII digits, for example {@code "192.168.0.1"} (those are fullwidth
+   * characters). That is consistent with {@link InetAddress}, but not with various RFCs. If you
+   * want to accept ASCII digits only, you can use something like {@code
+   * CharMatcher.ascii().matchesAllOf(ipString)}.
+   *
    * @param ipString {@code String} containing an IPv4 or IPv6 string literal, e.g. {@code
    *     "192.168.0.1"} or {@code "2001:db8::1"}
    * @return {@link InetAddress} representing the argument
@@ -153,6 +159,11 @@
    * Returns {@code true} if the supplied string is a valid IP string literal, {@code false}
    * otherwise.
    *
+   * <p>This method accepts non-ASCII digits, for example {@code "192.168.0.1"} (those are fullwidth
+   * characters). That is consistent with {@link InetAddress}, but not with various RFCs. If you
+   * want to accept ASCII digits only, you can use something like {@code
+   * CharMatcher.ascii().matchesAllOf(ipString)}.
+   *
    * @param ipString {@code String} to evaluated as an IP string literal
    * @return {@code true} if the argument is a valid IP string literal
    */
@@ -161,7 +172,9 @@
   }
 
   /** Returns {@code null} if unable to parse into a {@code byte[]}. */
-  private static byte @Nullable [] ipStringToBytes(String ipString) {
+  @CheckForNull
+  private static byte[] ipStringToBytes(String ipStringParam) {
+    String ipString = ipStringParam;
     // Make a first pass to categorize the characters in this string.
     boolean hasColon = false;
     boolean hasDot = false;
@@ -204,7 +217,8 @@
     return null;
   }
 
-  private static byte @Nullable [] textToNumericFormatV4(String ipString) {
+  @CheckForNull
+  private static byte[] textToNumericFormatV4(String ipString) {
     if (IPV4_DELIMITER_MATCHER.countIn(ipString) + 1 != IPV4_PART_COUNT) {
       return null; // Wrong number of parts
     }
@@ -229,7 +243,8 @@
     return bytes;
   }
 
-  private static byte @Nullable [] textToNumericFormatV6(String ipString) {
+  @CheckForNull
+  private static byte[] textToNumericFormatV6(String ipString) {
     // An address can have [2..8] colons.
     int delimiterCount = IPV6_DELIMITER_MATCHER.countIn(ipString);
     if (delimiterCount < 2 || delimiterCount > IPV6_PART_COUNT) {
@@ -299,7 +314,8 @@
     return rawBytes.array();
   }
 
-  private static @Nullable String convertDottedQuadToHex(String ipString) {
+  @CheckForNull
+  private static String convertDottedQuadToHex(String ipString) {
     int lastColon = ipString.lastIndexOf(':');
     String initialPart = ipString.substring(0, lastColon + 1);
     String dottedQuad = ipString.substring(lastColon + 1);
@@ -496,10 +512,15 @@
    * Returns an InetAddress representing the literal IPv4 or IPv6 host portion of a URL, encoded in
    * the format specified by RFC 3986 section 3.2.2.
    *
-   * <p>This function is similar to {@link InetAddresses#forString(String)}, however, it requires
-   * that IPv6 addresses are surrounded by square brackets.
+   * <p>This method is similar to {@link InetAddresses#forString(String)}, however, it requires that
+   * IPv6 addresses are surrounded by square brackets.
    *
-   * <p>This function is the inverse of {@link InetAddresses#toUriString(java.net.InetAddress)}.
+   * <p>This method is the inverse of {@link InetAddresses#toUriString(java.net.InetAddress)}.
+   *
+   * <p>This method accepts non-ASCII digits, for example {@code "192.168.0.1"} (those are fullwidth
+   * characters). That is consistent with {@link InetAddress}, but not with various RFCs. If you
+   * want to accept ASCII digits only, you can use something like {@code
+   * CharMatcher.ascii().matchesAllOf(ipString)}.
    *
    * @param hostAddr A RFC 3986 section 3.2.2 encoded IPv4 or IPv6 address
    * @return an InetAddress representing the address in {@code hostAddr}
@@ -515,7 +536,8 @@
     return addr;
   }
 
-  private static @Nullable InetAddress forUriStringNoThrow(String hostAddr) {
+  @CheckForNull
+  private static InetAddress forUriStringNoThrow(String hostAddr) {
     checkNotNull(hostAddr);
 
     // Decide if this should be an IPv6 or IPv4 address.
@@ -542,6 +564,11 @@
    * Returns {@code true} if the supplied string is a valid URI IP string literal, {@code false}
    * otherwise.
    *
+   * <p>This method accepts non-ASCII digits, for example {@code "192.168.0.1"} (those are fullwidth
+   * characters). That is consistent with {@link InetAddress}, but not with various RFCs. If you
+   * want to accept ASCII digits only, you can use something like {@code
+   * CharMatcher.ascii().matchesAllOf(ipString)}.
+   *
    * @param ipString {@code String} to evaluated as an IP URI host string literal
    * @return {@code true} if the argument is a valid IP URI host
    */
@@ -658,7 +685,7 @@
      */
     // TODO: why is this public?
     public TeredoInfo(
-        @Nullable Inet4Address server, @Nullable Inet4Address client, int port, int flags) {
+        @CheckForNull Inet4Address server, @CheckForNull Inet4Address client, int port, int flags) {
       checkArgument(
           (port >= 0) && (port <= 0xffff), "port '%s' is out of range (0 <= port <= 0xffff)", port);
       checkArgument(
@@ -837,6 +864,10 @@
    * obscure {@link Inet6Address} methods, but it would be unwise to depend on such a
    * poorly-documented feature.)
    *
+   * <p>This method accepts non-ASCII digits. That is consistent with {@link InetAddress}, but not
+   * with various RFCs. If you want to accept ASCII digits only, you can use something like {@code
+   * CharMatcher.ascii().matchesAllOf(ipString)}.
+   *
    * @param ipString {@code String} to be examined for embedded IPv4-mapped IPv6 address format
    * @return {@code true} if the argument is a valid "mapped" address
    * @since 10.0
@@ -864,7 +895,7 @@
    *
    * <p>HACK: As long as applications continue to use IPv4 addresses for indexing into tables,
    * accounting, et cetera, it may be necessary to <b>coerce</b> IPv6 addresses into IPv4 addresses.
-   * This function does so by hashing 64 bits of the IPv6 address into {@code 224.0.0.0/3} (64 bits
+   * This method does so by hashing 64 bits of the IPv6 address into {@code 224.0.0.0/3} (64 bits
    * into 29 bits):
    *
    * <ul>
@@ -874,7 +905,7 @@
    *
    * <p>A "coerced" IPv4 address is equivalent to itself.
    *
-   * <p>NOTE: This function is failsafe for security purposes: ALL IPv6 addresses (except localhost
+   * <p>NOTE: This method is failsafe for security purposes: ALL IPv6 addresses (except localhost
    * (::1)) are hashed to avoid the security risk associated with extracting an embedded IPv4
    * address that might permit elevated privileges.
    *
@@ -912,7 +943,7 @@
     }
 
     // Many strategies for hashing are possible. This might suffice for now.
-    int coercedHash = Hashing.murmur3_32().hashLong(addressAsLong).asInt();
+    int coercedHash = Hashing.murmur3_32_fixed().hashLong(addressAsLong).asInt();
 
     // Squash into 224/4 Multicast and 240/4 Reserved space (i.e. 224/3).
     coercedHash |= 0xe0000000;
@@ -1110,8 +1141,8 @@
    */
   public static boolean isMaximum(InetAddress address) {
     byte[] addr = address.getAddress();
-    for (int i = 0; i < addr.length; i++) {
-      if (addr[i] != (byte) 0xff) {
+    for (byte b : addr) {
+      if (b != (byte) 0xff) {
         return false;
       }
     }
diff --git a/guava/src/com/google/common/net/InternetDomainName.java b/guava/src/com/google/common/net/InternetDomainName.java
index c541413..5873449 100644
--- a/guava/src/com/google/common/net/InternetDomainName.java
+++ b/guava/src/com/google/common/net/InternetDomainName.java
@@ -30,7 +30,7 @@
 import com.google.thirdparty.publicsuffix.PublicSuffixPatterns;
 import com.google.thirdparty.publicsuffix.PublicSuffixType;
 import java.util.List;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable well-formed internet domain name, such as {@code com} or {@code foo.co.uk}. Only
@@ -74,6 +74,7 @@
 @Beta
 @GwtCompatible(emulated = true)
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class InternetDomainName {
 
   private static final CharMatcher DOTS_MATCHER = CharMatcher.anyOf(".\u3002\uFF0E\uFF61");
@@ -200,7 +201,6 @@
    *       href="https://tools.ietf.org/html/rfc1123#section-2">RFC 1123</a>.
    * </ul>
    *
-   *
    * @param domain A domain name (not IP address)
    * @throws IllegalArgumentException if {@code domain} is not syntactically valid according to
    *     {@link #isValid}
@@ -354,6 +354,7 @@
    *
    * @since 6.0
    */
+  @CheckForNull
   public InternetDomainName publicSuffix() {
     return hasPublicSuffix() ? ancestor(publicSuffixIndex) : null;
   }
@@ -462,6 +463,7 @@
    *
    * @since 23.3
    */
+  @CheckForNull
   public InternetDomainName registrySuffix() {
     return hasRegistrySuffix() ? ancestor(registrySuffixIndex) : null;
   }
@@ -622,7 +624,7 @@
    * version of the same domain name would not be considered equal.
    */
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/net/MediaType.java b/guava/src/com/google/common/net/MediaType.java
index f52f24e..ca47161 100644
--- a/guava/src/com/google/common/net/MediaType.java
+++ b/guava/src/com/google/common/net/MediaType.java
@@ -45,7 +45,7 @@
 import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Represents an <a href="http://en.wikipedia.org/wiki/Internet_media_type">Internet Media Type</a>
@@ -75,6 +75,7 @@
 @Beta
 @GwtCompatible
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class MediaType {
   private static final String CHARSET_ATTRIBUTE = "charset";
   private static final ImmutableListMultimap<String, String> UTF_8_CONSTANT_PARAMETERS =
@@ -763,11 +764,11 @@
   private final String subtype;
   private final ImmutableListMultimap<String, String> parameters;
 
-  @LazyInit private String toString;
+  @LazyInit @CheckForNull private String toString;
 
   @LazyInit private int hashCode;
 
-  @LazyInit private Optional<Charset> parsedCharset;
+  @LazyInit @CheckForNull private Optional<Charset> parsedCharset;
 
   private MediaType(String type, String subtype, ImmutableListMultimap<String, String> parameters) {
     this.type = type;
@@ -1135,7 +1136,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj == this) {
       return true;
     } else if (obj instanceof MediaType) {
diff --git a/guava/src/com/google/common/net/ParametricNullness.java b/guava/src/com/google/common/net/ParametricNullness.java
new file mode 100644
index 0000000..acc3eab
--- /dev/null
+++ b/guava/src/com/google/common/net/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.net;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/net/PercentEscaper.java b/guava/src/com/google/common/net/PercentEscaper.java
index 554d04d..7c7de9b 100644
--- a/guava/src/com/google/common/net/PercentEscaper.java
+++ b/guava/src/com/google/common/net/PercentEscaper.java
@@ -19,6 +19,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.escape.UnicodeEscaper;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@code UnicodeEscaper} that escapes some set of Java characters using a UTF-8 based percent
@@ -51,6 +52,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class PercentEscaper extends UnicodeEscaper {
 
   // In some escapers spaces are escaped to '+'
@@ -155,6 +157,7 @@
 
   /** Escapes the given Unicode code point in UTF-8. */
   @Override
+  @CheckForNull
   protected char[] escape(int cp) {
     // We should never get negative values here but if we do it will throw an
     // IndexOutOfBoundsException, so at least it will get spotted.
diff --git a/guava/src/com/google/common/net/UrlEscapers.java b/guava/src/com/google/common/net/UrlEscapers.java
index d4b9f94..c7e15ef 100644
--- a/guava/src/com/google/common/net/UrlEscapers.java
+++ b/guava/src/com/google/common/net/UrlEscapers.java
@@ -24,12 +24,12 @@
  * escaping with {@link com.google.common.html.HtmlEscapers} or {@link
  * com.google.common.xml.XmlEscapers}.
  *
- *
  * @author David Beaumont
  * @author Chris Povirk
  * @since 15.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class UrlEscapers {
   private UrlEscapers() {}
 
diff --git a/guava/src/com/google/common/primitives/Booleans.java b/guava/src/com/google/common/primitives/Booleans.java
index 11ce062..522049b 100644
--- a/guava/src/com/google/common/primitives/Booleans.java
+++ b/guava/src/com/google/common/primitives/Booleans.java
@@ -29,7 +29,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code boolean} primitives, that are not already found in
@@ -42,6 +42,7 @@
  * @since 1.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Booleans {
   private Booleans() {}
 
@@ -408,14 +409,14 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Boolean)
           && Booleans.indexOf(array, (Boolean) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Boolean) {
         int i = Booleans.indexOf(array, (Boolean) target, start, end);
@@ -427,7 +428,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Boolean) {
         int i = Booleans.lastIndexOf(array, (Boolean) target, start, end);
@@ -458,7 +459,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
diff --git a/guava/src/com/google/common/primitives/Bytes.java b/guava/src/com/google/common/primitives/Bytes.java
index dd8aea0..62997f3 100644
--- a/guava/src/com/google/common/primitives/Bytes.java
+++ b/guava/src/com/google/common/primitives/Bytes.java
@@ -27,7 +27,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code byte} primitives, that are not already found in
@@ -44,6 +44,7 @@
 // TODO(kevinb): how to prevent warning on UnsignedBytes when building GWT
 // javadoc?
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Bytes {
   private Bytes() {}
 
@@ -270,13 +271,13 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Byte) && Bytes.indexOf(array, (Byte) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Byte) {
         int i = Bytes.indexOf(array, (Byte) target, start, end);
@@ -288,7 +289,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Byte) {
         int i = Bytes.lastIndexOf(array, (Byte) target, start, end);
@@ -319,7 +320,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
diff --git a/guava/src/com/google/common/primitives/Chars.java b/guava/src/com/google/common/primitives/Chars.java
index 4cdc2ff..4a2e3a3 100644
--- a/guava/src/com/google/common/primitives/Chars.java
+++ b/guava/src/com/google/common/primitives/Chars.java
@@ -30,7 +30,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code char} primitives, that are not already found in
@@ -46,6 +46,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Chars {
   private Chars() {}
 
@@ -540,14 +541,14 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Character)
           && Chars.indexOf(array, (Character) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Character) {
         int i = Chars.indexOf(array, (Character) target, start, end);
@@ -559,7 +560,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Character) {
         int i = Chars.lastIndexOf(array, (Character) target, start, end);
@@ -590,7 +591,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
diff --git a/guava/src/com/google/common/primitives/Doubles.java b/guava/src/com/google/common/primitives/Doubles.java
index 0ef1b74..fab3cf6 100644
--- a/guava/src/com/google/common/primitives/Doubles.java
+++ b/guava/src/com/google/common/primitives/Doubles.java
@@ -36,7 +36,7 @@
 import java.util.RandomAccess;
 import java.util.Spliterator;
 import java.util.Spliterators;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code double} primitives, that are not already found in
@@ -49,6 +49,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Doubles extends DoublesMethodsForWeb {
   private Doubles() {}
 
@@ -560,14 +561,14 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Double)
           && Doubles.indexOf(array, (Double) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Double) {
         int i = Doubles.indexOf(array, (Double) target, start, end);
@@ -579,7 +580,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Double) {
         int i = Doubles.lastIndexOf(array, (Double) target, start, end);
@@ -610,7 +611,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
@@ -709,7 +710,8 @@
    */
   @Beta
   @GwtIncompatible // regular expressions
-  public static @Nullable Double tryParse(String string) {
+  @CheckForNull
+  public static Double tryParse(String string) {
     if (FLOATING_POINT_PATTERN.matcher(string).matches()) {
       // TODO(lowasser): could be potentially optimized, but only with
       // extensive testing
diff --git a/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java b/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java
index 04d9651..949cbe0 100644
--- a/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java
+++ b/guava/src/com/google/common/primitives/DoublesMethodsForWeb.java
@@ -21,4 +21,5 @@
  * version.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class DoublesMethodsForWeb {}
diff --git a/guava/src/com/google/common/primitives/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/primitives/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..44f6869
--- /dev/null
+++ b/guava/src/com/google/common/primitives/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.primitives;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/primitives/Floats.java b/guava/src/com/google/common/primitives/Floats.java
index fd5363b..b038cb2 100644
--- a/guava/src/com/google/common/primitives/Floats.java
+++ b/guava/src/com/google/common/primitives/Floats.java
@@ -34,7 +34,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code float} primitives, that are not already found in
@@ -47,6 +47,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Floats extends FloatsMethodsForWeb {
   private Floats() {}
 
@@ -547,13 +548,13 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Float) && Floats.indexOf(array, (Float) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Float) {
         int i = Floats.indexOf(array, (Float) target, start, end);
@@ -565,7 +566,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Float) {
         int i = Floats.lastIndexOf(array, (Float) target, start, end);
@@ -596,7 +597,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
@@ -661,7 +662,8 @@
    */
   @Beta
   @GwtIncompatible // regular expressions
-  public static @Nullable Float tryParse(String string) {
+  @CheckForNull
+  public static Float tryParse(String string) {
     if (Doubles.FLOATING_POINT_PATTERN.matcher(string).matches()) {
       // TODO(lowasser): could be potentially optimized, but only with
       // extensive testing
diff --git a/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java b/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java
index acdb42f..801e2f3 100644
--- a/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java
+++ b/guava/src/com/google/common/primitives/FloatsMethodsForWeb.java
@@ -21,4 +21,5 @@
  * version.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class FloatsMethodsForWeb {}
diff --git a/guava/src/com/google/common/primitives/ImmutableDoubleArray.java b/guava/src/com/google/common/primitives/ImmutableDoubleArray.java
index 9d0f05c..9731c11 100644
--- a/guava/src/com/google/common/primitives/ImmutableDoubleArray.java
+++ b/guava/src/com/google/common/primitives/ImmutableDoubleArray.java
@@ -33,7 +33,7 @@
 import java.util.Spliterators;
 import java.util.function.DoubleConsumer;
 import java.util.stream.DoubleStream;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable array of {@code double} values, with an API resembling {@link List}.
@@ -88,6 +88,7 @@
 @Beta
 @GwtCompatible
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class ImmutableDoubleArray implements Serializable {
   private static final ImmutableDoubleArray EMPTY = new ImmutableDoubleArray(new double[0]);
 
@@ -483,17 +484,17 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       return indexOf(target) >= 0;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       return target instanceof Double ? parent.indexOf((Double) target) : -1;
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       return target instanceof Double ? parent.lastIndexOf((Double) target) : -1;
     }
 
@@ -509,7 +510,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof AsList) {
         AsList that = (AsList) object;
         return this.parent.equals(that.parent);
@@ -549,7 +550,7 @@
    * values as this one, in the same order. Values are compared as if by {@link Double#equals}.
    */
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/primitives/ImmutableIntArray.java b/guava/src/com/google/common/primitives/ImmutableIntArray.java
index 643e609..cc3c671 100644
--- a/guava/src/com/google/common/primitives/ImmutableIntArray.java
+++ b/guava/src/com/google/common/primitives/ImmutableIntArray.java
@@ -33,7 +33,7 @@
 import java.util.Spliterators;
 import java.util.function.IntConsumer;
 import java.util.stream.IntStream;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable array of {@code int} values, with an API resembling {@link List}.
@@ -88,6 +88,7 @@
 @Beta
 @GwtCompatible
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class ImmutableIntArray implements Serializable {
   private static final ImmutableIntArray EMPTY = new ImmutableIntArray(new int[0]);
 
@@ -478,17 +479,17 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       return indexOf(target) >= 0;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       return target instanceof Integer ? parent.indexOf((Integer) target) : -1;
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       return target instanceof Integer ? parent.lastIndexOf((Integer) target) : -1;
     }
 
@@ -504,7 +505,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof AsList) {
         AsList that = (AsList) object;
         return this.parent.equals(that.parent);
@@ -544,7 +545,7 @@
    * values as this one, in the same order.
    */
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/primitives/ImmutableLongArray.java b/guava/src/com/google/common/primitives/ImmutableLongArray.java
index dde8f80..c8f7037 100644
--- a/guava/src/com/google/common/primitives/ImmutableLongArray.java
+++ b/guava/src/com/google/common/primitives/ImmutableLongArray.java
@@ -33,7 +33,7 @@
 import java.util.Spliterators;
 import java.util.function.LongConsumer;
 import java.util.stream.LongStream;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An immutable array of {@code long} values, with an API resembling {@link List}.
@@ -88,6 +88,7 @@
 @Beta
 @GwtCompatible
 @Immutable
+@ElementTypesAreNonnullByDefault
 public final class ImmutableLongArray implements Serializable {
   private static final ImmutableLongArray EMPTY = new ImmutableLongArray(new long[0]);
 
@@ -480,17 +481,17 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       return indexOf(target) >= 0;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       return target instanceof Long ? parent.indexOf((Long) target) : -1;
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       return target instanceof Long ? parent.lastIndexOf((Long) target) : -1;
     }
 
@@ -506,7 +507,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object instanceof AsList) {
         AsList that = (AsList) object;
         return this.parent.equals(that.parent);
@@ -546,7 +547,7 @@
    * values as this one, in the same order.
    */
   @Override
-  public boolean equals(@Nullable Object object) {
+  public boolean equals(@CheckForNull Object object) {
     if (object == this) {
       return true;
     }
diff --git a/guava/src/com/google/common/primitives/Ints.java b/guava/src/com/google/common/primitives/Ints.java
index ad8c8c1..b63b0f9 100644
--- a/guava/src/com/google/common/primitives/Ints.java
+++ b/guava/src/com/google/common/primitives/Ints.java
@@ -33,7 +33,7 @@
 import java.util.RandomAccess;
 import java.util.Spliterator;
 import java.util.Spliterators;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code int} primitives, that are not already found in either
@@ -46,6 +46,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Ints extends IntsMethodsForWeb {
   private Ints() {}
 
@@ -600,13 +601,13 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Integer) && Ints.indexOf(array, (Integer) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Integer) {
         int i = Ints.indexOf(array, (Integer) target, start, end);
@@ -618,7 +619,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Integer) {
         int i = Ints.lastIndexOf(array, (Integer) target, start, end);
@@ -649,7 +650,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
@@ -713,7 +714,8 @@
    * @since 11.0
    */
   @Beta
-  public static @Nullable Integer tryParse(String string) {
+  @CheckForNull
+  public static Integer tryParse(String string) {
     return tryParse(string, 10);
   }
 
@@ -738,7 +740,8 @@
    * @since 19.0
    */
   @Beta
-  public static @Nullable Integer tryParse(String string, int radix) {
+  @CheckForNull
+  public static Integer tryParse(String string, int radix) {
     Long result = Longs.tryParse(string, radix);
     if (result == null || result.longValue() != result.intValue()) {
       return null;
diff --git a/guava/src/com/google/common/primitives/IntsMethodsForWeb.java b/guava/src/com/google/common/primitives/IntsMethodsForWeb.java
index cb87bd2..c59c6b0 100644
--- a/guava/src/com/google/common/primitives/IntsMethodsForWeb.java
+++ b/guava/src/com/google/common/primitives/IntsMethodsForWeb.java
@@ -21,4 +21,5 @@
  * version.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class IntsMethodsForWeb {}
diff --git a/guava/src/com/google/common/primitives/Longs.java b/guava/src/com/google/common/primitives/Longs.java
index e496f00..98c055e 100644
--- a/guava/src/com/google/common/primitives/Longs.java
+++ b/guava/src/com/google/common/primitives/Longs.java
@@ -32,7 +32,7 @@
 import java.util.RandomAccess;
 import java.util.Spliterator;
 import java.util.Spliterators;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code long} primitives, that are not already found in
@@ -45,6 +45,7 @@
  * @since 1.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Longs {
   private Longs() {}
 
@@ -363,7 +364,8 @@
    * @since 14.0
    */
   @Beta
-  public static @Nullable Long tryParse(String string) {
+  @CheckForNull
+  public static Long tryParse(String string) {
     return tryParse(string, 10);
   }
 
@@ -388,7 +390,8 @@
    * @since 19.0
    */
   @Beta
-  public static @Nullable Long tryParse(String string, int radix) {
+  @CheckForNull
+  public static Long tryParse(String string, int radix) {
     if (checkNotNull(string).isEmpty()) {
       return null;
     }
@@ -694,13 +697,13 @@
     }
 
     @Override
-    public boolean contains(Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Long) && Longs.indexOf(array, (Long) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Long) {
         int i = Longs.indexOf(array, (Long) target, start, end);
@@ -712,7 +715,7 @@
     }
 
     @Override
-    public int lastIndexOf(Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Long) {
         int i = Longs.lastIndexOf(array, (Long) target, start, end);
@@ -743,7 +746,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
diff --git a/guava/src/com/google/common/primitives/ParametricNullness.java b/guava/src/com/google/common/primitives/ParametricNullness.java
new file mode 100644
index 0000000..17d606c
--- /dev/null
+++ b/guava/src/com/google/common/primitives/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.primitives;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/primitives/ParseRequest.java b/guava/src/com/google/common/primitives/ParseRequest.java
index 97b0f1b..a102d69 100644
--- a/guava/src/com/google/common/primitives/ParseRequest.java
+++ b/guava/src/com/google/common/primitives/ParseRequest.java
@@ -18,6 +18,7 @@
 
 /** A string to be parsed as a number and the radix to interpret it in. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class ParseRequest {
   final String rawValue;
   final int radix;
diff --git a/guava/src/com/google/common/primitives/Platform.java b/guava/src/com/google/common/primitives/Platform.java
index 1273c04..ca31689 100644
--- a/guava/src/com/google/common/primitives/Platform.java
+++ b/guava/src/com/google/common/primitives/Platform.java
@@ -18,6 +18,7 @@
 
 /** Methods factored out so that they can be emulated differently in GWT. */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class Platform {
   private static final java.util.logging.Logger logger =
       java.util.logging.Logger.getLogger(Platform.class.getName());
@@ -41,7 +42,6 @@
             + " warning because you are sending a Guava type over GWT-RPC, which will break. You"
             + " can identify which type by looking at the class name in the attached stack trace.",
         new Throwable());
-
   }
 
   private Platform() {}
diff --git a/guava/src/com/google/common/primitives/Primitives.java b/guava/src/com/google/common/primitives/Primitives.java
index 1bdc740..7ceed03 100644
--- a/guava/src/com/google/common/primitives/Primitives.java
+++ b/guava/src/com/google/common/primitives/Primitives.java
@@ -30,6 +30,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Primitives {
   private Primitives() {}
 
diff --git a/guava/src/com/google/common/primitives/Shorts.java b/guava/src/com/google/common/primitives/Shorts.java
index fa480dd..09e0f7c 100644
--- a/guava/src/com/google/common/primitives/Shorts.java
+++ b/guava/src/com/google/common/primitives/Shorts.java
@@ -31,7 +31,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.RandomAccess;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Static utility methods pertaining to {@code short} primitives, that are not already found in
@@ -44,6 +44,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Shorts extends ShortsMethodsForWeb {
   private Shorts() {}
 
@@ -592,13 +593,13 @@
     }
 
     @Override
-    public boolean contains(@Nullable Object target) {
+    public boolean contains(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       return (target instanceof Short) && Shorts.indexOf(array, (Short) target, start, end) != -1;
     }
 
     @Override
-    public int indexOf(@Nullable Object target) {
+    public int indexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Short) {
         int i = Shorts.indexOf(array, (Short) target, start, end);
@@ -610,7 +611,7 @@
     }
 
     @Override
-    public int lastIndexOf(@Nullable Object target) {
+    public int lastIndexOf(@CheckForNull Object target) {
       // Overridden to prevent a ton of boxing
       if (target instanceof Short) {
         int i = Shorts.lastIndexOf(array, (Short) target, start, end);
@@ -641,7 +642,7 @@
     }
 
     @Override
-    public boolean equals(@Nullable Object object) {
+    public boolean equals(@CheckForNull Object object) {
       if (object == this) {
         return true;
       }
diff --git a/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java b/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java
index c362768..bb0ff10 100644
--- a/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java
+++ b/guava/src/com/google/common/primitives/ShortsMethodsForWeb.java
@@ -21,4 +21,5 @@
  * version.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class ShortsMethodsForWeb {}
diff --git a/guava/src/com/google/common/primitives/SignedBytes.java b/guava/src/com/google/common/primitives/SignedBytes.java
index e475c41..5fabaab 100644
--- a/guava/src/com/google/common/primitives/SignedBytes.java
+++ b/guava/src/com/google/common/primitives/SignedBytes.java
@@ -36,6 +36,7 @@
 // TODO(kevinb): how to prevent warning on UnsignedBytes when building GWT
 // javadoc?
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class SignedBytes {
   private SignedBytes() {}
 
diff --git a/guava/src/com/google/common/primitives/UnsignedBytes.java b/guava/src/com/google/common/primitives/UnsignedBytes.java
index 4275f8a..bf9a306 100644
--- a/guava/src/com/google/common/primitives/UnsignedBytes.java
+++ b/guava/src/com/google/common/primitives/UnsignedBytes.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkPositionIndexes;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -43,6 +44,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class UnsignedBytes {
   private UnsignedBytes() {}
 
@@ -437,9 +439,12 @@
       try {
         Class<?> theClass = Class.forName(UNSAFE_COMPARATOR_NAME);
 
+        // requireNonNull is safe because the class is an enum.
+        Object[] constants = requireNonNull(theClass.getEnumConstants());
+
         // yes, UnsafeComparator does implement Comparator<byte[]>
         @SuppressWarnings("unchecked")
-        Comparator<byte[]> comparator = (Comparator<byte[]>) theClass.getEnumConstants()[0];
+        Comparator<byte[]> comparator = (Comparator<byte[]>) constants[0];
         return comparator;
       } catch (Throwable t) { // ensure we really catch *everything*
         return lexicographicalComparatorJavaImpl();
diff --git a/guava/src/com/google/common/primitives/UnsignedInteger.java b/guava/src/com/google/common/primitives/UnsignedInteger.java
index 1796ac1..0b30cef 100644
--- a/guava/src/com/google/common/primitives/UnsignedInteger.java
+++ b/guava/src/com/google/common/primitives/UnsignedInteger.java
@@ -23,7 +23,7 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.annotations.GwtIncompatible;
 import java.math.BigInteger;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A wrapper class for unsigned {@code int} values, supporting arithmetic operations.
@@ -39,6 +39,7 @@
  * @since 11.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class UnsignedInteger extends Number implements Comparable<UnsignedInteger> {
   public static final UnsignedInteger ZERO = fromIntBits(0);
   public static final UnsignedInteger ONE = fromIntBits(1);
@@ -226,7 +227,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj instanceof UnsignedInteger) {
       UnsignedInteger other = (UnsignedInteger) obj;
       return value == other.value;
diff --git a/guava/src/com/google/common/primitives/UnsignedInts.java b/guava/src/com/google/common/primitives/UnsignedInts.java
index 9eda969..ec6474e 100644
--- a/guava/src/com/google/common/primitives/UnsignedInts.java
+++ b/guava/src/com/google/common/primitives/UnsignedInts.java
@@ -47,6 +47,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class UnsignedInts {
   static final long INT_MASK = 0xffffffffL;
 
diff --git a/guava/src/com/google/common/primitives/UnsignedLong.java b/guava/src/com/google/common/primitives/UnsignedLong.java
index 07f785b..d803634 100644
--- a/guava/src/com/google/common/primitives/UnsignedLong.java
+++ b/guava/src/com/google/common/primitives/UnsignedLong.java
@@ -21,7 +21,7 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.io.Serializable;
 import java.math.BigInteger;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A wrapper class for unsigned {@code long} values, supporting arithmetic operations.
@@ -38,6 +38,7 @@
  * @since 11.0
  */
 @GwtCompatible(serializable = true)
+@ElementTypesAreNonnullByDefault
 public final class UnsignedLong extends Number implements Comparable<UnsignedLong>, Serializable {
 
   private static final long UNSIGNED_MASK = 0x7fffffffffffffffL;
@@ -195,12 +196,12 @@
    */
   @Override
   public float floatValue() {
-    @SuppressWarnings("cast")
-    float fValue = (float) (value & UNSIGNED_MASK);
-    if (value < 0) {
-      fValue += 0x1.0p63f;
+    if (value >= 0) {
+      return (float) value;
     }
-    return fValue;
+    // The top bit is set, which means that the float value is going to come from the top 24 bits.
+    // So we can ignore the bottom 8, except for rounding. See doubleValue() for more.
+    return (float) ((value >>> 1) | (value & 1)) * 2f;
   }
 
   /**
@@ -209,12 +210,15 @@
    */
   @Override
   public double doubleValue() {
-    @SuppressWarnings("cast")
-    double dValue = (double) (value & UNSIGNED_MASK);
-    if (value < 0) {
-      dValue += 0x1.0p63;
+    if (value >= 0) {
+      return (double) value;
     }
-    return dValue;
+    // The top bit is set, which means that the double value is going to come from the top 53 bits.
+    // So we can ignore the bottom 11, except for rounding. We can unsigned-shift right 1, aka
+    // unsigned-divide by 2, and convert that. Then we'll get exactly half of the desired double
+    // value. But in the specific case where the bottom two bits of the original number are 01, we
+    // want to replace that with 1 in the shifted value for correct rounding.
+    return (double) ((value >>> 1) | (value & 1)) * 2.0;
   }
 
   /** Returns the value of this {@code UnsignedLong} as a {@link BigInteger}. */
@@ -238,7 +242,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj instanceof UnsignedLong) {
       UnsignedLong other = (UnsignedLong) obj;
       return value == other.value;
diff --git a/guava/src/com/google/common/primitives/UnsignedLongs.java b/guava/src/com/google/common/primitives/UnsignedLongs.java
index a1fccc2..31c51cc 100644
--- a/guava/src/com/google/common/primitives/UnsignedLongs.java
+++ b/guava/src/com/google/common/primitives/UnsignedLongs.java
@@ -50,6 +50,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class UnsignedLongs {
   private UnsignedLongs() {}
 
diff --git a/guava/src/com/google/common/reflect/AbstractInvocationHandler.java b/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
index 45aea77..4666f99 100644
--- a/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
+++ b/guava/src/com/google/common/reflect/AbstractInvocationHandler.java
@@ -19,6 +19,7 @@
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.Arrays;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -39,6 +40,7 @@
  * @since 12.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractInvocationHandler implements InvocationHandler {
 
   private static final Object[] NO_ARGS = {};
@@ -59,7 +61,8 @@
    * </ul>
    */
   @Override
-  public final Object invoke(Object proxy, Method method, Object @Nullable [] args)
+  @CheckForNull
+  public final Object invoke(Object proxy, Method method, @CheckForNull @Nullable Object[] args)
       throws Throwable {
     if (args == null) {
       args = NO_ARGS;
@@ -94,7 +97,8 @@
    * <p>Unlike {@link #invoke}, {@code args} will never be null. When the method has no parameter,
    * an empty array is passed in.
    */
-  protected abstract Object handleInvocation(Object proxy, Method method, Object[] args)
+  @CheckForNull
+  protected abstract Object handleInvocation(Object proxy, Method method, @Nullable Object[] args)
       throws Throwable;
 
   /**
@@ -109,7 +113,7 @@
    * <p>Subclasses can override this method to provide custom equality.
    */
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     return super.equals(obj);
   }
 
diff --git a/guava/src/com/google/common/reflect/ClassPath.java b/guava/src/com/google/common/reflect/ClassPath.java
index c4f9d0f..de693da 100644
--- a/guava/src/com/google/common/reflect/ClassPath.java
+++ b/guava/src/com/google/common/reflect/ClassPath.java
@@ -30,9 +30,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
-import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.SetMultimap;
-import com.google.common.collect.Sets;
 import com.google.common.io.ByteSource;
 import com.google.common.io.CharSource;
 import com.google.common.io.Resources;
@@ -54,19 +51,40 @@
 import java.util.jar.JarFile;
 import java.util.jar.Manifest;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Scans the source of a {@link ClassLoader} and finds all loadable classes and resources.
  *
- * <p><b>Warning:</b> Current limitations:
+ * <h2>Prefer <a href="https://github.com/classgraph/classgraph/wiki">ClassGraph</a> over {@code
+ * ClassPath}</h2>
+ *
+ * <p>We recommend using <a href="https://github.com/classgraph/classgraph/wiki">ClassGraph</a>
+ * instead of {@code ClassPath}. ClassGraph improves upon {@code ClassPath} in several ways,
+ * including addressing many of its limitations. Limitations of {@code ClassPath} include:
  *
  * <ul>
- *   <li>Looks only for files and JARs in URLs available from {@link URLClassLoader} instances or
- *       the {@linkplain ClassLoader#getSystemClassLoader() system class loader}.
- *   <li>Only understands {@code file:} URLs.
+ *   <li>It looks only for files and JARs in URLs available from {@link URLClassLoader} instances or
+ *       the {@linkplain ClassLoader#getSystemClassLoader() system class loader}. This means it does
+ *       not look for classes in the <i>module path</i>.
+ *   <li>It understands only {@code file:} URLs. This means that it does not understand <a
+ *       href="https://openjdk.java.net/jeps/220">{@code jrt:/} URLs</a>, among <a
+ *       href="https://github.com/classgraph/classgraph/wiki/Classpath-specification-mechanisms">others</a>.
+ *   <li>It does not know how to look for classes when running under an Android VM. (ClassGraph does
+ *       not support this directly, either, but ClassGraph documents how to <a
+ *       href="https://github.com/classgraph/classgraph/wiki/Build-Time-Scanning">perform build-time
+ *       classpath scanning and make the results available to an Android app</a>.)
+ *   <li>Like all of Guava, it is not tested under Windows. We have gotten <a
+ *       href="https://github.com/google/guava/issues/2130">a report of a specific bug under
+ *       Windows</a>.
+ *   <li>It <a href="https://github.com/google/guava/issues/2712">returns only one resource for a
+ *       given path</a>, even if resources with that path appear in multiple jars or directories.
+ *   <li>It assumes that <a href="https://github.com/google/guava/issues/3349">any class with a
+ *       {@code $} in its name is a nested class</a>.
  * </ul>
  *
+ * <h2>{@code ClassPath} and symlinks</h2>
+ *
  * <p>In the case of directory classloaders, symlinks are supported but cycles are not traversed.
  * This guarantees discovery of each <em>unique</em> loadable resource. However, not all possible
  * aliases for resources on cyclic paths will be listed.
@@ -75,17 +93,10 @@
  * @since 14.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class ClassPath {
   private static final Logger logger = Logger.getLogger(ClassPath.class.getName());
 
-  private static final Predicate<ClassInfo> IS_TOP_LEVEL =
-      new Predicate<ClassInfo>() {
-        @Override
-        public boolean apply(ClassInfo info) {
-          return info.className.indexOf('$') == -1;
-        }
-      };
-
   /** Separator for the Class-Path manifest attribute value in jar files. */
   private static final Splitter CLASS_PATH_ATTRIBUTE_SEPARATOR =
       Splitter.on(" ").omitEmptyStrings();
@@ -115,9 +126,21 @@
    *     failed.
    */
   public static ClassPath from(ClassLoader classloader) throws IOException {
-    DefaultScanner scanner = new DefaultScanner();
-    scanner.scan(classloader);
-    return new ClassPath(scanner.getResources());
+    ImmutableSet<LocationInfo> locations = locationsFrom(classloader);
+
+    // Add all locations to the scanned set so that in a classpath [jar1, jar2], where jar1 has a
+    // manifest with Class-Path pointing to jar2, we won't scan jar2 twice.
+    Set<File> scanned = new HashSet<>();
+    for (LocationInfo location : locations) {
+      scanned.add(location.file());
+    }
+
+    // Scan all locations
+    ImmutableSet.Builder<ResourceInfo> builder = ImmutableSet.builder();
+    for (LocationInfo location : locations) {
+      builder.addAll(location.scanResources(scanned));
+    }
+    return new ClassPath(builder.build());
   }
 
   /**
@@ -137,9 +160,21 @@
     return FluentIterable.from(resources).filter(ClassInfo.class).toSet();
   }
 
-  /** Returns all top level classes loadable from the current class path. */
+  /**
+   * Returns all top level classes loadable from the current class path. Note that "top-level-ness"
+   * is determined heuristically by class name (see {@link ClassInfo#isTopLevel}).
+   */
   public ImmutableSet<ClassInfo> getTopLevelClasses() {
-    return FluentIterable.from(resources).filter(ClassInfo.class).filter(IS_TOP_LEVEL).toSet();
+    return FluentIterable.from(resources)
+        .filter(ClassInfo.class)
+        .filter(
+            new Predicate<ClassInfo>() {
+              @Override
+              public boolean apply(ClassInfo info) {
+                return info.isTopLevel();
+              }
+            })
+        .toSet();
   }
 
   /** Returns all top level classes whose package name is {@code packageName}. */
@@ -252,7 +287,7 @@
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof ResourceInfo) {
         ResourceInfo that = (ResourceInfo) obj;
         return resourceName.equals(that.resourceName) && loader == that.loader;
@@ -284,8 +319,13 @@
     /**
      * Returns the package name of the class, without attempting to load the class.
      *
-     * <p>Behaves identically to {@link Package#getName()} but does not require the class (or
-     * package) to be loaded.
+     * <p>Behaves similarly to {@code class.getPackage().}{@link Package#getName() getName()} but
+     * does not require the class (or package) to be loaded.
+     *
+     * <p>But note that this method may behave differently for a class in the default package: For
+     * such classes, this method always returns an empty string. But under some version of Java,
+     * {@code class.getPackage().getName()} produces a {@code NullPointerException} because {@code
+     * class.getPackage()} returns {@code null}.
      */
     public String getPackageName() {
       return Reflection.getPackageName(className);
@@ -294,8 +334,11 @@
     /**
      * Returns the simple name of the underlying class as given in the source code.
      *
-     * <p>Behaves identically to {@link Class#getSimpleName()} but does not require the class to be
+     * <p>Behaves similarly to {@link Class#getSimpleName()} but does not require the class to be
      * loaded.
+     *
+     * <p>But note that this class uses heuristics to identify the simple name. See a related
+     * discussion in <a href="https://github.com/google/guava/issues/3349">issue 3349</a>.
      */
     public String getSimpleName() {
       int lastDollarSign = className.lastIndexOf('$');
@@ -325,6 +368,18 @@
     }
 
     /**
+     * Returns true if the class name "looks to be" top level (not nested), that is, it includes no
+     * '$' in the name. This method may return false for a top-level class that's intentionally
+     * named with the '$' character. If this is a concern, you could use {@link #load} and then
+     * check on the loaded {@link Class} object instead.
+     *
+     * @since 30.1
+     */
+    public boolean isTopLevel() {
+      return className.indexOf('$') == -1;
+    }
+
+    /**
      * Loads (but doesn't link or initialize) the class.
      *
      * @throws LinkageError when there were errors in loading classes that this class depends on.
@@ -346,36 +401,64 @@
   }
 
   /**
-   * Abstract class that scans through the class path represented by a {@link ClassLoader} and calls
-   * {@link #scanDirectory} and {@link #scanJarFile} for directories and jar files on the class path
-   * respectively.
+   * Returns all locations that {@code classloader} and parent loaders load classes and resources
+   * from. Callers can {@linkplain LocationInfo#scanResources scan} individual locations selectively
+   * or even in parallel.
    */
-  abstract static class Scanner {
+  static ImmutableSet<LocationInfo> locationsFrom(ClassLoader classloader) {
+    ImmutableSet.Builder<LocationInfo> builder = ImmutableSet.builder();
+    for (Map.Entry<File, ClassLoader> entry : getClassPathEntries(classloader).entrySet()) {
+      builder.add(new LocationInfo(entry.getKey(), entry.getValue()));
+    }
+    return builder.build();
+  }
 
-    // We only scan each file once independent of the classloader that resource might be associated
-    // with. Use concurrent set so that subclasses can be thread-safe.
-    private final Set<File> scannedUris = Sets.newConcurrentHashSet();
+  /**
+   * Represents a single location (a directory or a jar file) in the class path and is responsible
+   * for scanning resources from this location.
+   */
+  static final class LocationInfo {
+    final File home;
+    private final ClassLoader classloader;
 
-    public final void scan(ClassLoader classloader) throws IOException {
-      for (Map.Entry<File, ClassLoader> entry : getClassPathEntries(classloader).entrySet()) {
-        scan(entry.getKey(), entry.getValue());
-      }
+    LocationInfo(File home, ClassLoader classloader) {
+      this.home = checkNotNull(home);
+      this.classloader = checkNotNull(classloader);
     }
 
-    @VisibleForTesting
-    final void scan(File file, ClassLoader classloader) throws IOException {
-      if (scannedUris.add(file.getCanonicalFile())) {
-        scanFrom(file, classloader);
-      }
+    /** Returns the file this location is from. */
+    public final File file() {
+      return home;
+    }
+
+    /** Scans this location and returns all scanned resources. */
+    public ImmutableSet<ResourceInfo> scanResources() throws IOException {
+      return scanResources(new HashSet<File>());
     }
 
     /**
-     * Called each time a resource (uniqueness not guaranteed if the class path includes redundant
-     * entries)
+     * Scans this location and returns all scanned resources.
+     *
+     * <p>This file and jar files from "Class-Path" entry in the scanned manifest files will be
+     * added to {@code scannedFiles}.
+     *
+     * <p>A file will be scanned at most once even if specified multiple times by one or multiple
+     * jar files' "Class-Path" manifest entries. Particularly, if a jar file from the "Class-Path"
+     * manifest entry is already in {@code scannedFiles}, either because it was scanned earlier, or
+     * it was intentionally added to the set by the caller, it will not be scanned again.
+     *
+     * <p>Note that when you call {@code location.scanResources(scannedFiles)}, the location will
+     * always be scanned even if {@code scannedFiles} already contains it.
      */
-    protected abstract void scanResource(ResourceInfo resource) throws IOException;
+    public ImmutableSet<ResourceInfo> scanResources(Set<File> scannedFiles) throws IOException {
+      ImmutableSet.Builder<ResourceInfo> builder = ImmutableSet.builder();
+      scannedFiles.add(home);
+      scan(home, scannedFiles, builder);
+      return builder.build();
+    }
 
-    protected void scanFrom(File file, ClassLoader classloader) throws IOException {
+    private void scan(File file, Set<File> scannedUris, ImmutableSet.Builder<ResourceInfo> builder)
+        throws IOException {
       try {
         if (!file.exists()) {
           return;
@@ -386,13 +469,15 @@
         return;
       }
       if (file.isDirectory()) {
-        scanDirectory(classloader, file);
+        scanDirectory(file, builder);
       } else {
-        scanJar(file, classloader);
+        scanJar(file, scannedUris, builder);
       }
     }
 
-    private void scanJar(File file, ClassLoader classloader) throws IOException {
+    private void scanJar(
+        File file, Set<File> scannedUris, ImmutableSet.Builder<ResourceInfo> builder)
+        throws IOException {
       JarFile jarFile;
       try {
         jarFile = new JarFile(file);
@@ -402,127 +487,37 @@
       }
       try {
         for (File path : getClassPathFromManifest(file, jarFile.getManifest())) {
-          scan(path, classloader);
+          // We only scan each file once independent of the classloader that file might be
+          // associated with.
+          if (scannedUris.add(path.getCanonicalFile())) {
+            scan(path, scannedUris, builder);
+          }
         }
-        scanJarFile(classloader, jarFile);
+        scanJarFile(jarFile, builder);
       } finally {
         try {
           jarFile.close();
-        } catch (IOException ignored) {
+        } catch (IOException ignored) { // similar to try-with-resources, but don't fail scanning
         }
       }
     }
 
-    /**
-     * Returns the class path URIs specified by the {@code Class-Path} manifest attribute, according
-     * to <a
-     * href="http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Main_Attributes">JAR
-     * File Specification</a>. If {@code manifest} is null, it means the jar file has no manifest,
-     * and an empty set will be returned.
-     */
-    @VisibleForTesting
-    static ImmutableSet<File> getClassPathFromManifest(File jarFile, @Nullable Manifest manifest) {
-      if (manifest == null) {
-        return ImmutableSet.of();
-      }
-      ImmutableSet.Builder<File> builder = ImmutableSet.builder();
-      String classpathAttribute =
-          manifest.getMainAttributes().getValue(Attributes.Name.CLASS_PATH.toString());
-      if (classpathAttribute != null) {
-        for (String path : CLASS_PATH_ATTRIBUTE_SEPARATOR.split(classpathAttribute)) {
-          URL url;
-          try {
-            url = getClassPathEntry(jarFile, path);
-          } catch (MalformedURLException e) {
-            // Ignore bad entry
-            logger.warning("Invalid Class-Path entry: " + path);
-            continue;
-          }
-          if (url.getProtocol().equals("file")) {
-            builder.add(toFile(url));
-          }
-        }
-      }
-      return builder.build();
-    }
-
-    @VisibleForTesting
-    static ImmutableMap<File, ClassLoader> getClassPathEntries(ClassLoader classloader) {
-      LinkedHashMap<File, ClassLoader> entries = Maps.newLinkedHashMap();
-      // Search parent first, since it's the order ClassLoader#loadClass() uses.
-      ClassLoader parent = classloader.getParent();
-      if (parent != null) {
-        entries.putAll(getClassPathEntries(parent));
-      }
-      for (URL url : getClassLoaderUrls(classloader)) {
-        if (url.getProtocol().equals("file")) {
-          File file = toFile(url);
-          if (!entries.containsKey(file)) {
-            entries.put(file, classloader);
-          }
-        }
-      }
-      return ImmutableMap.copyOf(entries);
-    }
-
-    private static ImmutableList<URL> getClassLoaderUrls(ClassLoader classloader) {
-      if (classloader instanceof URLClassLoader) {
-        return ImmutableList.copyOf(((URLClassLoader) classloader).getURLs());
-      }
-      if (classloader.equals(ClassLoader.getSystemClassLoader())) {
-        return parseJavaClassPath();
-      }
-      return ImmutableList.of();
-    }
-
-    /**
-     * Returns the URLs in the class path specified by the {@code java.class.path} {@linkplain
-     * System#getProperty system property}.
-     */
-    @VisibleForTesting // TODO(b/65488446): Make this a public API.
-    static ImmutableList<URL> parseJavaClassPath() {
-      ImmutableList.Builder<URL> urls = ImmutableList.builder();
-      for (String entry : Splitter.on(PATH_SEPARATOR.value()).split(JAVA_CLASS_PATH.value())) {
-        try {
-          try {
-            urls.add(new File(entry).toURI().toURL());
-          } catch (SecurityException e) { // File.toURI checks to see if the file is a directory
-            urls.add(new URL("file", null, new File(entry).getAbsolutePath()));
-          }
-        } catch (MalformedURLException e) {
-          logger.log(WARNING, "malformed classpath entry: " + entry, e);
-        }
-      }
-      return urls.build();
-    }
-
-    /**
-     * Returns the absolute uri of the Class-Path entry value as specified in <a
-     * href="http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Main_Attributes">JAR
-     * File Specification</a>. Even though the specification only talks about relative urls,
-     * absolute urls are actually supported too (for example, in Maven surefire plugin).
-     */
-    @VisibleForTesting
-    static URL getClassPathEntry(File jarFile, String path) throws MalformedURLException {
-      return new URL(jarFile.toURI().toURL(), path);
-    }
-
-    @VisibleForTesting
-    void scanJarFile(ClassLoader classloader, JarFile file) throws IOException {
+    private void scanJarFile(JarFile file, ImmutableSet.Builder<ResourceInfo> builder) {
       Enumeration<JarEntry> entries = file.entries();
       while (entries.hasMoreElements()) {
         JarEntry entry = entries.nextElement();
         if (entry.isDirectory() || entry.getName().equals(JarFile.MANIFEST_NAME)) {
           continue;
         }
-        scanResource(ResourceInfo.of(new File(file.getName()), entry.getName(), classloader));
+        builder.add(ResourceInfo.of(new File(file.getName()), entry.getName(), classloader));
       }
     }
 
-    private void scanDirectory(ClassLoader classloader, File directory) throws IOException {
+    private void scanDirectory(File directory, ImmutableSet.Builder<ResourceInfo> builder)
+        throws IOException {
       Set<File> currentPath = new HashSet<>();
       currentPath.add(directory.getCanonicalFile());
-      scanDirectory(directory, classloader, "", currentPath);
+      scanDirectory(directory, "", currentPath, builder);
     }
 
     /**
@@ -531,14 +526,16 @@
      * cycles; otherwise symlinks are traversed.
      *
      * @param directory the root of the directory to scan
-     * @param classloader the classloader that includes resources found in {@code directory}
      * @param packagePrefix resource path prefix inside {@code classloader} for any files found
      *     under {@code directory}
      * @param currentPath canonical files already visited in the current directory tree path, for
      *     cycle elimination
      */
     private void scanDirectory(
-        File directory, ClassLoader classloader, String packagePrefix, Set<File> currentPath)
+        File directory,
+        String packagePrefix,
+        Set<File> currentPath,
+        ImmutableSet.Builder<ResourceInfo> builder)
         throws IOException {
       File[] files = directory.listFiles();
       if (files == null) {
@@ -551,32 +548,131 @@
         if (f.isDirectory()) {
           File deref = f.getCanonicalFile();
           if (currentPath.add(deref)) {
-            scanDirectory(deref, classloader, packagePrefix + name + "/", currentPath);
+            scanDirectory(deref, packagePrefix + name + "/", currentPath, builder);
             currentPath.remove(deref);
           }
         } else {
           String resourceName = packagePrefix + name;
           if (!resourceName.equals(JarFile.MANIFEST_NAME)) {
-            scanResource(ResourceInfo.of(f, resourceName, classloader));
+            builder.add(ResourceInfo.of(f, resourceName, classloader));
           }
         }
       }
     }
-  }
 
-  @VisibleForTesting
-  static final class DefaultScanner extends Scanner {
-    private final SetMultimap<ClassLoader, ResourceInfo> resources =
-        MultimapBuilder.hashKeys().linkedHashSetValues().build();
-
-    ImmutableSet<ResourceInfo> getResources() {
-      return ImmutableSet.copyOf(resources.values());
+    @Override
+    public boolean equals(@CheckForNull Object obj) {
+      if (obj instanceof LocationInfo) {
+        LocationInfo that = (LocationInfo) obj;
+        return home.equals(that.home) && classloader.equals(that.classloader);
+      }
+      return false;
     }
 
     @Override
-    protected void scanResource(ResourceInfo resource) {
-      resources.put(resource.loader, resource);
+    public int hashCode() {
+      return home.hashCode();
     }
+
+    @Override
+    public String toString() {
+      return home.toString();
+    }
+  }
+
+  /**
+   * Returns the class path URIs specified by the {@code Class-Path} manifest attribute, according
+   * to <a
+   * href="http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Main_Attributes">JAR
+   * File Specification</a>. If {@code manifest} is null, it means the jar file has no manifest, and
+   * an empty set will be returned.
+   */
+  @VisibleForTesting
+  static ImmutableSet<File> getClassPathFromManifest(
+      File jarFile, @CheckForNull Manifest manifest) {
+    if (manifest == null) {
+      return ImmutableSet.of();
+    }
+    ImmutableSet.Builder<File> builder = ImmutableSet.builder();
+    String classpathAttribute =
+        manifest.getMainAttributes().getValue(Attributes.Name.CLASS_PATH.toString());
+    if (classpathAttribute != null) {
+      for (String path : CLASS_PATH_ATTRIBUTE_SEPARATOR.split(classpathAttribute)) {
+        URL url;
+        try {
+          url = getClassPathEntry(jarFile, path);
+        } catch (MalformedURLException e) {
+          // Ignore bad entry
+          logger.warning("Invalid Class-Path entry: " + path);
+          continue;
+        }
+        if (url.getProtocol().equals("file")) {
+          builder.add(toFile(url));
+        }
+      }
+    }
+    return builder.build();
+  }
+
+  @VisibleForTesting
+  static ImmutableMap<File, ClassLoader> getClassPathEntries(ClassLoader classloader) {
+    LinkedHashMap<File, ClassLoader> entries = Maps.newLinkedHashMap();
+    // Search parent first, since it's the order ClassLoader#loadClass() uses.
+    ClassLoader parent = classloader.getParent();
+    if (parent != null) {
+      entries.putAll(getClassPathEntries(parent));
+    }
+    for (URL url : getClassLoaderUrls(classloader)) {
+      if (url.getProtocol().equals("file")) {
+        File file = toFile(url);
+        if (!entries.containsKey(file)) {
+          entries.put(file, classloader);
+        }
+      }
+    }
+    return ImmutableMap.copyOf(entries);
+  }
+
+  private static ImmutableList<URL> getClassLoaderUrls(ClassLoader classloader) {
+    if (classloader instanceof URLClassLoader) {
+      return ImmutableList.copyOf(((URLClassLoader) classloader).getURLs());
+    }
+    if (classloader.equals(ClassLoader.getSystemClassLoader())) {
+      return parseJavaClassPath();
+    }
+    return ImmutableList.of();
+  }
+
+  /**
+   * Returns the URLs in the class path specified by the {@code java.class.path} {@linkplain
+   * System#getProperty system property}.
+   */
+  @VisibleForTesting // TODO(b/65488446): Make this a public API.
+  static ImmutableList<URL> parseJavaClassPath() {
+    ImmutableList.Builder<URL> urls = ImmutableList.builder();
+    for (String entry : Splitter.on(PATH_SEPARATOR.value()).split(JAVA_CLASS_PATH.value())) {
+      try {
+        try {
+          urls.add(new File(entry).toURI().toURL());
+        } catch (SecurityException e) { // File.toURI checks to see if the file is a directory
+          urls.add(new URL("file", null, new File(entry).getAbsolutePath()));
+        }
+      } catch (MalformedURLException e) {
+        logger.log(WARNING, "malformed classpath entry: " + entry, e);
+      }
+    }
+    return urls.build();
+  }
+
+  /**
+   * Returns the absolute uri of the Class-Path entry value as specified in <a
+   * href="http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Main_Attributes">JAR
+   * File Specification</a>. Even though the specification only talks about relative urls, absolute
+   * urls are actually supported too (for example, in Maven surefire plugin).
+   */
+  @VisibleForTesting
+  static URL getClassPathEntry(File jarFile, String path) throws MalformedURLException {
+    return new URL(jarFile.toURI().toURL(), path);
   }
 
   @VisibleForTesting
diff --git a/guava/src/com/google/common/reflect/Element.java b/guava/src/com/google/common/reflect/Element.java
deleted file mode 100644
index c63c09a..0000000
--- a/guava/src/com/google/common/reflect/Element.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (C) 2012 The Guava Authors
- *
- * 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 com.google.common.reflect;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import org.checkerframework.checker.nullness.qual.Nullable;
-
-/**
- * Represents either a {@link Field}, a {@link Method} or a {@link Constructor}. Provides
- * convenience methods such as {@link #isPublic} and {@link #isPackagePrivate}.
- *
- * @author Ben Yu
- */
-class Element extends AccessibleObject implements Member {
-
-  private final AccessibleObject accessibleObject;
-  private final Member member;
-
-  <M extends AccessibleObject & Member> Element(M member) {
-    checkNotNull(member);
-    this.accessibleObject = member;
-    this.member = member;
-  }
-
-  public TypeToken<?> getOwnerType() {
-    return TypeToken.of(getDeclaringClass());
-  }
-
-  @Override
-  public final boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
-    return accessibleObject.isAnnotationPresent(annotationClass);
-  }
-
-  @Override
-  public final <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
-    return accessibleObject.getAnnotation(annotationClass);
-  }
-
-  @Override
-  public final Annotation[] getAnnotations() {
-    return accessibleObject.getAnnotations();
-  }
-
-  @Override
-  public final Annotation[] getDeclaredAnnotations() {
-    return accessibleObject.getDeclaredAnnotations();
-  }
-
-  @Override
-  public final void setAccessible(boolean flag) throws SecurityException {
-    accessibleObject.setAccessible(flag);
-  }
-
-  @Override
-  public final boolean isAccessible() {
-    return accessibleObject.isAccessible();
-  }
-
-  @Override
-  public Class<?> getDeclaringClass() {
-    return member.getDeclaringClass();
-  }
-
-  @Override
-  public final String getName() {
-    return member.getName();
-  }
-
-  @Override
-  public final int getModifiers() {
-    return member.getModifiers();
-  }
-
-  @Override
-  public final boolean isSynthetic() {
-    return member.isSynthetic();
-  }
-
-  /** Returns true if the element is public. */
-  public final boolean isPublic() {
-    return Modifier.isPublic(getModifiers());
-  }
-
-  /** Returns true if the element is protected. */
-  public final boolean isProtected() {
-    return Modifier.isProtected(getModifiers());
-  }
-
-  /** Returns true if the element is package-private. */
-  public final boolean isPackagePrivate() {
-    return !isPrivate() && !isPublic() && !isProtected();
-  }
-
-  /** Returns true if the element is private. */
-  public final boolean isPrivate() {
-    return Modifier.isPrivate(getModifiers());
-  }
-
-  /** Returns true if the element is static. */
-  public final boolean isStatic() {
-    return Modifier.isStatic(getModifiers());
-  }
-
-  /**
-   * Returns {@code true} if this method is final, per {@code Modifier.isFinal(getModifiers())}.
-   *
-   * <p>Note that a method may still be effectively "final", or non-overridable when it has no
-   * {@code final} keyword. For example, it could be private, or it could be declared by a final
-   * class. To tell whether a method is overridable, use {@link Invokable#isOverridable}.
-   */
-  public final boolean isFinal() {
-    return Modifier.isFinal(getModifiers());
-  }
-
-  /** Returns true if the method is abstract. */
-  public final boolean isAbstract() {
-    return Modifier.isAbstract(getModifiers());
-  }
-
-  /** Returns true if the element is native. */
-  public final boolean isNative() {
-    return Modifier.isNative(getModifiers());
-  }
-
-  /** Returns true if the method is synchronized. */
-  public final boolean isSynchronized() {
-    return Modifier.isSynchronized(getModifiers());
-  }
-
-  /** Returns true if the field is volatile. */
-  final boolean isVolatile() {
-    return Modifier.isVolatile(getModifiers());
-  }
-
-  /** Returns true if the field is transient. */
-  final boolean isTransient() {
-    return Modifier.isTransient(getModifiers());
-  }
-
-  @Override
-  public boolean equals(@Nullable Object obj) {
-    if (obj instanceof Element) {
-      Element that = (Element) obj;
-      return getOwnerType().equals(that.getOwnerType()) && member.equals(that.member);
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    return member.hashCode();
-  }
-
-  @Override
-  public String toString() {
-    return member.toString();
-  }
-}
diff --git a/guava/src/com/google/common/reflect/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/reflect/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..0e8ef3c
--- /dev/null
+++ b/guava/src/com/google/common/reflect/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.reflect;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java b/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
index 354fd19..7fad5de 100644
--- a/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
+++ b/guava/src/com/google/common/reflect/ImmutableTypeToInstanceMap.java
@@ -18,6 +18,7 @@
 import com.google.common.collect.ForwardingMap;
 import com.google.common.collect.ImmutableMap;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.Map;
 
 /**
@@ -119,6 +120,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public <T extends B> T putInstance(TypeToken<T> type, T value) {
     throw new UnsupportedOperationException();
   }
@@ -132,6 +134,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public <T extends B> T putInstance(Class<T> type, T value) {
     throw new UnsupportedOperationException();
   }
@@ -145,6 +148,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public B put(TypeToken<? extends B> key, B value) {
     throw new UnsupportedOperationException();
   }
@@ -157,6 +161,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void putAll(Map<? extends TypeToken<? extends B>, ? extends B> map) {
     throw new UnsupportedOperationException();
   }
diff --git a/guava/src/com/google/common/reflect/Invokable.java b/guava/src/com/google/common/reflect/Invokable.java
index e0a9ab5..e6d3b6c 100644
--- a/guava/src/com/google/common/reflect/Invokable.java
+++ b/guava/src/com/google/common/reflect/Invokable.java
@@ -21,9 +21,9 @@
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.AnnotatedType;
 import java.lang.reflect.Constructor;
-import java.lang.reflect.GenericDeclaration;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
@@ -31,6 +31,7 @@
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.util.Arrays;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -49,17 +50,29 @@
  * assertEquals(new TypeToken<List<String>>() {}, invokable.getOwnerType());
  * }</pre>
  *
+ * <p><b>Note:</b> earlier versions of this class inherited from {@link
+ * java.lang.reflect.AccessibleObject AccessibleObject} and {@link
+ * java.lang.reflect.GenericDeclaration GenericDeclaration}. Since version 31.0 that is no longer
+ * the case. However, most methods from those types are present with the same signature in this
+ * class.
+ *
  * @param <T> the type that owns this method or constructor.
  * @param <R> the return type of (or supertype thereof) the method or the declaring type of the
  *     constructor.
  * @author Ben Yu
- * @since 14.0
+ * @since 14.0 (no longer implements {@link AccessibleObject} or {@code GenericDeclaration} since
+ *     31.0)
  */
 @Beta
-public abstract class Invokable<T, R> extends Element implements GenericDeclaration {
+@ElementTypesAreNonnullByDefault
+public abstract class Invokable<T, R> implements AnnotatedElement, Member {
+  private final AccessibleObject accessibleObject;
+  private final Member member;
 
   <M extends AccessibleObject & Member> Invokable(M member) {
-    super(member);
+    checkNotNull(member);
+    this.accessibleObject = member;
+    this.member = member;
   }
 
   /** Returns {@link Invokable} of {@code method}. */
@@ -72,6 +85,151 @@
     return new ConstructorInvokable<T>(constructor);
   }
 
+  @Override
+  public final boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
+    return accessibleObject.isAnnotationPresent(annotationClass);
+  }
+
+  @Override
+  @CheckForNull
+  public final <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
+    return accessibleObject.getAnnotation(annotationClass);
+  }
+
+  @Override
+  public final Annotation[] getAnnotations() {
+    return accessibleObject.getAnnotations();
+  }
+
+  @Override
+  public final Annotation[] getDeclaredAnnotations() {
+    return accessibleObject.getDeclaredAnnotations();
+  }
+
+  // We ought to be able to implement GenericDeclaration instead its parent AnnotatedElement.
+  // That would give us this method declaration. But for some reason, implementing
+  // GenericDeclaration leads to weird errors in Android tests:
+  // IncompatibleClassChangeError: interface not implemented
+  /** See {@link java.lang.reflect.GenericDeclaration#getTypeParameters()}. */
+  public abstract TypeVariable<?>[] getTypeParameters();
+
+  /** See {@link java.lang.reflect.AccessibleObject#setAccessible(boolean)}. */
+  public final void setAccessible(boolean flag) {
+    accessibleObject.setAccessible(flag);
+  }
+
+  /** See {@link java.lang.reflect.AccessibleObject#trySetAccessible()}. */
+  public final boolean trySetAccessible() {
+    // We can't call accessibleObject.trySetAccessible since that was added in Java 9 and this code
+    // should work on Java 8. So we emulate it this way.
+    try {
+      accessibleObject.setAccessible(true);
+      return true;
+    } catch (RuntimeException e) {
+      return false;
+    }
+  }
+
+  /** See {@link java.lang.reflect.AccessibleObject#isAccessible()}. */
+  public final boolean isAccessible() {
+    return accessibleObject.isAccessible();
+  }
+
+  @Override
+  public final String getName() {
+    return member.getName();
+  }
+
+  @Override
+  public final int getModifiers() {
+    return member.getModifiers();
+  }
+
+  @Override
+  public final boolean isSynthetic() {
+    return member.isSynthetic();
+  }
+
+  /** Returns true if the element is public. */
+  public final boolean isPublic() {
+    return Modifier.isPublic(getModifiers());
+  }
+
+  /** Returns true if the element is protected. */
+  public final boolean isProtected() {
+    return Modifier.isProtected(getModifiers());
+  }
+
+  /** Returns true if the element is package-private. */
+  public final boolean isPackagePrivate() {
+    return !isPrivate() && !isPublic() && !isProtected();
+  }
+
+  /** Returns true if the element is private. */
+  public final boolean isPrivate() {
+    return Modifier.isPrivate(getModifiers());
+  }
+
+  /** Returns true if the element is static. */
+  public final boolean isStatic() {
+    return Modifier.isStatic(getModifiers());
+  }
+
+  /**
+   * Returns {@code true} if this method is final, per {@code Modifier.isFinal(getModifiers())}.
+   *
+   * <p>Note that a method may still be effectively "final", or non-overridable when it has no
+   * {@code final} keyword. For example, it could be private, or it could be declared by a final
+   * class. To tell whether a method is overridable, use {@link Invokable#isOverridable}.
+   */
+  public final boolean isFinal() {
+    return Modifier.isFinal(getModifiers());
+  }
+
+  /** Returns true if the method is abstract. */
+  public final boolean isAbstract() {
+    return Modifier.isAbstract(getModifiers());
+  }
+
+  /** Returns true if the element is native. */
+  public final boolean isNative() {
+    return Modifier.isNative(getModifiers());
+  }
+
+  /** Returns true if the method is synchronized. */
+  public final boolean isSynchronized() {
+    return Modifier.isSynchronized(getModifiers());
+  }
+
+  /** Returns true if the field is volatile. */
+  final boolean isVolatile() {
+    return Modifier.isVolatile(getModifiers());
+  }
+
+  /** Returns true if the field is transient. */
+  final boolean isTransient() {
+    return Modifier.isTransient(getModifiers());
+  }
+
+  @Override
+  public boolean equals(@CheckForNull Object obj) {
+    if (obj instanceof Invokable) {
+      Invokable<?, ?> that = (Invokable<?, ?>) obj;
+      return getOwnerType().equals(that.getOwnerType()) && member.equals(that.member);
+    }
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return member.hashCode();
+  }
+
+  @Override
+  public String toString() {
+    return member.toString();
+  }
+
   /**
    * Returns {@code true} if this is an overridable method. Constructors, private, static or final
    * methods, or methods declared by final classes are not overridable.
@@ -94,10 +252,11 @@
    *     invocation conversion.
    * @throws InvocationTargetException if the underlying method or constructor throws an exception.
    */
-  // All subclasses are owned by us and we'll make sure to get the R type right.
-  @SuppressWarnings("unchecked")
+  // All subclasses are owned by us and we'll make sure to get the R type right, including nullness.
+  @SuppressWarnings({"unchecked", "nullness"})
   @CanIgnoreReturnValue
-  public final R invoke(@Nullable T receiver, Object... args)
+  @CheckForNull
+  public final R invoke(@CheckForNull T receiver, @Nullable Object... args)
       throws InvocationTargetException, IllegalAccessException {
     return (R) invokeInternal(receiver, checkNotNull(args));
   }
@@ -166,18 +325,18 @@
   @SuppressWarnings("unchecked") // The declaring class is T's raw class, or one of its supertypes.
   @Override
   public final Class<? super T> getDeclaringClass() {
-    return (Class<? super T>) super.getDeclaringClass();
+    return (Class<? super T>) member.getDeclaringClass();
   }
 
   /** Returns the type of {@code T}. */
   // Overridden in TypeToken#method() and TypeToken#constructor()
   @SuppressWarnings("unchecked") // The declaring class is T.
-  @Override
   public TypeToken<T> getOwnerType() {
     return (TypeToken<T>) TypeToken.of(getDeclaringClass());
   }
 
-  abstract Object invokeInternal(@Nullable Object receiver, Object[] args)
+  @CheckForNull
+  abstract Object invokeInternal(@CheckForNull Object receiver, @Nullable Object[] args)
       throws InvocationTargetException, IllegalAccessException;
 
   abstract Type[] getGenericParameterTypes();
@@ -203,7 +362,8 @@
     }
 
     @Override
-    final Object invokeInternal(@Nullable Object receiver, Object[] args)
+    @CheckForNull
+    final Object invokeInternal(@CheckForNull Object receiver, @Nullable Object[] args)
         throws InvocationTargetException, IllegalAccessException {
       return method.invoke(receiver, args);
     }
@@ -267,7 +427,7 @@
     }
 
     @Override
-    final Object invokeInternal(@Nullable Object receiver, Object[] args)
+    final Object invokeInternal(@CheckForNull Object receiver, @Nullable Object[] args)
         throws InvocationTargetException, IllegalAccessException {
       try {
         return constructor.newInstance(args);
diff --git a/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java b/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
index c7fe512..2d21dbb 100644
--- a/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
+++ b/guava/src/com/google/common/reflect/MutableTypeToInstanceMap.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Maps;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
+import com.google.errorprone.annotations.DoNotCall;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
@@ -72,6 +73,7 @@
   @CanIgnoreReturnValue
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public B put(TypeToken<? extends B> key, B value) {
     throw new UnsupportedOperationException("Please use putInstance() instead.");
   }
@@ -84,6 +86,7 @@
    */
   @Deprecated
   @Override
+  @DoNotCall("Always throws UnsupportedOperationException")
   public void putAll(Map<? extends TypeToken<? extends B>, ? extends B> map) {
     throw new UnsupportedOperationException("Please use putInstance() instead.");
   }
diff --git a/guava/src/com/google/common/reflect/Parameter.java b/guava/src/com/google/common/reflect/Parameter.java
index 8065920..61ab85a 100644
--- a/guava/src/com/google/common/reflect/Parameter.java
+++ b/guava/src/com/google/common/reflect/Parameter.java
@@ -22,6 +22,7 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.AnnotatedType;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -31,6 +32,7 @@
  * @since 14.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class Parameter implements AnnotatedElement {
 
   private final Invokable<?, ?> declaration;
@@ -68,7 +70,8 @@
   }
 
   @Override
-  public <A extends Annotation> @Nullable A getAnnotation(Class<A> annotationType) {
+  @CheckForNull
+  public <A extends Annotation> A getAnnotation(Class<A> annotationType) {
     checkNotNull(annotationType);
     for (Annotation annotation : annotations) {
       if (annotationType.isInstance(annotation)) {
@@ -100,7 +103,8 @@
   /** @since 18.0 */
   // @Override on JDK8
   @Override
-  public <A extends Annotation> @Nullable A getDeclaredAnnotation(Class<A> annotationType) {
+  @CheckForNull
+  public <A extends Annotation> A getDeclaredAnnotation(Class<A> annotationType) {
     checkNotNull(annotationType);
     return FluentIterable.from(annotations).filter(annotationType).first().orNull();
   }
@@ -109,7 +113,11 @@
   // @Override on JDK8
   @Override
   public <A extends Annotation> A[] getDeclaredAnnotationsByType(Class<A> annotationType) {
-    return FluentIterable.from(annotations).filter(annotationType).toArray(annotationType);
+    @Nullable
+    A[] result = FluentIterable.from(annotations).filter(annotationType).toArray(annotationType);
+    @SuppressWarnings("nullness") // safe because the input list contains no nulls
+    A[] cast = (A[]) result;
+    return cast;
   }
 
   /** @since 25.1 */
@@ -119,7 +127,7 @@
   }
 
   @Override
-  public boolean equals(@Nullable Object obj) {
+  public boolean equals(@CheckForNull Object obj) {
     if (obj instanceof Parameter) {
       Parameter that = (Parameter) obj;
       return position == that.position && declaration.equals(that.declaration);
diff --git a/guava/src/com/google/common/reflect/ParametricNullness.java b/guava/src/com/google/common/reflect/ParametricNullness.java
new file mode 100644
index 0000000..588aa5f
--- /dev/null
+++ b/guava/src/com/google/common/reflect/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.reflect;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/reflect/Reflection.java b/guava/src/com/google/common/reflect/Reflection.java
index 4ad5dff..fa35f7f 100644
--- a/guava/src/com/google/common/reflect/Reflection.java
+++ b/guava/src/com/google/common/reflect/Reflection.java
@@ -27,6 +27,7 @@
  * @since 12.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class Reflection {
 
   /**
diff --git a/guava/src/com/google/common/reflect/TypeCapture.java b/guava/src/com/google/common/reflect/TypeCapture.java
index effb382..2be7b4f 100644
--- a/guava/src/com/google/common/reflect/TypeCapture.java
+++ b/guava/src/com/google/common/reflect/TypeCapture.java
@@ -24,6 +24,7 @@
  *
  * @author Ben Yu
  */
+@ElementTypesAreNonnullByDefault
 abstract class TypeCapture<T> {
 
   /** Returns the captured type. */
diff --git a/guava/src/com/google/common/reflect/TypeParameter.java b/guava/src/com/google/common/reflect/TypeParameter.java
index 586c912..9c64abb 100644
--- a/guava/src/com/google/common/reflect/TypeParameter.java
+++ b/guava/src/com/google/common/reflect/TypeParameter.java
@@ -19,7 +19,7 @@
 import com.google.common.annotations.Beta;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Captures a free type variable that can be used in {@link TypeToken#where}. For example:
@@ -35,6 +35,17 @@
  * @since 12.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
+/*
+ * A nullable bound would let users create a TypeParameter instance for a parameter with a nullable
+ * bound. However, it would also let them create `new TypeParameter<@Nullable T>() {}`, which
+ * wouldn't behave as users might expect. Additionally, it's not clear how the TypeToken API could
+ * support even a "normal" `TypeParameter<T>` when `<T>` has a nullable bound. (See the discussion
+ * on TypeToken.where.) So, in the interest of failing fast and encouraging the user to switch to a
+ * non-null bound if possible, let's require a non-null bound here.
+ *
+ * TODO(cpovirk): Elaborate on "wouldn't behave as users might expect."
+ */
 public abstract class TypeParameter<T> extends TypeCapture<T> {
 
   final TypeVariable<?> typeVariable;
@@ -51,7 +62,7 @@
   }
 
   @Override
-  public final boolean equals(@Nullable Object o) {
+  public final boolean equals(@CheckForNull Object o) {
     if (o instanceof TypeParameter) {
       TypeParameter<?> that = (TypeParameter<?>) o;
       return typeVariable.equals(that.typeVariable);
diff --git a/guava/src/com/google/common/reflect/TypeResolver.java b/guava/src/com/google/common/reflect/TypeResolver.java
index 339eb43..fbe48c1 100644
--- a/guava/src/com/google/common/reflect/TypeResolver.java
+++ b/guava/src/com/google/common/reflect/TypeResolver.java
@@ -35,7 +35,7 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * An object of this class encapsulates type mappings from type variables. Mappings are established
@@ -52,6 +52,7 @@
  * @since 15.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class TypeResolver {
 
   private final TypeTable typeTable;
@@ -508,7 +509,7 @@
         @Override
         TypeVariable<?> captureAsTypeVariable(Type[] upperBounds) {
           Set<Type> combined = new LinkedHashSet<>(asList(upperBounds));
-          // Since this is an artifically generated type variable, we don't bother checking
+          // Since this is an artificially generated type variable, we don't bother checking
           // subtyping between declared type bound and actual type bound. So it's possible that we
           // may generate something like <capture#1-of ? extends Foo&SubFoo>.
           // Checking subtype between declared and actual type bounds
@@ -527,7 +528,8 @@
       return new WildcardCapturer(id);
     }
 
-    private Type captureNullable(@Nullable Type type) {
+    @CheckForNull
+    private Type captureNullable(@CheckForNull Type type) {
       if (type == null) {
         return null;
       }
@@ -561,7 +563,7 @@
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof TypeVariableKey) {
         TypeVariableKey that = (TypeVariableKey) obj;
         return equalsTypeVariable(that.var);
@@ -576,6 +578,7 @@
     }
 
     /** Wraps {@code t} in a {@code TypeVariableKey} if it's a type variable. */
+    @CheckForNull
     static TypeVariableKey forLookup(Type t) {
       if (t instanceof TypeVariable) {
         return new TypeVariableKey((TypeVariable<?>) t);
diff --git a/guava/src/com/google/common/reflect/TypeToken.java b/guava/src/com/google/common/reflect/TypeToken.java
index 88deff3..f107b70 100644
--- a/guava/src/com/google/common/reflect/TypeToken.java
+++ b/guava/src/com/google/common/reflect/TypeToken.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.VisibleForTesting;
@@ -46,7 +47,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link Type} with generics.
@@ -98,15 +99,16 @@
  */
 @Beta
 @SuppressWarnings("serial") // SimpleTypeToken is the serialized form.
+@ElementTypesAreNonnullByDefault
 public abstract class TypeToken<T> extends TypeCapture<T> implements Serializable {
 
   private final Type runtimeType;
 
   /** Resolver for resolving parameter and field types with {@link #runtimeType} as context. */
-  private transient @Nullable TypeResolver invariantTypeResolver;
+  @CheckForNull private transient TypeResolver invariantTypeResolver;
 
   /** Resolver for resolving covariant types with {@link #runtimeType} as context. */
-  private transient @Nullable TypeResolver covariantTypeResolver;
+  @CheckForNull private transient TypeResolver covariantTypeResolver;
 
   /**
    * Constructs a new type token of {@code T}.
@@ -220,6 +222,17 @@
    * @param typeParam the parameter type variable
    * @param typeArg the actual type to substitute
    */
+  /*
+   * TODO(cpovirk): Is there any way for us to support TypeParameter instances for type parameters
+   * that have nullable bounds? Unfortunately, if we change the parameter to TypeParameter<? extends
+   * @Nullable X>, then users might pass a TypeParameter<Y>, where Y is a subtype of X, while still
+   * passing a TypeToken<X>. This would be invalid. Maybe we could accept a TypeParameter<@PolyNull
+   * X> if we support such a thing? It would be weird or misleading for users to be able to pass
+   * `new TypeParameter<@Nullable T>() {}` and have it act as a plain `TypeParameter<T>`, but
+   * hopefully no one would do that, anyway. See also the comment on TypeParameter itself.
+   *
+   * TODO(cpovirk): Elaborate on this / merge with other comment?
+   */
   public final <X> TypeToken<T> where(TypeParameter<X> typeParam, TypeToken<X> typeArg) {
     TypeResolver resolver =
         new TypeResolver()
@@ -248,6 +261,10 @@
    * @param typeParam the parameter type variable
    * @param typeArg the actual type to substitute
    */
+  /*
+   * TODO(cpovirk): Is there any way for us to support TypeParameter instances for type parameters
+   * that have nullable bounds? See discussion on the other overload of this method.
+   */
   public final <X> TypeToken<T> where(TypeParameter<X> typeParam, Class<X> typeArg) {
     return where(typeParam, of(typeArg));
   }
@@ -288,7 +305,8 @@
    * if the bound is a class or extends from a class. This means that the returned type could be a
    * type variable too.
    */
-  final @Nullable TypeToken<? super T> getGenericSuperclass() {
+  @CheckForNull
+  final TypeToken<? super T> getGenericSuperclass() {
     if (runtimeType instanceof TypeVariable) {
       // First bound is always the super class, if one exists.
       return boundAsSuperclass(((TypeVariable<?>) runtimeType).getBounds()[0]);
@@ -306,7 +324,8 @@
     return superToken;
   }
 
-  private @Nullable TypeToken<? super T> boundAsSuperclass(Type bound) {
+  @CheckForNull
+  private TypeToken<? super T> boundAsSuperclass(Type bound) {
     TypeToken<?> token = of(bound);
     if (token.getRawType().isInterface()) {
       return null;
@@ -558,7 +577,8 @@
    * Returns the array component type if this type represents an array ({@code int[]}, {@code T[]},
    * {@code <? extends Map<String, Integer>[]>} etc.), or else {@code null} is returned.
    */
-  public final @Nullable TypeToken<?> getComponentType() {
+  @CheckForNull
+  public final TypeToken<?> getComponentType() {
     Type componentType = Types.getComponentType(runtimeType);
     if (componentType == null) {
       return null;
@@ -652,7 +672,7 @@
    */
   public class TypeSet extends ForwardingSet<TypeToken<? super T>> implements Serializable {
 
-    private transient @Nullable ImmutableSet<TypeToken<? super T>> types;
+    @CheckForNull private transient ImmutableSet<TypeToken<? super T>> types;
 
     TypeSet() {}
 
@@ -698,7 +718,7 @@
   private final class InterfaceSet extends TypeSet {
 
     private final transient TypeSet allTypes;
-    private transient @Nullable ImmutableSet<TypeToken<? super T>> interfaces;
+    @CheckForNull private transient ImmutableSet<TypeToken<? super T>> interfaces;
 
     InterfaceSet(TypeSet allTypes) {
       this.allTypes = allTypes;
@@ -751,7 +771,7 @@
 
   private final class ClassSet extends TypeSet {
 
-    private transient @Nullable ImmutableSet<TypeToken<? super T>> classes;
+    @CheckForNull private transient ImmutableSet<TypeToken<? super T>> classes;
 
     @Override
     protected Set<TypeToken<? super T>> delegate() {
@@ -816,7 +836,7 @@
    * Returns true if {@code o} is another {@code TypeToken} that represents the same {@link Type}.
    */
   @Override
-  public boolean equals(@Nullable Object o) {
+  public boolean equals(@CheckForNull Object o) {
     if (o instanceof TypeToken) {
       TypeToken<?> that = (TypeToken<?>) o;
       return runtimeType.equals(that.runtimeType);
@@ -1130,7 +1150,8 @@
    * Returns the owner type of a {@link ParameterizedType} or enclosing class of a {@link Class}, or
    * null otherwise.
    */
-  private @Nullable Type getOwnerTypeIfPresent() {
+  @CheckForNull
+  private Type getOwnerTypeIfPresent() {
     if (runtimeType instanceof ParameterizedType) {
       return ((ParameterizedType) runtimeType).getOwnerType();
     } else if (runtimeType instanceof Class<?>) {
@@ -1219,11 +1240,19 @@
     // with component type, we have lost generic type information
     // Use raw type so that compiler allows us to call getSupertype()
     @SuppressWarnings("rawtypes")
-    TypeToken componentType =
-        checkNotNull(getComponentType(), "%s isn't a super type of %s", supertype, this);
+    TypeToken componentType = getComponentType();
+    // TODO(cpovirk): checkArgument?
+    if (componentType == null) {
+      throw new IllegalArgumentException(supertype + " isn't a super type of " + this);
+    }
     // array is covariant. component type is super type, so is the array type.
     @SuppressWarnings("unchecked") // going from raw type back to generics
-    TypeToken<?> componentSupertype = componentType.getSupertype(supertype.getComponentType());
+    /*
+     * requireNonNull is safe because we call getArraySupertype only after checking
+     * supertype.isArray().
+     */
+    TypeToken<?> componentSupertype =
+        componentType.getSupertype(requireNonNull(supertype.getComponentType()));
     @SuppressWarnings("unchecked") // component type is super type, so is array type.
     TypeToken<? super T> result =
         (TypeToken<? super T>)
@@ -1233,8 +1262,14 @@
   }
 
   private TypeToken<? extends T> getArraySubtype(Class<?> subclass) {
+    Class<?> subclassComponentType = subclass.getComponentType();
+    if (subclassComponentType == null) {
+      throw new IllegalArgumentException(subclass + " does not appear to be a subtype of " + this);
+    }
     // array is covariant. component type is subtype, so is the array type.
-    TypeToken<?> componentSubtype = getComponentType().getSubtype(subclass.getComponentType());
+    // requireNonNull is safe because we call getArraySubtype only when isArray().
+    TypeToken<?> componentSubtype =
+        requireNonNull(getComponentType()).getSubtype(subclassComponentType);
     @SuppressWarnings("unchecked") // component type is subtype, so is array type.
     TypeToken<? extends T> result =
         (TypeToken<? extends T>)
@@ -1307,7 +1342,7 @@
           }
 
           @Override
-          @Nullable
+          @CheckForNull
           TypeToken<?> getSuperclass(TypeToken<?> type) {
             return type.getGenericSuperclass();
           }
@@ -1326,7 +1361,7 @@
           }
 
           @Override
-          @Nullable
+          @CheckForNull
           Class<?> getSuperclass(Class<?> type) {
             return type.getSuperclass();
           }
@@ -1398,7 +1433,9 @@
           new Ordering<K>() {
             @Override
             public int compare(K left, K right) {
-              return valueComparator.compare(map.get(left), map.get(right));
+              // requireNonNull is safe because we are passing keys in the map.
+              return valueComparator.compare(
+                  requireNonNull(map.get(left)), requireNonNull(map.get(right)));
             }
           };
       return keyOrdering.immutableSortedCopy(map.keySet());
@@ -1408,7 +1445,8 @@
 
     abstract Iterable<? extends K> getInterfaces(K type);
 
-    abstract @Nullable K getSuperclass(K type);
+    @CheckForNull
+    abstract K getSuperclass(K type);
 
     private static class ForwardingTypeCollector<K> extends TypeCollector<K> {
 
@@ -1429,6 +1467,7 @@
       }
 
       @Override
+      @CheckForNull
       K getSuperclass(K type) {
         return delegate.getSuperclass(type);
       }
diff --git a/guava/src/com/google/common/reflect/TypeVisitor.java b/guava/src/com/google/common/reflect/TypeVisitor.java
index 3e8436d..416397b 100644
--- a/guava/src/com/google/common/reflect/TypeVisitor.java
+++ b/guava/src/com/google/common/reflect/TypeVisitor.java
@@ -21,6 +21,7 @@
 import java.lang.reflect.TypeVariable;
 import java.lang.reflect.WildcardType;
 import java.util.Set;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Based on what a {@link Type} is, dispatch it to the corresponding {@code visit*} method. By
@@ -53,6 +54,7 @@
  *
  * @author Ben Yu
  */
+@ElementTypesAreNonnullByDefault
 abstract class TypeVisitor {
 
   private final Set<Type> visited = Sets.newHashSet();
@@ -61,7 +63,7 @@
    * Visits the given types. Null types are ignored. This allows subclasses to call {@code
    * visit(parameterizedType.getOwnerType())} safely without having to check nulls.
    */
-  public final void visit(Type... types) {
+  public final void visit(@Nullable Type... types) {
     for (Type type : types) {
       if (type == null || !visited.add(type)) {
         // null owner type, or already visited;
diff --git a/guava/src/com/google/common/reflect/Types.java b/guava/src/com/google/common/reflect/Types.java
index 42a1f78..0dc327d 100644
--- a/guava/src/com/google/common/reflect/Types.java
+++ b/guava/src/com/google/common/reflect/Types.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Iterables.transform;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
@@ -44,6 +45,7 @@
 import java.util.Collection;
 import java.util.Map.Entry;
 import java.util.concurrent.atomic.AtomicReference;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -51,6 +53,7 @@
  *
  * @author Ben Yu
  */
+@ElementTypesAreNonnullByDefault
 final class Types {
 
   /** Class#toString without the "class " and "interface " prefixes */
@@ -86,7 +89,7 @@
    * {@code ownerType}.
    */
   static ParameterizedType newParameterizedTypeWithOwner(
-      @Nullable Type ownerType, Class<?> rawType, Type... arguments) {
+      @CheckForNull Type ownerType, Class<?> rawType, Type... arguments) {
     if (ownerType == null) {
       return newParameterizedType(rawType, arguments);
     }
@@ -106,14 +109,14 @@
   private enum ClassOwnership {
     OWNED_BY_ENCLOSING_CLASS {
       @Override
-      @Nullable
+      @CheckForNull
       Class<?> getOwnerType(Class<?> rawType) {
         return rawType.getEnclosingClass();
       }
     },
     LOCAL_CLASS_HAS_NO_OWNER {
       @Override
-      @Nullable
+      @CheckForNull
       Class<?> getOwnerType(Class<?> rawType) {
         if (rawType.isLocalClass()) {
           return null;
@@ -123,14 +126,17 @@
       }
     };
 
-    abstract @Nullable Class<?> getOwnerType(Class<?> rawType);
+    @CheckForNull
+    abstract Class<?> getOwnerType(Class<?> rawType);
 
     static final ClassOwnership JVM_BEHAVIOR = detectJvmBehavior();
 
     private static ClassOwnership detectJvmBehavior() {
       class LocalClass<T> {}
       Class<?> subclass = new LocalClass<String>() {}.getClass();
-      ParameterizedType parameterizedType = (ParameterizedType) subclass.getGenericSuperclass();
+      // requireNonNull is safe because we're examining a type that's known to have a superclass.
+      ParameterizedType parameterizedType =
+          requireNonNull((ParameterizedType) subclass.getGenericSuperclass());
       for (ClassOwnership behavior : ClassOwnership.values()) {
         if (behavior.getOwnerType(LocalClass.class) == parameterizedType.getOwnerType()) {
           return behavior;
@@ -171,9 +177,10 @@
     return (type instanceof Class) ? ((Class<?>) type).getName() : type.toString();
   }
 
-  static @Nullable Type getComponentType(Type type) {
+  @CheckForNull
+  static Type getComponentType(Type type) {
     checkNotNull(type);
-    final AtomicReference<Type> result = new AtomicReference<>();
+    final AtomicReference<@Nullable Type> result = new AtomicReference<>();
     new TypeVisitor() {
       @Override
       void visitTypeVariable(TypeVariable<?> t) {
@@ -202,7 +209,8 @@
    * Returns {@code ? extends X} if any of {@code bounds} is a subtype of {@code X[]}; or null
    * otherwise.
    */
-  private static @Nullable Type subtypeOfComponentType(Type[] bounds) {
+  @CheckForNull
+  private static Type subtypeOfComponentType(Type[] bounds) {
     for (Type bound : bounds) {
       Type componentType = getComponentType(bound);
       if (componentType != null) {
@@ -244,7 +252,7 @@
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof GenericArrayType) {
         GenericArrayType that = (GenericArrayType) obj;
         return Objects.equal(getGenericComponentType(), that.getGenericComponentType());
@@ -257,11 +265,11 @@
 
   private static final class ParameterizedTypeImpl implements ParameterizedType, Serializable {
 
-    private final @Nullable Type ownerType;
+    @CheckForNull private final Type ownerType;
     private final ImmutableList<Type> argumentsList;
     private final Class<?> rawType;
 
-    ParameterizedTypeImpl(@Nullable Type ownerType, Class<?> rawType, Type[] typeArguments) {
+    ParameterizedTypeImpl(@CheckForNull Type ownerType, Class<?> rawType, Type[] typeArguments) {
       checkNotNull(rawType);
       checkArgument(typeArguments.length == rawType.getTypeParameters().length);
       disallowPrimitiveType(typeArguments, "type parameter");
@@ -281,6 +289,7 @@
     }
 
     @Override
+    @CheckForNull
     public Type getOwnerType() {
       return ownerType;
     }
@@ -307,7 +316,7 @@
     }
 
     @Override
-    public boolean equals(Object other) {
+    public boolean equals(@CheckForNull Object other) {
       if (!(other instanceof ParameterizedType)) {
         return false;
       }
@@ -383,7 +392,9 @@
     }
 
     @Override
-    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+    @CheckForNull
+    public Object invoke(Object proxy, Method method, @CheckForNull @Nullable Object[] args)
+        throws Throwable {
       String methodName = method.getName();
       Method typeVariableMethod = typeVariableMethods.get(methodName);
       if (typeVariableMethod == null) {
@@ -438,7 +449,7 @@
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (NativeTypeVariableEquals.NATIVE_TYPE_VARIABLE_ONLY) {
         // equal only to our TypeVariable implementation with identical bounds
         if (obj != null
@@ -487,7 +498,7 @@
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(@CheckForNull Object obj) {
       if (obj instanceof WildcardType) {
         WildcardType that = (WildcardType) obj;
         return lowerBounds.equals(Arrays.asList(that.getLowerBounds()))
diff --git a/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java b/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java
index 850e310..76eada2 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractCatchingFuture.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.util.concurrent.Futures.getDone;
 import static com.google.common.util.concurrent.MoreExecutors.rejectionPropagatingExecutor;
+import static com.google.common.util.concurrent.NullnessCasts.uncheckedCastNullableTToT;
 import static com.google.common.util.concurrent.Platform.isInstanceOfThrowableClass;
 
 import com.google.common.annotations.GwtCompatible;
@@ -26,13 +27,17 @@
 import com.google.errorprone.annotations.ForOverride;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Implementations of {@code Futures.catching*}. */
 @GwtCompatible
-abstract class AbstractCatchingFuture<V, X extends Throwable, F, T>
+@ElementTypesAreNonnullByDefault
+@SuppressWarnings("nullness") // TODO(b/147136275): Remove once our checker understands & and |.
+abstract class AbstractCatchingFuture<
+        V extends @Nullable Object, X extends Throwable, F, T extends @Nullable Object>
     extends FluentFuture.TrustedFuture<V> implements Runnable {
-  static <V, X extends Throwable> ListenableFuture<V> create(
+  static <V extends @Nullable Object, X extends Throwable> ListenableFuture<V> create(
       ListenableFuture<? extends V> input,
       Class<X> exceptionType,
       Function<? super X, ? extends V> fallback,
@@ -42,7 +47,7 @@
     return future;
   }
 
-  static <X extends Throwable, V> ListenableFuture<V> create(
+  static <X extends Throwable, V extends @Nullable Object> ListenableFuture<V> create(
       ListenableFuture<? extends V> input,
       Class<X> exceptionType,
       AsyncFunction<? super X, ? extends V> fallback,
@@ -56,9 +61,9 @@
    * In certain circumstances, this field might theoretically not be visible to an afterDone() call
    * triggered by cancel(). For details, see the comments on the fields of TimeoutFuture.
    */
-  @Nullable ListenableFuture<? extends V> inputFuture;
-  @Nullable Class<X> exceptionType;
-  @Nullable F fallback;
+  @CheckForNull ListenableFuture<? extends V> inputFuture;
+  @CheckForNull Class<X> exceptionType;
+  @CheckForNull F fallback;
 
   AbstractCatchingFuture(
       ListenableFuture<? extends V> inputFuture, Class<X> exceptionType, F fallback) {
@@ -107,7 +112,11 @@
     }
 
     if (throwable == null) {
-      set(sourceResult);
+      /*
+       * The cast is safe: There was no exception, so the assignment from getDone must have
+       * succeeded.
+       */
+      set(uncheckedCastNullableTToT(sourceResult));
       return;
     }
 
@@ -134,6 +143,7 @@
   }
 
   @Override
+  @CheckForNull
   protected String pendingToString() {
     ListenableFuture<? extends V> localInputFuture = inputFuture;
     Class<X> localExceptionType = exceptionType;
@@ -158,11 +168,12 @@
 
   /** Template method for subtypes to actually run the fallback. */
   @ForOverride
-  abstract @Nullable T doFallback(F fallback, X throwable) throws Exception;
+  @ParametricNullness
+  abstract T doFallback(F fallback, X throwable) throws Exception;
 
   /** Template method for subtypes to actually set the result. */
   @ForOverride
-  abstract void setResult(@Nullable T result);
+  abstract void setResult(@ParametricNullness T result);
 
   @Override
   protected final void afterDone() {
@@ -176,7 +187,7 @@
    * An {@link AbstractCatchingFuture} that delegates to an {@link AsyncFunction} and {@link
    * #setFuture(ListenableFuture)}.
    */
-  private static final class AsyncCatchingFuture<V, X extends Throwable>
+  private static final class AsyncCatchingFuture<V extends @Nullable Object, X extends Throwable>
       extends AbstractCatchingFuture<
           V, X, AsyncFunction<? super X, ? extends V>, ListenableFuture<? extends V>> {
     AsyncCatchingFuture(
@@ -208,7 +219,7 @@
    * An {@link AbstractCatchingFuture} that delegates to a {@link Function} and {@link
    * #set(Object)}.
    */
-  private static final class CatchingFuture<V, X extends Throwable>
+  private static final class CatchingFuture<V extends @Nullable Object, X extends Throwable>
       extends AbstractCatchingFuture<V, X, Function<? super X, ? extends V>, V> {
     CatchingFuture(
         ListenableFuture<? extends V> input,
@@ -218,13 +229,13 @@
     }
 
     @Override
-    @Nullable
+    @ParametricNullness
     V doFallback(Function<? super X, ? extends V> fallback, X cause) throws Exception {
       return fallback.apply(cause);
     }
 
     @Override
-    void setResult(@Nullable V result) {
+    void setResult(@ParametricNullness V result) {
       set(result);
     }
   }
diff --git a/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java b/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java
index 1bee501..df5b462 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractExecutionThreadService.java
@@ -34,6 +34,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractExecutionThreadService implements Service {
   private static final Logger logger =
       Logger.getLogger(AbstractExecutionThreadService.class.getName());
diff --git a/guava/src/com/google/common/util/concurrent/AbstractFuture.java b/guava/src/com/google/common/util/concurrent/AbstractFuture.java
index 06feb5a..e61c6ff 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractFuture.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractFuture.java
@@ -16,8 +16,10 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Throwables.throwIfUnchecked;
+import static com.google.common.util.concurrent.NullnessCasts.uncheckedNull;
 import static java.lang.Integer.toHexString;
 import static java.lang.System.identityHashCode;
+import static java.util.Objects.requireNonNull;
 import static java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater;
 
 import com.google.common.annotations.Beta;
@@ -43,6 +45,7 @@
 import java.util.concurrent.locks.LockSupport;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -64,10 +67,14 @@
  * @author Luke Sandberg
  * @since 1.0
  */
-@SuppressWarnings("ShortCircuitBoolean") // we use non-short circuiting comparisons intentionally
+@SuppressWarnings({
+  "ShortCircuitBoolean", // we use non-short circuiting comparisons intentionally
+  "nullness", // TODO(b/147136275): Remove once our checker understands & and |.
+})
 @GwtCompatible(emulated = true)
 @ReflectionSupport(value = ReflectionSupport.Level.FULL)
-public abstract class AbstractFuture<V> extends InternalFutureFailureAccess
+@ElementTypesAreNonnullByDefault
+public abstract class AbstractFuture<V extends @Nullable Object> extends InternalFutureFailureAccess
     implements ListenableFuture<V> {
   // NOTE: Whenever both tests are cheap and functional, it's faster to use &, | instead of &&, ||
 
@@ -91,21 +98,24 @@
    * of this interface must also be an AbstractFuture and must not override or expose for overriding
    * any of the public methods of ListenableFuture.
    */
-  interface Trusted<V> extends ListenableFuture<V> {}
+  interface Trusted<V extends @Nullable Object> extends ListenableFuture<V> {}
 
   /**
    * A less abstract subclass of AbstractFuture. This can be used to optimize setFuture by ensuring
    * that {@link #get} calls exactly the implementation of {@link AbstractFuture#get}.
    */
-  abstract static class TrustedFuture<V> extends AbstractFuture<V> implements Trusted<V> {
+  abstract static class TrustedFuture<V extends @Nullable Object> extends AbstractFuture<V>
+      implements Trusted<V> {
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public final V get() throws InterruptedException, ExecutionException {
       return super.get();
     }
 
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public final V get(long timeout, TimeUnit unit)
         throws InterruptedException, ExecutionException, TimeoutException {
       return super.get(timeout, unit);
@@ -191,8 +201,8 @@
   private static final class Waiter {
     static final Waiter TOMBSTONE = new Waiter(false /* ignored param */);
 
-    volatile @Nullable Thread thread;
-    volatile @Nullable Waiter next;
+    @CheckForNull volatile Thread thread;
+    @CheckForNull volatile Waiter next;
 
     /**
      * Constructor for the TOMBSTONE, avoids use of ATOMIC_HELPER in case this class is loaded
@@ -207,7 +217,7 @@
 
     // non-volatile write to the next field. Should be made visible by subsequent CAS on waiters
     // field.
-    void setNext(Waiter next) {
+    void setNext(@CheckForNull Waiter next) {
       ATOMIC_HELPER.putNext(this, next);
     }
 
@@ -264,17 +274,24 @@
 
   /** Listeners also form a stack through the {@link #listeners} field. */
   private static final class Listener {
-    static final Listener TOMBSTONE = new Listener(null, null);
+    static final Listener TOMBSTONE = new Listener();
+    @CheckForNull // null only for TOMBSTONE
     final Runnable task;
+    @CheckForNull // null only for TOMBSTONE
     final Executor executor;
 
     // writes to next are made visible by subsequent CAS's on the listeners field
-    @Nullable Listener next;
+    @CheckForNull Listener next;
 
     Listener(Runnable task, Executor executor) {
       this.task = task;
       this.executor = executor;
     }
+
+    Listener() {
+      this.task = null;
+      this.executor = null;
+    }
   }
 
   /** A special value to represent {@code null}. */
@@ -300,8 +317,8 @@
   /** A special value to represent cancellation and the 'wasInterrupted' bit. */
   private static final class Cancellation {
     // constants to use when GENERATE_CANCELLATION_CAUSES = false
-    static final Cancellation CAUSELESS_INTERRUPTED;
-    static final Cancellation CAUSELESS_CANCELLED;
+    @CheckForNull static final Cancellation CAUSELESS_INTERRUPTED;
+    @CheckForNull static final Cancellation CAUSELESS_CANCELLED;
 
     static {
       if (GENERATE_CANCELLATION_CAUSES) {
@@ -314,16 +331,16 @@
     }
 
     final boolean wasInterrupted;
-    final @Nullable Throwable cause;
+    @CheckForNull final Throwable cause;
 
-    Cancellation(boolean wasInterrupted, @Nullable Throwable cause) {
+    Cancellation(boolean wasInterrupted, @CheckForNull Throwable cause) {
       this.wasInterrupted = wasInterrupted;
       this.cause = cause;
     }
   }
 
   /** A special value that encodes the 'setFuture' state. */
-  private static final class SetFuture<V> implements Runnable {
+  private static final class SetFuture<V extends @Nullable Object> implements Runnable {
     final AbstractFuture<V> owner;
     final ListenableFuture<? extends V> future;
 
@@ -362,13 +379,13 @@
    *       argument.
    * </ul>
    */
-  private volatile @Nullable Object value;
+  @CheckForNull private volatile Object value;
 
   /** All listeners. */
-  private volatile @Nullable Listener listeners;
+  @CheckForNull private volatile Listener listeners;
 
   /** All waiting threads. */
-  private volatile @Nullable Waiter waiters;
+  @CheckForNull private volatile Waiter waiters;
 
   /** Constructor for use by subclasses. */
   protected AbstractFuture() {}
@@ -407,6 +424,7 @@
    */
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public V get(long timeout, TimeUnit unit)
       throws InterruptedException, TimeoutException, ExecutionException {
     // NOTE: if timeout < 0, remainingNanos will be < 0 and we will fall into the while(true) loop
@@ -459,7 +477,8 @@
       }
       // re-read value, if we get here then we must have observed a TOMBSTONE while trying to add a
       // waiter.
-      return getDoneValue(value);
+      // requireNonNull is safe because value is always set before TOMBSTONE.
+      return getDoneValue(requireNonNull(value));
     }
     // If we get here then we have remainingNanos < SPIN_THRESHOLD_NANOS and there is no node on the
     // waiters list
@@ -518,6 +537,7 @@
    */
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public V get() throws InterruptedException, ExecutionException {
     if (Thread.interrupted()) {
       throw new InterruptedException();
@@ -553,10 +573,12 @@
     }
     // re-read value, if we get here then we must have observed a TOMBSTONE while trying to add a
     // waiter.
-    return getDoneValue(value);
+    // requireNonNull is safe because value is always set before TOMBSTONE.
+    return getDoneValue(requireNonNull(value));
   }
 
   /** Unboxes {@code obj}. Assumes that obj is not {@code null} or a {@link SetFuture}. */
+  @ParametricNullness
   private V getDoneValue(Object obj) throws ExecutionException {
     // While this seems like it might be too branch-y, simple benchmarking proves it to be
     // unmeasurable (comparing done AbstractFutures with immediateFuture)
@@ -565,7 +587,11 @@
     } else if (obj instanceof Failure) {
       throw new ExecutionException(((Failure) obj).exception);
     } else if (obj == NULL) {
-      return null;
+      /*
+       * It's safe to return null because we would only have stored it in the first place if it were
+       * a valid value for V.
+       */
+      return uncheckedNull();
     } else {
       @SuppressWarnings("unchecked") // this is the only other option
       V asV = (V) obj;
@@ -613,9 +639,20 @@
           GENERATE_CANCELLATION_CAUSES
               ? new Cancellation(
                   mayInterruptIfRunning, new CancellationException("Future.cancel() was called."))
-              : (mayInterruptIfRunning
-                  ? Cancellation.CAUSELESS_INTERRUPTED
-                  : Cancellation.CAUSELESS_CANCELLED);
+              /*
+               * requireNonNull is safe because we've initialized these if
+               * !GENERATE_CANCELLATION_CAUSES.
+               *
+               * TODO(cpovirk): Maybe it would be cleaner to define a CancellationSupplier interface
+               * with two implementations, one that contains causeless Cancellation instances and
+               * the other of which creates new Cancellation instances each time it's called? Yet
+               * another alternative is to fill in a non-null value for each of the fields no matter
+               * what and to just not use it if !GENERATE_CANCELLATION_CAUSES.
+               */
+              : requireNonNull(
+                  mayInterruptIfRunning
+                      ? Cancellation.CAUSELESS_INTERRUPTED
+                      : Cancellation.CAUSELESS_CANCELLED);
       AbstractFuture<?> abstractFuture = this;
       while (true) {
         if (ATOMIC_HELPER.casValue(abstractFuture, localValue, valueToSet)) {
@@ -740,7 +777,7 @@
    * @return true if the attempt was accepted, completing the {@code Future}
    */
   @CanIgnoreReturnValue
-  protected boolean set(@Nullable V value) {
+  protected boolean set(@ParametricNullness V value) {
     Object valueToSet = value == null ? NULL : value;
     if (ATOMIC_HELPER.casValue(this, null, valueToSet)) {
       complete(this);
@@ -816,7 +853,7 @@
         }
         return false;
       }
-      SetFuture valueToSet = new SetFuture<V>(this, future);
+      SetFuture<V> valueToSet = new SetFuture<V>(this, future);
       if (ATOMIC_HELPER.casValue(this, null, valueToSet)) {
         // the listener is responsible for calling completeWithFuture, directExecutor is appropriate
         // since all we are doing is unpacking a completed future which should be fast.
@@ -873,7 +910,8 @@
                   : Cancellation.CAUSELESS_CANCELLED;
         }
       }
-      return v;
+      // requireNonNull is safe as long as we call this method only on completed futures.
+      return requireNonNull(v);
     }
     if (future instanceof InternalFutureFailureAccess) {
       Throwable throwable =
@@ -885,7 +923,11 @@
     boolean wasCancelled = future.isCancelled();
     // Don't allocate a CancellationException if it's not necessary
     if (!GENERATE_CANCELLATION_CAUSES & wasCancelled) {
-      return Cancellation.CAUSELESS_CANCELLED;
+      /*
+       * requireNonNull is safe because we've initialized CAUSELESS_CANCELLED if
+       * !GENERATE_CANCELLATION_CAUSES.
+       */
+      return requireNonNull(Cancellation.CAUSELESS_CANCELLED);
     }
     // Otherwise calculate the value by calling .get()
     try {
@@ -928,7 +970,9 @@
    * An inlined private copy of {@link Uninterruptibles#getUninterruptibly} used to break an
    * internal dependency on other /util/concurrent classes.
    */
-  private static <V> V getUninterruptibly(Future<V> future) throws ExecutionException {
+  @ParametricNullness
+  private static <V extends @Nullable Object> V getUninterruptibly(Future<V> future)
+      throws ExecutionException {
     boolean interrupted = false;
     try {
       while (true) {
@@ -946,7 +990,10 @@
   }
 
   /** Unblocks all threads and runs all listeners. */
-  private static void complete(AbstractFuture<?> future) {
+  private static void complete(AbstractFuture<?> param) {
+    // Declare a "true" local variable so that the Checker Framework will infer nullness.
+    AbstractFuture<?> future = param;
+
     Listener next = null;
     outer:
     while (true) {
@@ -963,7 +1010,11 @@
       while (next != null) {
         Listener curr = next;
         next = next.next;
-        Runnable task = curr.task;
+        /*
+         * requireNonNull is safe because the listener stack never contains TOMBSTONE until after
+         * clearListeners.
+         */
+        Runnable task = requireNonNull(curr.task);
         if (task instanceof SetFuture) {
           SetFuture<?> setFuture = (SetFuture<?>) task;
           // We unwind setFuture specifically to avoid StackOverflowErrors in the case of long
@@ -980,7 +1031,11 @@
           }
           // other wise the future we were trying to set is already done.
         } else {
-          executeListener(task, curr.executor);
+          /*
+           * requireNonNull is safe because the listener stack never contains TOMBSTONE until after
+           * clearListeners.
+           */
+          executeListener(task, requireNonNull(curr.executor));
         }
       }
       break;
@@ -1024,7 +1079,14 @@
    * @since 27.0
    */
   @Override
-  protected final @Nullable Throwable tryInternalFastPathGetFailure() {
+  /*
+   * We should annotate the superclass, InternalFutureFailureAccess, to say that its copy of this
+   * method returns @Nullable, too. However, we're not sure if we want to make any changes to that
+   * class, since it's in a separate artifact that we planned to release only a single version of.
+   */
+  @SuppressWarnings("nullness")
+  @CheckForNull
+  protected final Throwable tryInternalFastPathGetFailure() {
     if (this instanceof Trusted) {
       Object obj = value;
       if (obj instanceof Failure) {
@@ -1038,7 +1100,7 @@
    * If this future has been cancelled (and possibly interrupted), cancels (and possibly interrupts)
    * the given future (if available).
    */
-  final void maybePropagateCancellationTo(@Nullable Future<?> related) {
+  final void maybePropagateCancellationTo(@CheckForNull Future<?> related) {
     if (related != null & isCancelled()) {
       related.cancel(wasInterrupted());
     }
@@ -1059,7 +1121,8 @@
    * Clears the {@link #listeners} list and prepends its contents to {@code onto}, least recently
    * added first.
    */
-  private Listener clearListeners(Listener onto) {
+  @CheckForNull
+  private Listener clearListeners(@CheckForNull Listener onto) {
     // We need to
     // 1. atomically swap the listeners with TOMBSTONE, this is because addListener uses that to
     //    to synchronize with us
@@ -1107,7 +1170,8 @@
    * @return null if an explanation cannot be provided (e.g. because the future is done).
    * @since 23.0
    */
-  protected @Nullable String pendingToString() {
+  @CheckForNull
+  protected String pendingToString() {
     // TODO(diamondm) consider moving this into addPendingString so it's always in the output
     if (this instanceof ScheduledFuture) {
       return "remaining delay=["
@@ -1172,7 +1236,7 @@
    * implementation. Using a reconstruction of the default Object.toString() prevents OOMs and stack
    * overflows, and helps avoid sensitive data inadvertently ending up in exception messages.
    */
-  private void appendResultObject(StringBuilder builder, Object o) {
+  private void appendResultObject(StringBuilder builder, @CheckForNull Object o) {
     if (o == null) {
       builder.append("null");
     } else if (o == this) {
@@ -1186,7 +1250,7 @@
   }
 
   /** Helper for printing user supplied objects into our toString method. */
-  private void appendUserObject(StringBuilder builder, Object o) {
+  private void appendUserObject(StringBuilder builder, @CheckForNull Object o) {
     // This is some basic recursion detection for when people create cycles via set/setFuture or
     // when deep chains of futures exist resulting in a StackOverflowException. We could detect
     // arbitrary cycles using a thread local but this should be a good enough solution (it is also
@@ -1227,16 +1291,18 @@
     abstract void putThread(Waiter waiter, Thread newValue);
 
     /** Non volatile write of the waiter to the {@link Waiter#next} field. */
-    abstract void putNext(Waiter waiter, Waiter newValue);
+    abstract void putNext(Waiter waiter, @CheckForNull Waiter newValue);
 
     /** Performs a CAS operation on the {@link #waiters} field. */
-    abstract boolean casWaiters(AbstractFuture<?> future, Waiter expect, Waiter update);
+    abstract boolean casWaiters(
+        AbstractFuture<?> future, @CheckForNull Waiter expect, @CheckForNull Waiter update);
 
     /** Performs a CAS operation on the {@link #listeners} field. */
-    abstract boolean casListeners(AbstractFuture<?> future, Listener expect, Listener update);
+    abstract boolean casListeners(
+        AbstractFuture<?> future, @CheckForNull Listener expect, Listener update);
 
     /** Performs a CAS operation on the {@link #value} field. */
-    abstract boolean casValue(AbstractFuture<?> future, Object expect, Object update);
+    abstract boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update);
   }
 
   /**
@@ -1245,6 +1311,7 @@
    * <p>Static initialization of this class will fail if the {@link sun.misc.Unsafe} object cannot
    * be accessed.
    */
+  @SuppressWarnings("sunapi")
   private static final class UnsafeAtomicHelper extends AtomicHelper {
     static final sun.misc.Unsafe UNSAFE;
     static final long LISTENERS_OFFSET;
@@ -1299,30 +1366,32 @@
     }
 
     @Override
-    void putNext(Waiter waiter, Waiter newValue) {
+    void putNext(Waiter waiter, @CheckForNull Waiter newValue) {
       UNSAFE.putObject(waiter, WAITER_NEXT_OFFSET, newValue);
     }
 
     /** Performs a CAS operation on the {@link #waiters} field. */
     @Override
-    boolean casWaiters(AbstractFuture<?> future, Waiter expect, Waiter update) {
+    boolean casWaiters(
+        AbstractFuture<?> future, @CheckForNull Waiter expect, @CheckForNull Waiter update) {
       return UNSAFE.compareAndSwapObject(future, WAITERS_OFFSET, expect, update);
     }
 
     /** Performs a CAS operation on the {@link #listeners} field. */
     @Override
-    boolean casListeners(AbstractFuture<?> future, Listener expect, Listener update) {
+    boolean casListeners(AbstractFuture<?> future, @CheckForNull Listener expect, Listener update) {
       return UNSAFE.compareAndSwapObject(future, LISTENERS_OFFSET, expect, update);
     }
 
     /** Performs a CAS operation on the {@link #value} field. */
     @Override
-    boolean casValue(AbstractFuture<?> future, Object expect, Object update) {
+    boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
       return UNSAFE.compareAndSwapObject(future, VALUE_OFFSET, expect, update);
     }
   }
 
   /** {@link AtomicHelper} based on {@link AtomicReferenceFieldUpdater}. */
+  @SuppressWarnings("rawtypes")
   private static final class SafeAtomicHelper extends AtomicHelper {
     final AtomicReferenceFieldUpdater<Waiter, Thread> waiterThreadUpdater;
     final AtomicReferenceFieldUpdater<Waiter, Waiter> waiterNextUpdater;
@@ -1349,22 +1418,23 @@
     }
 
     @Override
-    void putNext(Waiter waiter, Waiter newValue) {
+    void putNext(Waiter waiter, @CheckForNull Waiter newValue) {
       waiterNextUpdater.lazySet(waiter, newValue);
     }
 
     @Override
-    boolean casWaiters(AbstractFuture<?> future, Waiter expect, Waiter update) {
+    boolean casWaiters(
+        AbstractFuture<?> future, @CheckForNull Waiter expect, @CheckForNull Waiter update) {
       return waitersUpdater.compareAndSet(future, expect, update);
     }
 
     @Override
-    boolean casListeners(AbstractFuture<?> future, Listener expect, Listener update) {
+    boolean casListeners(AbstractFuture<?> future, @CheckForNull Listener expect, Listener update) {
       return listenersUpdater.compareAndSet(future, expect, update);
     }
 
     @Override
-    boolean casValue(AbstractFuture<?> future, Object expect, Object update) {
+    boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
       return valueUpdater.compareAndSet(future, expect, update);
     }
   }
@@ -1382,12 +1452,13 @@
     }
 
     @Override
-    void putNext(Waiter waiter, Waiter newValue) {
+    void putNext(Waiter waiter, @CheckForNull Waiter newValue) {
       waiter.next = newValue;
     }
 
     @Override
-    boolean casWaiters(AbstractFuture<?> future, Waiter expect, Waiter update) {
+    boolean casWaiters(
+        AbstractFuture<?> future, @CheckForNull Waiter expect, @CheckForNull Waiter update) {
       synchronized (future) {
         if (future.waiters == expect) {
           future.waiters = update;
@@ -1398,7 +1469,7 @@
     }
 
     @Override
-    boolean casListeners(AbstractFuture<?> future, Listener expect, Listener update) {
+    boolean casListeners(AbstractFuture<?> future, @CheckForNull Listener expect, Listener update) {
       synchronized (future) {
         if (future.listeners == expect) {
           future.listeners = update;
@@ -1409,7 +1480,7 @@
     }
 
     @Override
-    boolean casValue(AbstractFuture<?> future, Object expect, Object update) {
+    boolean casValue(AbstractFuture<?> future, @CheckForNull Object expect, Object update) {
       synchronized (future) {
         if (future.value == expect) {
           future.value = update;
@@ -1421,7 +1492,7 @@
   }
 
   private static CancellationException cancellationExceptionWithCause(
-      @Nullable String message, @Nullable Throwable cause) {
+      String message, @CheckForNull Throwable cause) {
     CancellationException exception = new CancellationException(message);
     exception.initCause(cause);
     return exception;
diff --git a/guava/src/com/google/common/util/concurrent/AbstractIdleService.java b/guava/src/com/google/common/util/concurrent/AbstractIdleService.java
index b49db7a..fe9faf9 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractIdleService.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractIdleService.java
@@ -32,6 +32,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractIdleService implements Service {
 
   /* Thread names will look like {@code "MyService STARTING"}. */
diff --git a/guava/src/com/google/common/util/concurrent/AbstractListeningExecutorService.java b/guava/src/com/google/common/util/concurrent/AbstractListeningExecutorService.java
index 960f40e..fd5c5c9 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractListeningExecutorService.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractListeningExecutorService.java
@@ -36,18 +36,20 @@
 @Beta
 @CanIgnoreReturnValue
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractListeningExecutorService extends AbstractExecutorService
     implements ListeningExecutorService {
 
   /** @since 19.0 (present with return type {@code ListenableFutureTask} since 14.0) */
   @Override
-  protected final <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
+  protected final <T extends @Nullable Object> RunnableFuture<T> newTaskFor(
+      Runnable runnable, @ParametricNullness T value) {
     return TrustedListenableFutureTask.create(runnable, value);
   }
 
   /** @since 19.0 (present with return type {@code ListenableFutureTask} since 14.0) */
   @Override
-  protected final <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
+  protected final <T extends @Nullable Object> RunnableFuture<T> newTaskFor(Callable<T> callable) {
     return TrustedListenableFutureTask.create(callable);
   }
 
@@ -57,12 +59,13 @@
   }
 
   @Override
-  public <T> ListenableFuture<T> submit(Runnable task, @Nullable T result) {
+  public <T extends @Nullable Object> ListenableFuture<T> submit(
+      Runnable task, @ParametricNullness T result) {
     return (ListenableFuture<T>) super.submit(task, result);
   }
 
   @Override
-  public <T> ListenableFuture<T> submit(Callable<T> task) {
+  public <T extends @Nullable Object> ListenableFuture<T> submit(Callable<T> task) {
     return (ListenableFuture<T>) super.submit(task);
   }
 }
diff --git a/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java b/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
index a7a342a..87fb6df 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java
@@ -16,8 +16,10 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.util.concurrent.Futures.immediateCancelledFuture;
 import static com.google.common.util.concurrent.Internal.toNanosSaturated;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.base.Supplier;
@@ -30,12 +32,14 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -96,6 +100,7 @@
  * @since 11.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractScheduledService implements Service {
   private static final Logger logger = Logger.getLogger(AbstractScheduledService.class.getName());
 
@@ -142,9 +147,10 @@
       checkArgument(delay > 0, "delay must be > 0, found %s", delay);
       return new Scheduler() {
         @Override
-        public Future<?> schedule(
+        public Cancellable schedule(
             AbstractService service, ScheduledExecutorService executor, Runnable task) {
-          return executor.scheduleWithFixedDelay(task, initialDelay, delay, unit);
+          return new FutureAsCancellable(
+              executor.scheduleWithFixedDelay(task, initialDelay, delay, unit));
         }
       };
     }
@@ -177,15 +183,16 @@
       checkArgument(period > 0, "period must be > 0, found %s", period);
       return new Scheduler() {
         @Override
-        public Future<?> schedule(
+        public Cancellable schedule(
             AbstractService service, ScheduledExecutorService executor, Runnable task) {
-          return executor.scheduleAtFixedRate(task, initialDelay, period, unit);
+          return new FutureAsCancellable(
+              executor.scheduleAtFixedRate(task, initialDelay, period, unit));
         }
       };
     }
 
     /** Schedules the task to run on the provided executor on behalf of the service. */
-    abstract Future<?> schedule(
+    abstract Cancellable schedule(
         AbstractService service, ScheduledExecutorService executor, Runnable runnable);
 
     private Scheduler() {}
@@ -199,8 +206,8 @@
 
     // A handle to the running task so that we can stop it when a shutdown has been requested.
     // These two fields are volatile because their values will be accessed from multiple threads.
-    private volatile @Nullable Future<?> runningTask;
-    private volatile @Nullable ScheduledExecutorService executorService;
+    @CheckForNull private volatile Cancellable runningTask;
+    @CheckForNull private volatile ScheduledExecutorService executorService;
 
     // This lock protects the task so we can ensure that none of the template methods (startUp,
     // shutDown or runOneIteration) run concurrently with one another.
@@ -214,7 +221,11 @@
       public void run() {
         lock.lock();
         try {
-          if (runningTask.isCancelled()) {
+          /*
+           * requireNonNull is safe because Task isn't run (or at least it doesn't succeed in taking
+           * the lock) until after it's scheduled and the runningTask field is set.
+           */
+          if (requireNonNull(runningTask).isCancelled()) {
             // task may have been cancelled while blocked on the lock.
             return;
           }
@@ -229,7 +240,8 @@
                 ignored);
           }
           notifyFailed(t);
-          runningTask.cancel(false); // prevent future invocations.
+          // requireNonNull is safe now, just as it was above.
+          requireNonNull(runningTask).cancel(false); // prevent future invocations.
         } finally {
           lock.unlock();
         }
@@ -273,6 +285,9 @@
 
     @Override
     protected final void doStop() {
+      // Both requireNonNull calls are safe because doStop can run only after a successful doStart.
+      requireNonNull(runningTask);
+      requireNonNull(executorService);
       runningTask.cancel(false);
       executorService.execute(
           new Runnable() {
@@ -345,9 +360,9 @@
    * fails}. Subclasses may override this method to supply a custom {@link ScheduledExecutorService}
    * instance. This method is guaranteed to only be called once.
    *
-   * <p>By default this returns a new {@link ScheduledExecutorService} with a single thread thread
-   * pool that sets the name of the thread to the {@linkplain #serviceName() service name}. Also,
-   * the pool will be {@linkplain ScheduledExecutorService#shutdown() shut down} when the service
+   * <p>By default this returns a new {@link ScheduledExecutorService} with a single thread pool
+   * that sets the name of the thread to the {@linkplain #serviceName() service name}. Also, the
+   * pool will be {@linkplain ScheduledExecutorService#shutdown() shut down} when the service
    * {@linkplain Service.State#TERMINATED terminates} or {@linkplain Service.State#TERMINATED
    * fails}.
    */
@@ -471,6 +486,30 @@
     delegate.awaitTerminated(timeout, unit);
   }
 
+  interface Cancellable {
+    void cancel(boolean mayInterruptIfRunning);
+
+    boolean isCancelled();
+  }
+
+  private static final class FutureAsCancellable implements Cancellable {
+    private final Future<?> delegate;
+
+    FutureAsCancellable(Future<?> delegate) {
+      this.delegate = delegate;
+    }
+
+    @Override
+    public void cancel(boolean mayInterruptIfRunning) {
+      delegate.cancel(mayInterruptIfRunning);
+    }
+
+    @Override
+    public boolean isCancelled() {
+      return delegate.isCancelled();
+    }
+  }
+
   /**
    * A {@link Scheduler} that provides a convenient way for the {@link AbstractScheduledService} to
    * use a dynamically changing schedule. After every execution of the task, assuming it hasn't been
@@ -482,7 +521,7 @@
   public abstract static class CustomScheduler extends Scheduler {
 
     /** A callable class that can reschedule itself using a {@link CustomScheduler}. */
-    private class ReschedulableCallable extends ForwardingFuture<Void> implements Callable<Void> {
+    private final class ReschedulableCallable implements Callable<@Nullable Void> {
 
       /** The underlying task. */
       private final Runnable wrappedRunnable;
@@ -494,6 +533,27 @@
        * The service that is managing this callable. This is used so that failure can be reported
        * properly.
        */
+      /*
+       * This reference is part of a reference cycle, which is typically something we want to avoid
+       * under j2objc -- but it is not detected by our j2objc cycle test. The cycle:
+       *
+       * - CustomScheduler.service contains an instance of ServiceDelegate. (It needs it so that it
+       *   can call notifyFailed.)
+       *
+       * - ServiceDelegate.runningTask contains an instance of ReschedulableCallable (at least in
+       *   the case that the service is using CustomScheduler). (It needs it so that it can cancel
+       *   the task and detect whether it has been cancelled.)
+       *
+       * - ReschedulableCallable has a reference back to its enclosing CustomScheduler. (It needs it
+       *   so that it can call getNextSchedule).
+       *
+       * Maybe there is a way to avoid this cycle. But we think the cycle is safe enough to ignore:
+       * Each task is retained for only as long as it is running -- so it's retained only as long as
+       * it would already be retained by the underlying executor.
+       *
+       * If the cycle test starts reporting this cycle in the future, we should add an entry to
+       * cycle_suppress_list.txt.
+       */
       private final AbstractService service;
 
       /**
@@ -505,7 +565,8 @@
 
       /** The future that represents the next execution of this task. */
       @GuardedBy("lock")
-      private @Nullable Future<Void> currentFuture;
+      @CheckForNull
+      private SupplantableFuture cancellationDelegate;
 
       ReschedulableCallable(
           AbstractService service, ScheduledExecutorService executor, Runnable runnable) {
@@ -515,32 +576,36 @@
       }
 
       @Override
+      @CheckForNull
       public Void call() throws Exception {
         wrappedRunnable.run();
         reschedule();
         return null;
       }
 
-      /** Atomically reschedules this task and assigns the new future to {@link #currentFuture}. */
-      public void reschedule() {
+      /**
+       * Atomically reschedules this task and assigns the new future to {@link
+       * #cancellationDelegate}.
+       */
+      @CanIgnoreReturnValue
+      public Cancellable reschedule() {
         // invoke the callback outside the lock, prevents some shenanigans.
         Schedule schedule;
         try {
           schedule = CustomScheduler.this.getNextSchedule();
         } catch (Throwable t) {
           service.notifyFailed(t);
-          return;
+          return new FutureAsCancellable(immediateCancelledFuture());
         }
         // We reschedule ourselves with a lock held for two reasons. 1. we want to make sure that
         // cancel calls cancel on the correct future. 2. we want to make sure that the assignment
         // to currentFuture doesn't race with itself so that currentFuture is assigned in the
         // correct order.
         Throwable scheduleFailure = null;
+        Cancellable toReturn;
         lock.lock();
         try {
-          if (currentFuture == null || !currentFuture.isCancelled()) {
-            currentFuture = executor.schedule(this, schedule.delay, schedule.unit);
-          }
+          toReturn = initializeOrUpdateCancellationDelegate(schedule);
         } catch (Throwable e) {
           // If an exception is thrown by the subclass then we need to make sure that the service
           // notices and transitions to the FAILED state. We do it by calling notifyFailed directly
@@ -551,6 +616,7 @@
           // the AbstractService could monitor the future directly. Rescheduling is still hard...
           // but it would help with some of these lock ordering issues.
           scheduleFailure = e;
+          toReturn = new FutureAsCancellable(immediateCancelledFuture());
         } finally {
           lock.unlock();
         }
@@ -558,16 +624,63 @@
         if (scheduleFailure != null) {
           service.notifyFailed(scheduleFailure);
         }
+        return toReturn;
       }
 
-      // N.B. Only protect cancel and isCancelled because those are the only methods that are
-      // invoked by the AbstractScheduledService.
+      @GuardedBy("lock")
+      /*
+       * The GuardedBy checker warns us that we're not holding cancellationDelegate.lock. But in
+       * fact we are holding it because it is the same as this.lock, which we know we are holding,
+       * thanks to @GuardedBy above. (cancellationDelegate.lock is initialized to this.lock in the
+       * call to `new SupplantableFuture` below.)
+       */
+      @SuppressWarnings("GuardedBy")
+      private Cancellable initializeOrUpdateCancellationDelegate(Schedule schedule) {
+        if (cancellationDelegate == null) {
+          return cancellationDelegate = new SupplantableFuture(lock, submitToExecutor(schedule));
+        }
+        if (!cancellationDelegate.currentFuture.isCancelled()) {
+          cancellationDelegate.currentFuture = submitToExecutor(schedule);
+        }
+        return cancellationDelegate;
+      }
+
+      private ScheduledFuture<@Nullable Void> submitToExecutor(Schedule schedule) {
+        return executor.schedule(this, schedule.delay, schedule.unit);
+      }
+    }
+
+    /**
+     * Contains the most recently submitted {@code Future}, which may be cancelled or updated,
+     * always under a lock.
+     */
+    private static final class SupplantableFuture implements Cancellable {
+      private final ReentrantLock lock;
+
+      @GuardedBy("lock")
+      private Future<@Nullable Void> currentFuture;
+
+      SupplantableFuture(ReentrantLock lock, Future<@Nullable Void> currentFuture) {
+        this.lock = lock;
+        this.currentFuture = currentFuture;
+      }
+
       @Override
-      public boolean cancel(boolean mayInterruptIfRunning) {
-        // Ensure that a task cannot be rescheduled while a cancel is ongoing.
+      public void cancel(boolean mayInterruptIfRunning) {
+        /*
+         * Lock to ensure that a task cannot be rescheduled while a cancel is ongoing.
+         *
+         * In theory, cancel() could execute arbitrary listeners -- bad to do while holding a lock.
+         * However, we don't expose currentFuture to users, so they can't attach listeners. And the
+         * Future might not even be a ListenableFuture, just a plain Future. That said, similar
+         * problems can exist with methods like FutureTask.done(), not to mention slow calls to
+         * Thread.interrupt() (as discussed in InterruptibleTask). At the end of the day, it's
+         * unlikely that cancel() will be slow, so we can probably get away with calling it while
+         * holding a lock. Still, it would be nice to avoid somehow.
+         */
         lock.lock();
         try {
-          return currentFuture.cancel(mayInterruptIfRunning);
+          currentFuture.cancel(mayInterruptIfRunning);
         } finally {
           lock.unlock();
         }
@@ -582,20 +695,12 @@
           lock.unlock();
         }
       }
-
-      @Override
-      protected Future<Void> delegate() {
-        throw new UnsupportedOperationException(
-            "Only cancel and isCancelled is supported by this future");
-      }
     }
 
     @Override
-    final Future<?> schedule(
+    final Cancellable schedule(
         AbstractService service, ScheduledExecutorService executor, Runnable runnable) {
-      ReschedulableCallable task = new ReschedulableCallable(service, executor, runnable);
-      task.reschedule();
-      return task;
+      return new ReschedulableCallable(service, executor, runnable).reschedule();
     }
 
     /**
diff --git a/guava/src/com/google/common/util/concurrent/AbstractService.java b/guava/src/com/google/common/util/concurrent/AbstractService.java
index f5d38ed..ae40096 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractService.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractService.java
@@ -23,6 +23,7 @@
 import static com.google.common.util.concurrent.Service.State.STARTING;
 import static com.google.common.util.concurrent.Service.State.STOPPING;
 import static com.google.common.util.concurrent.Service.State.TERMINATED;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -36,7 +37,7 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Base class for implementing services that can handle {@link #doStart} and {@link #doStop}
@@ -49,6 +50,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class AbstractService implements Service {
   private static final ListenerCallQueue.Event<Listener> STARTING_EVENT =
       new ListenerCallQueue.Event<Listener>() {
@@ -170,7 +172,7 @@
 
     @Override
     public boolean isSatisfied() {
-      return state().isTerminal();
+      return state().compareTo(TERMINATED) >= 0;
     }
   }
 
@@ -588,20 +590,20 @@
      * The exception that caused this service to fail. This will be {@code null} unless the service
      * has failed.
      */
-    final @Nullable Throwable failure;
+    @CheckForNull final Throwable failure;
 
     StateSnapshot(State internalState) {
       this(internalState, false, null);
     }
 
     StateSnapshot(
-        State internalState, boolean shutdownWhenStartupFinishes, @Nullable Throwable failure) {
+        State internalState, boolean shutdownWhenStartupFinishes, @CheckForNull Throwable failure) {
       checkArgument(
           !shutdownWhenStartupFinishes || internalState == STARTING,
           "shutdownWhenStartupFinishes can only be set if state is STARTING. Got %s instead.",
           internalState);
       checkArgument(
-          !(failure != null ^ internalState == FAILED),
+          (failure != null) == (internalState == FAILED),
           "A failure cause should be set if and only if the state is failed.  Got %s and %s "
               + "instead.",
           internalState,
@@ -626,7 +628,8 @@
           state == FAILED,
           "failureCause() is only valid if the service has failed, service is %s",
           state);
-      return failure;
+      // requireNonNull is safe because the constructor requires a non-null cause with state=FAILED.
+      return requireNonNull(failure);
     }
   }
 }
diff --git a/guava/src/com/google/common/util/concurrent/AbstractTransformFuture.java b/guava/src/com/google/common/util/concurrent/AbstractTransformFuture.java
index e254dc6..dd68791 100644
--- a/guava/src/com/google/common/util/concurrent/AbstractTransformFuture.java
+++ b/guava/src/com/google/common/util/concurrent/AbstractTransformFuture.java
@@ -24,13 +24,17 @@
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Implementations of {@code Futures.transform*}. */
 @GwtCompatible
-abstract class AbstractTransformFuture<I, O, F, T> extends FluentFuture.TrustedFuture<O>
-    implements Runnable {
-  static <I, O> ListenableFuture<O> create(
+@ElementTypesAreNonnullByDefault
+@SuppressWarnings("nullness") // TODO(b/147136275): Remove once our checker understands & and |.
+abstract class AbstractTransformFuture<
+        I extends @Nullable Object, O extends @Nullable Object, F, T extends @Nullable Object>
+    extends FluentFuture.TrustedFuture<O> implements Runnable {
+  static <I extends @Nullable Object, O extends @Nullable Object> ListenableFuture<O> create(
       ListenableFuture<I> input,
       AsyncFunction<? super I, ? extends O> function,
       Executor executor) {
@@ -40,7 +44,7 @@
     return output;
   }
 
-  static <I, O> ListenableFuture<O> create(
+  static <I extends @Nullable Object, O extends @Nullable Object> ListenableFuture<O> create(
       ListenableFuture<I> input, Function<? super I, ? extends O> function, Executor executor) {
     checkNotNull(function);
     TransformFuture<I, O> output = new TransformFuture<>(input, function);
@@ -52,8 +56,8 @@
    * In certain circumstances, this field might theoretically not be visible to an afterDone() call
    * triggered by cancel(). For details, see the comments on the fields of TimeoutFuture.
    */
-  @Nullable ListenableFuture<? extends I> inputFuture;
-  @Nullable F function;
+  @CheckForNull ListenableFuture<? extends I> inputFuture;
+  @CheckForNull F function;
 
   AbstractTransformFuture(ListenableFuture<? extends I> inputFuture, F function) {
     this.inputFuture = checkNotNull(inputFuture);
@@ -165,11 +169,12 @@
 
   /** Template method for subtypes to actually run the transform. */
   @ForOverride
-  abstract @Nullable T doTransform(F function, @Nullable I result) throws Exception;
+  @ParametricNullness
+  abstract T doTransform(F function, @ParametricNullness I result) throws Exception;
 
   /** Template method for subtypes to actually set the result. */
   @ForOverride
-  abstract void setResult(@Nullable T result);
+  abstract void setResult(@ParametricNullness T result);
 
   @Override
   protected final void afterDone() {
@@ -179,6 +184,7 @@
   }
 
   @Override
+  @CheckForNull
   protected String pendingToString() {
     ListenableFuture<? extends I> localInputFuture = inputFuture;
     F localFunction = function;
@@ -199,7 +205,8 @@
    * An {@link AbstractTransformFuture} that delegates to an {@link AsyncFunction} and {@link
    * #setFuture(ListenableFuture)}.
    */
-  private static final class AsyncTransformFuture<I, O>
+  private static final class AsyncTransformFuture<
+          I extends @Nullable Object, O extends @Nullable Object>
       extends AbstractTransformFuture<
           I, O, AsyncFunction<? super I, ? extends O>, ListenableFuture<? extends O>> {
     AsyncTransformFuture(
@@ -209,7 +216,8 @@
 
     @Override
     ListenableFuture<? extends O> doTransform(
-        AsyncFunction<? super I, ? extends O> function, @Nullable I input) throws Exception {
+        AsyncFunction<? super I, ? extends O> function, @ParametricNullness I input)
+        throws Exception {
       ListenableFuture<? extends O> outputFuture = function.apply(input);
       checkNotNull(
           outputFuture,
@@ -229,7 +237,7 @@
    * An {@link AbstractTransformFuture} that delegates to a {@link Function} and {@link
    * #set(Object)}.
    */
-  private static final class TransformFuture<I, O>
+  private static final class TransformFuture<I extends @Nullable Object, O extends @Nullable Object>
       extends AbstractTransformFuture<I, O, Function<? super I, ? extends O>, O> {
     TransformFuture(
         ListenableFuture<? extends I> inputFuture, Function<? super I, ? extends O> function) {
@@ -237,13 +245,13 @@
     }
 
     @Override
-    @Nullable
-    O doTransform(Function<? super I, ? extends O> function, @Nullable I input) {
+    @ParametricNullness
+    O doTransform(Function<? super I, ? extends O> function, @ParametricNullness I input) {
       return function.apply(input);
     }
 
     @Override
-    void setResult(@Nullable O result) {
+    void setResult(@ParametricNullness O result) {
       set(result);
     }
   }
diff --git a/guava/src/com/google/common/util/concurrent/AggregateFuture.java b/guava/src/com/google/common/util/concurrent/AggregateFuture.java
index 596a5ae..a32e76c 100644
--- a/guava/src/com/google/common/util/concurrent/AggregateFuture.java
+++ b/guava/src/com/google/common/util/concurrent/AggregateFuture.java
@@ -20,6 +20,7 @@
 import static com.google.common.util.concurrent.AggregateFuture.ReleaseResourcesReason.OUTPUT_FUTURE_DONE;
 import static com.google.common.util.concurrent.Futures.getDone;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.Objects.requireNonNull;
 import static java.util.logging.Level.SEVERE;
 
 import com.google.common.annotations.GwtCompatible;
@@ -30,6 +31,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -39,7 +41,9 @@
  * @param <OutputT> the type of the output (i.e. this) future
  */
 @GwtCompatible
-abstract class AggregateFuture<InputT, OutputT> extends AggregateFutureState<OutputT> {
+@ElementTypesAreNonnullByDefault
+abstract class AggregateFuture<InputT extends @Nullable Object, OutputT extends @Nullable Object>
+    extends AggregateFutureState<OutputT> {
   private static final Logger logger = Logger.getLogger(AggregateFuture.class.getName());
 
   /**
@@ -52,7 +56,7 @@
    * In certain circumstances, this field might theoretically not be visible to an afterDone() call
    * triggered by cancel(). For details, see the comments on the fields of TimeoutFuture.
    */
-  private @Nullable ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures;
+  @CheckForNull private ImmutableCollection<? extends ListenableFuture<? extends InputT>> futures;
 
   private final boolean allMustSucceed;
   private final boolean collectsValues;
@@ -87,6 +91,7 @@
   }
 
   @Override
+  @CheckForNull
   protected final String pendingToString() {
     ImmutableCollection<? extends Future<?>> localFutures = futures;
     if (localFutures != null) {
@@ -103,6 +108,13 @@
    * we're guaranteed to have properly initialized the subclass.
    */
   final void init() {
+    /*
+     * requireNonNull is safe because this is called from the constructor after `futures` is set but
+     * before releaseResources could be called (because we have not yet set up any of the listeners
+     * that could call it, nor exposed this Future for users to call cancel() on).
+     */
+    requireNonNull(futures);
+
     // Corner case: List is empty.
     if (futures.isEmpty()) {
       handleAllCompleted();
@@ -234,8 +246,14 @@
   final void addInitialException(Set<Throwable> seen) {
     checkNotNull(seen);
     if (!isCancelled()) {
-      // TODO(cpovirk): Think about whether we could/should use Verify to check this.
-      boolean unused = addCausalChain(seen, tryInternalFastPathGetFailure());
+      /*
+       * requireNonNull is safe because this is a TrustedFuture, and we're calling this method only
+       * if it has failed.
+       *
+       * TODO(cpovirk): Think about whether we could/should use Verify to check the return value of
+       * addCausalChain.
+       */
+      boolean unused = addCausalChain(seen, requireNonNull(tryInternalFastPathGetFailure()));
     }
   }
 
@@ -255,7 +273,7 @@
   }
 
   private void decrementCountAndMaybeComplete(
-      @Nullable
+      @CheckForNull
           ImmutableCollection<? extends Future<? extends InputT>>
               futuresIfNeedToCollectAtCompletion) {
     int newRemaining = decrementRemainingAndGet();
@@ -266,7 +284,7 @@
   }
 
   private void processCompleted(
-      @Nullable
+      @CheckForNull
           ImmutableCollection<? extends Future<? extends InputT>>
               futuresIfNeedToCollectAtCompletion) {
     if (futuresIfNeedToCollectAtCompletion != null) {
@@ -322,12 +340,15 @@
    * If {@code allMustSucceed} is true, called as each future completes; otherwise, if {@code
    * collectsValues} is true, called for each future when all futures complete.
    */
-  abstract void collectOneValue(int index, @Nullable InputT returnValue);
+  abstract void collectOneValue(int index, @ParametricNullness InputT returnValue);
 
   abstract void handleAllCompleted();
 
   /** Adds the chain to the seen set, and returns whether all the chain was new to us. */
-  private static boolean addCausalChain(Set<Throwable> seen, Throwable t) {
+  private static boolean addCausalChain(Set<Throwable> seen, Throwable param) {
+    // Declare a "true" local variable so that the Checker Framework will infer nullness.
+    Throwable t = param;
+
     for (; t != null; t = t.getCause()) {
       boolean firstTimeSeen = seen.add(t);
       if (!firstTimeSeen) {
diff --git a/guava/src/com/google/common/util/concurrent/AggregateFutureState.java b/guava/src/com/google/common/util/concurrent/AggregateFutureState.java
index f8398d8..ee23ca0 100644
--- a/guava/src/com/google/common/util/concurrent/AggregateFutureState.java
+++ b/guava/src/com/google/common/util/concurrent/AggregateFutureState.java
@@ -15,6 +15,7 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.collect.Sets.newConcurrentHashSet;
+import static java.util.Objects.requireNonNull;
 import static java.util.concurrent.atomic.AtomicIntegerFieldUpdater.newUpdater;
 import static java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater;
 
@@ -25,6 +26,8 @@
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A helper which does some thread-safe operations for aggregate futures, which must be implemented
@@ -37,10 +40,12 @@
  */
 @GwtCompatible(emulated = true)
 @ReflectionSupport(value = ReflectionSupport.Level.FULL)
-abstract class AggregateFutureState<OutputT> extends AbstractFuture.TrustedFuture<OutputT> {
+@ElementTypesAreNonnullByDefault
+abstract class AggregateFutureState<OutputT extends @Nullable Object>
+    extends AbstractFuture.TrustedFuture<OutputT> {
   // Lazily initialized the first time we see an exception; not released until all the input futures
   // have completed and we have processed them all.
-  private volatile Set<Throwable> seenExceptions = null;
+  @CheckForNull private volatile Set<Throwable> seenExceptions = null;
 
   private volatile int remaining;
 
@@ -54,7 +59,7 @@
     try {
       helper =
           new SafeAtomicHelper(
-              newUpdater(AggregateFutureState.class, (Class) Set.class, "seenExceptions"),
+              newUpdater(AggregateFutureState.class, Set.class, "seenExceptions"),
               newUpdater(AggregateFutureState.class, "remaining"));
     } catch (Throwable reflectionFailure) {
       // Some Android 5.0.x Samsung devices have bugs in JDK reflection APIs that cause
@@ -124,8 +129,11 @@
        * other callers have added to it.
        *
        * This read is guaranteed to get us the right value because we only set this once (here).
+       *
+       * requireNonNull is safe because either our compareAndSet succeeded or it failed because
+       * another thread did it for us.
        */
-      seenExceptionsLocal = seenExceptions;
+      seenExceptionsLocal = requireNonNull(seenExceptions);
     }
     return seenExceptionsLocal;
   }
@@ -144,32 +152,37 @@
   private abstract static class AtomicHelper {
     /** Atomic compare-and-set of the {@link AggregateFutureState#seenExceptions} field. */
     abstract void compareAndSetSeenExceptions(
-        AggregateFutureState state, Set<Throwable> expect, Set<Throwable> update);
+        AggregateFutureState<?> state, @CheckForNull Set<Throwable> expect, Set<Throwable> update);
 
     /** Atomic decrement-and-get of the {@link AggregateFutureState#remaining} field. */
-    abstract int decrementAndGetRemainingCount(AggregateFutureState state);
+    abstract int decrementAndGetRemainingCount(AggregateFutureState<?> state);
   }
 
   private static final class SafeAtomicHelper extends AtomicHelper {
-    final AtomicReferenceFieldUpdater<AggregateFutureState, Set<Throwable>> seenExceptionsUpdater;
+    final AtomicReferenceFieldUpdater<AggregateFutureState<?>, Set<Throwable>>
+        seenExceptionsUpdater;
 
-    final AtomicIntegerFieldUpdater<AggregateFutureState> remainingCountUpdater;
+    final AtomicIntegerFieldUpdater<AggregateFutureState<?>> remainingCountUpdater;
 
+    @SuppressWarnings({"rawtypes", "unchecked"}) // Unavoidable with reflection API
     SafeAtomicHelper(
         AtomicReferenceFieldUpdater seenExceptionsUpdater,
         AtomicIntegerFieldUpdater remainingCountUpdater) {
-      this.seenExceptionsUpdater = seenExceptionsUpdater;
-      this.remainingCountUpdater = remainingCountUpdater;
+      this.seenExceptionsUpdater =
+          (AtomicReferenceFieldUpdater<AggregateFutureState<?>, Set<Throwable>>)
+              seenExceptionsUpdater;
+      this.remainingCountUpdater =
+          (AtomicIntegerFieldUpdater<AggregateFutureState<?>>) remainingCountUpdater;
     }
 
     @Override
     void compareAndSetSeenExceptions(
-        AggregateFutureState state, Set<Throwable> expect, Set<Throwable> update) {
+        AggregateFutureState<?> state, @CheckForNull Set<Throwable> expect, Set<Throwable> update) {
       seenExceptionsUpdater.compareAndSet(state, expect, update);
     }
 
     @Override
-    int decrementAndGetRemainingCount(AggregateFutureState state) {
+    int decrementAndGetRemainingCount(AggregateFutureState<?> state) {
       return remainingCountUpdater.decrementAndGet(state);
     }
   }
@@ -177,7 +190,7 @@
   private static final class SynchronizedAtomicHelper extends AtomicHelper {
     @Override
     void compareAndSetSeenExceptions(
-        AggregateFutureState state, Set<Throwable> expect, Set<Throwable> update) {
+        AggregateFutureState<?> state, @CheckForNull Set<Throwable> expect, Set<Throwable> update) {
       synchronized (state) {
         if (state.seenExceptions == expect) {
           state.seenExceptions = update;
@@ -186,7 +199,7 @@
     }
 
     @Override
-    int decrementAndGetRemainingCount(AggregateFutureState state) {
+    int decrementAndGetRemainingCount(AggregateFutureState<?> state) {
       synchronized (state) {
         return --state.remaining;
       }
diff --git a/guava/src/com/google/common/util/concurrent/AsyncCallable.java b/guava/src/com/google/common/util/concurrent/AsyncCallable.java
index f39a882..826f3c2 100644
--- a/guava/src/com/google/common/util/concurrent/AsyncCallable.java
+++ b/guava/src/com/google/common/util/concurrent/AsyncCallable.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.concurrent.Future;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Computes a value, possibly asynchronously. For an example usage and more information, see {@link
@@ -30,7 +31,8 @@
 @Beta
 @FunctionalInterface
 @GwtCompatible
-public interface AsyncCallable<V> {
+@ElementTypesAreNonnullByDefault
+public interface AsyncCallable<V extends @Nullable Object> {
   /**
    * Computes a result {@code Future}. The output {@code Future} need not be {@linkplain
    * Future#isDone done}, making {@code AsyncCallable} suitable for asynchronous derivations.
diff --git a/guava/src/com/google/common/util/concurrent/AsyncFunction.java b/guava/src/com/google/common/util/concurrent/AsyncFunction.java
index bae9bce..3a19db4 100644
--- a/guava/src/com/google/common/util/concurrent/AsyncFunction.java
+++ b/guava/src/com/google/common/util/concurrent/AsyncFunction.java
@@ -27,7 +27,8 @@
  */
 @GwtCompatible
 @FunctionalInterface
-public interface AsyncFunction<I, O> {
+@ElementTypesAreNonnullByDefault
+public interface AsyncFunction<I extends @Nullable Object, O extends @Nullable Object> {
   /**
    * Returns an output {@code Future} to use in place of the given {@code input}. The output {@code
    * Future} need not be {@linkplain Future#isDone done}, making {@code AsyncFunction} suitable for
@@ -35,5 +36,5 @@
    *
    * <p>Throwing an exception from this method is equivalent to returning a failing {@code Future}.
    */
-  ListenableFuture<O> apply(@Nullable I input) throws Exception;
+  ListenableFuture<O> apply(@ParametricNullness I input) throws Exception;
 }
diff --git a/guava/src/com/google/common/util/concurrent/AtomicDouble.java b/guava/src/com/google/common/util/concurrent/AtomicDouble.java
index 8f881dd..81da695 100644
--- a/guava/src/com/google/common/util/concurrent/AtomicDouble.java
+++ b/guava/src/com/google/common/util/concurrent/AtomicDouble.java
@@ -53,6 +53,7 @@
  */
 @GwtIncompatible
 @ReflectionSupport(value = ReflectionSupport.Level.FULL)
+@ElementTypesAreNonnullByDefault
 public class AtomicDouble extends Number implements java.io.Serializable {
   private static final long serialVersionUID = 0L;
 
diff --git a/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java b/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
index 5c4baa1..58407f5 100644
--- a/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
+++ b/guava/src/com/google/common/util/concurrent/AtomicDoubleArray.java
@@ -44,6 +44,7 @@
  * @since 11.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public class AtomicDoubleArray implements java.io.Serializable {
   private static final long serialVersionUID = 0L;
 
@@ -96,7 +97,7 @@
   }
 
   /**
-   * Sets the element at position {@code i} to the given value.
+   * Atomically sets the element at position {@code i} to the given value.
    *
    * @param i the index
    * @param newValue the new value
diff --git a/guava/src/com/google/common/util/concurrent/AtomicLongMap.java b/guava/src/com/google/common/util/concurrent/AtomicLongMap.java
index b80ef2e..456b3ac 100644
--- a/guava/src/com/google/common/util/concurrent/AtomicLongMap.java
+++ b/guava/src/com/google/common/util/concurrent/AtomicLongMap.java
@@ -29,7 +29,7 @@
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.LongBinaryOperator;
 import java.util.function.LongUnaryOperator;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A map containing {@code long} values that can be atomically updated. While writes to a
@@ -55,6 +55,7 @@
  * @since 11.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class AtomicLongMap<K> implements Serializable {
   private final ConcurrentHashMap<K, Long> map;
 
@@ -262,7 +263,7 @@
     return map.values().stream().mapToLong(Long::longValue).sum();
   }
 
-  private transient @Nullable Map<K, Long> asMap;
+  @CheckForNull private transient Map<K, Long> asMap;
 
   /** Returns a live, read-only view of the map backing this {@code AtomicLongMap}. */
   public Map<K, Long> asMap() {
diff --git a/guava/src/com/google/common/util/concurrent/Atomics.java b/guava/src/com/google/common/util/concurrent/Atomics.java
index 191da95..c1b6964 100644
--- a/guava/src/com/google/common/util/concurrent/Atomics.java
+++ b/guava/src/com/google/common/util/concurrent/Atomics.java
@@ -26,6 +26,7 @@
  * @since 10.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class Atomics {
   private Atomics() {}
 
@@ -34,8 +35,8 @@
    *
    * @return a new {@code AtomicReference} with no initial value
    */
-  public static <V> AtomicReference<V> newReference() {
-    return new AtomicReference<V>();
+  public static <V> AtomicReference<@Nullable V> newReference() {
+    return new AtomicReference<>();
   }
 
   /**
@@ -44,8 +45,9 @@
    * @param initialValue the initial value
    * @return a new {@code AtomicReference} with the given initial value
    */
-  public static <V> AtomicReference<V> newReference(@Nullable V initialValue) {
-    return new AtomicReference<V>(initialValue);
+  public static <V extends @Nullable Object> AtomicReference<V> newReference(
+      @ParametricNullness V initialValue) {
+    return new AtomicReference<>(initialValue);
   }
 
   /**
@@ -54,8 +56,8 @@
    * @param length the length of the array
    * @return a new {@code AtomicReferenceArray} with the given length
    */
-  public static <E> AtomicReferenceArray<E> newReferenceArray(int length) {
-    return new AtomicReferenceArray<E>(length);
+  public static <E> AtomicReferenceArray<@Nullable E> newReferenceArray(int length) {
+    return new AtomicReferenceArray<>(length);
   }
 
   /**
@@ -65,7 +67,7 @@
    * @param array the array to copy elements from
    * @return a new {@code AtomicReferenceArray} copied from the given array
    */
-  public static <E> AtomicReferenceArray<E> newReferenceArray(E[] array) {
-    return new AtomicReferenceArray<E>(array);
+  public static <E extends @Nullable Object> AtomicReferenceArray<E> newReferenceArray(E[] array) {
+    return new AtomicReferenceArray<>(array);
   }
 }
diff --git a/guava/src/com/google/common/util/concurrent/Callables.java b/guava/src/com/google/common/util/concurrent/Callables.java
index 747ffa7..47b5264 100644
--- a/guava/src/com/google/common/util/concurrent/Callables.java
+++ b/guava/src/com/google/common/util/concurrent/Callables.java
@@ -30,13 +30,16 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Callables {
   private Callables() {}
 
   /** Creates a {@code Callable} which immediately returns a preset value each time it is called. */
-  public static <T> Callable<T> returning(final @Nullable T value) {
+  public static <T extends @Nullable Object> Callable<T> returning(
+      @ParametricNullness final T value) {
     return new Callable<T>() {
       @Override
+      @ParametricNullness
       public T call() {
         return value;
       }
@@ -53,7 +56,7 @@
    */
   @Beta
   @GwtIncompatible
-  public static <T> AsyncCallable<T> asAsyncCallable(
+  public static <T extends @Nullable Object> AsyncCallable<T> asAsyncCallable(
       final Callable<T> callable, final ListeningExecutorService listeningExecutorService) {
     checkNotNull(callable);
     checkNotNull(listeningExecutorService);
@@ -69,18 +72,18 @@
    * Wraps the given callable such that for the duration of {@link Callable#call} the thread that is
    * running will have the given name.
    *
-   *
    * @param callable The callable to wrap
    * @param nameSupplier The supplier of thread names, {@link Supplier#get get} will be called once
    *     for each invocation of the wrapped callable.
    */
   @GwtIncompatible // threads
-  static <T> Callable<T> threadRenaming(
+  static <T extends @Nullable Object> Callable<T> threadRenaming(
       final Callable<T> callable, final Supplier<String> nameSupplier) {
     checkNotNull(nameSupplier);
     checkNotNull(callable);
     return new Callable<T>() {
       @Override
+      @ParametricNullness
       public T call() throws Exception {
         Thread currentThread = Thread.currentThread();
         String oldName = currentThread.getName();
@@ -100,7 +103,6 @@
    * Wraps the given runnable such that for the duration of {@link Runnable#run} the thread that is
    * running with have the given name.
    *
-   *
    * @param task The Runnable to wrap
    * @param nameSupplier The supplier of thread names, {@link Supplier#get get} will be called once
    *     for each invocation of the wrapped callable.
diff --git a/guava/src/com/google/common/util/concurrent/ClosingFuture.java b/guava/src/com/google/common/util/concurrent/ClosingFuture.java
index d4c9265..8859fbc 100644
--- a/guava/src/com/google/common/util/concurrent/ClosingFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ClosingFuture.java
@@ -59,6 +59,7 @@
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -136,8 +137,9 @@
  * <h4>Automatically closing</h4>
  *
  * You can extract a {@link Future} that represents the result of the last step in the pipeline by
- * calling {@link #finishToFuture()}. When that final {@link Future} is done, all objects captured
- * by all steps in the pipeline will be closed.
+ * calling {@link #finishToFuture()}. All objects the pipeline has captured for closing will begin
+ * to be closed asynchronously <b>after</b> the returned {@code Future} is done: the future
+ * completes before closing starts, rather than once it has finished.
  *
  * <pre>{@code
  * FluentFuture<UserName> userName =
@@ -190,8 +192,9 @@
 // TODO(dpb): Consider reusing one CloseableList for the entire pipeline, modulo combinations.
 @Beta // @Beta for one release.
 @DoNotMock("Use ClosingFuture.from(Futures.immediate*Future)")
+@ElementTypesAreNonnullByDefault
 // TODO(dpb): GWT compatibility.
-public final class ClosingFuture<V> {
+public final class ClosingFuture<V extends @Nullable Object> {
 
   private static final Logger logger = Logger.getLogger(ClosingFuture.class.getName());
 
@@ -230,8 +233,9 @@
      * @return the first argument
      */
     @CanIgnoreReturnValue
+    @ParametricNullness
     public <C extends @Nullable Object & @Nullable AutoCloseable> C eventuallyClose(
-        C closeable, Executor closingExecutor) {
+        @ParametricNullness C closeable, Executor closingExecutor) {
       checkNotNull(closingExecutor);
       if (closeable != null) {
         list.add(closeable, closingExecutor);
@@ -254,10 +258,29 @@
      * closer.eventuallyClose()} will be closed when the {@link ClosingFuture} pipeline is done (but
      * not before this method completes), even if this method throws or the pipeline is cancelled.
      */
+    @ParametricNullness
     V call(DeferredCloser closer) throws Exception;
   }
 
   /**
+   * An operation that computes a {@link ClosingFuture} of a result.
+   *
+   * @param <V> the type of the result
+   * @since 30.1
+   */
+  @FunctionalInterface
+  public interface AsyncClosingCallable<V extends @Nullable Object> {
+    /**
+     * Computes a result, or throws an exception if unable to do so.
+     *
+     * <p>Any objects that are passed to {@link DeferredCloser#eventuallyClose(Closeable, Executor)
+     * closer.eventuallyClose()} will be closed when the {@link ClosingFuture} pipeline is done (but
+     * not before this method completes), even if this method throws or the pipeline is cancelled.
+     */
+    ClosingFuture<V> call(DeferredCloser closer) throws Exception;
+  }
+
+  /**
    * A function from an input to a result.
    *
    * @param <T> the type of the input to the function
@@ -273,7 +296,8 @@
      * closer.eventuallyClose()} will be closed when the {@link ClosingFuture} pipeline is done (but
      * not before this method completes), even if this method throws or the pipeline is cancelled.
      */
-    U apply(DeferredCloser closer, T input) throws Exception;
+    @ParametricNullness
+    U apply(DeferredCloser closer, @ParametricNullness T input) throws Exception;
   }
 
   /**
@@ -291,7 +315,7 @@
      * closer.eventuallyClose()} will be closed when the {@link ClosingFuture} pipeline is done (but
      * not before this method completes), even if this method throws or the pipeline is cancelled.
      */
-    ClosingFuture<U> apply(DeferredCloser closer, T input) throws Exception;
+    ClosingFuture<U> apply(DeferredCloser closer, @ParametricNullness T input) throws Exception;
   }
 
   /**
@@ -304,7 +328,7 @@
    * @param <V> the type of the value of a successful operation
    * @see ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)
    */
-  public static final class ValueAndCloser<V> {
+  public static final class ValueAndCloser<V extends @Nullable Object> {
 
     private final ClosingFuture<? extends V> closingFuture;
 
@@ -322,7 +346,7 @@
      * @throws CancellationException if the computation was cancelled
      * @throws ExecutionException if the computation threw an exception
      */
-    @Nullable
+    @ParametricNullness
     public V get() throws ExecutionException {
       return getDone(closingFuture.future);
     }
@@ -350,7 +374,7 @@
    * @see ClosingFuture#finishToValueAndCloser(ValueAndCloserConsumer, Executor)
    */
   @FunctionalInterface
-  public interface ValueAndCloserConsumer<V> {
+  public interface ValueAndCloserConsumer<V extends @Nullable Object> {
 
     /** Accepts a {@link ValueAndCloser} for the last step in a {@link ClosingFuture} pipeline. */
     void accept(ValueAndCloser<V> valueAndCloser);
@@ -362,11 +386,22 @@
    * @throws java.util.concurrent.RejectedExecutionException if the task cannot be scheduled for
    *     execution
    */
-  public static <V> ClosingFuture<V> submit(ClosingCallable<V> callable, Executor executor) {
+  public static <V extends @Nullable Object> ClosingFuture<V> submit(
+      ClosingCallable<V> callable, Executor executor) {
     return new ClosingFuture<>(callable, executor);
   }
 
-  // TODO(dpb, cpovirk): Do we need submitAsync?
+  /**
+   * Starts a {@link ClosingFuture} pipeline by submitting a callable block to an executor.
+   *
+   * @throws java.util.concurrent.RejectedExecutionException if the task cannot be scheduled for
+   *     execution
+   * @since 30.1
+   */
+  public static <V extends @Nullable Object> ClosingFuture<V> submitAsync(
+      AsyncClosingCallable<V> callable, Executor executor) {
+    return new ClosingFuture<>(callable, executor);
+  }
 
   /**
    * Starts a {@link ClosingFuture} pipeline with a {@link ListenableFuture}.
@@ -375,7 +410,7 @@
    * implements {@link Closeable}. In order to start a pipeline with a value that will be closed
    * when the pipeline is done, use {@link #submit(ClosingCallable, Executor)} instead.
    */
-  public static <V> ClosingFuture<V> from(ListenableFuture<V> future) {
+  public static <V extends @Nullable Object> ClosingFuture<V> from(ListenableFuture<V> future) {
     return new ClosingFuture<V>(future);
   }
 
@@ -410,7 +445,7 @@
         future,
         new FutureCallback<@Nullable AutoCloseable>() {
           @Override
-          public void onSuccess(@Nullable AutoCloseable result) {
+          public void onSuccess(@CheckForNull AutoCloseable result) {
             closingFuture.closeables.closer.eventuallyClose(result, closingExecutor);
           }
 
@@ -463,8 +498,8 @@
    * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
    *     the arguments, or if any has already been {@linkplain #finishToFuture() finished}
    */
-  public static <V1, V2> Combiner2<V1, V2> whenAllSucceed(
-      ClosingFuture<V1> future1, ClosingFuture<V2> future2) {
+  public static <V1 extends @Nullable Object, V2 extends @Nullable Object>
+      Combiner2<V1, V2> whenAllSucceed(ClosingFuture<V1> future1, ClosingFuture<V2> future2) {
     return new Combiner2<>(future1, future2);
   }
 
@@ -478,8 +513,10 @@
    * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
    *     the arguments, or if any has already been {@linkplain #finishToFuture() finished}
    */
-  public static <V1, V2, V3> Combiner3<V1, V2, V3> whenAllSucceed(
-      ClosingFuture<V1> future1, ClosingFuture<V2> future2, ClosingFuture<V3> future3) {
+  public static <
+          V1 extends @Nullable Object, V2 extends @Nullable Object, V3 extends @Nullable Object>
+      Combiner3<V1, V2, V3> whenAllSucceed(
+          ClosingFuture<V1> future1, ClosingFuture<V2> future2, ClosingFuture<V3> future3) {
     return new Combiner3<>(future1, future2, future3);
   }
 
@@ -493,11 +530,16 @@
    * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
    *     the arguments, or if any has already been {@linkplain #finishToFuture() finished}
    */
-  public static <V1, V2, V3, V4> Combiner4<V1, V2, V3, V4> whenAllSucceed(
-      ClosingFuture<V1> future1,
-      ClosingFuture<V2> future2,
-      ClosingFuture<V3> future3,
-      ClosingFuture<V4> future4) {
+  public static <
+          V1 extends @Nullable Object,
+          V2 extends @Nullable Object,
+          V3 extends @Nullable Object,
+          V4 extends @Nullable Object>
+      Combiner4<V1, V2, V3, V4> whenAllSucceed(
+          ClosingFuture<V1> future1,
+          ClosingFuture<V2> future2,
+          ClosingFuture<V3> future3,
+          ClosingFuture<V4> future4) {
     return new Combiner4<>(future1, future2, future3, future4);
   }
 
@@ -511,12 +553,18 @@
    * @throws IllegalStateException if a {@code ClosingFuture} has already been derived from any of
    *     the arguments, or if any has already been {@linkplain #finishToFuture() finished}
    */
-  public static <V1, V2, V3, V4, V5> Combiner5<V1, V2, V3, V4, V5> whenAllSucceed(
-      ClosingFuture<V1> future1,
-      ClosingFuture<V2> future2,
-      ClosingFuture<V3> future3,
-      ClosingFuture<V4> future4,
-      ClosingFuture<V5> future5) {
+  public static <
+          V1 extends @Nullable Object,
+          V2 extends @Nullable Object,
+          V3 extends @Nullable Object,
+          V4 extends @Nullable Object,
+          V5 extends @Nullable Object>
+      Combiner5<V1, V2, V3, V4, V5> whenAllSucceed(
+          ClosingFuture<V1> future1,
+          ClosingFuture<V2> future2,
+          ClosingFuture<V3> future3,
+          ClosingFuture<V4> future4,
+          ClosingFuture<V5> future5) {
     return new Combiner5<>(future1, future2, future3, future4, future5);
   }
 
@@ -554,6 +602,7 @@
         TrustedListenableFutureTask.create(
             new Callable<V>() {
               @Override
+              @ParametricNullness
               public V call() throws Exception {
                 return callable.call(closeables.closer);
               }
@@ -567,6 +616,32 @@
     this.future = task;
   }
 
+  private ClosingFuture(final AsyncClosingCallable<V> callable, Executor executor) {
+    checkNotNull(callable);
+    TrustedListenableFutureTask<V> task =
+        TrustedListenableFutureTask.create(
+            new AsyncCallable<V>() {
+              @Override
+              public ListenableFuture<V> call() throws Exception {
+                CloseableList newCloseables = new CloseableList();
+                try {
+                  ClosingFuture<V> closingFuture = callable.call(newCloseables.closer);
+                  closingFuture.becomeSubsumedInto(closeables);
+                  return closingFuture.future;
+                } finally {
+                  closeables.add(newCloseables, directExecutor());
+                }
+              }
+
+              @Override
+              public String toString() {
+                return callable.toString();
+              }
+            });
+    executor.execute(task);
+    this.future = task;
+  }
+
   /**
    * Returns a future that finishes when this step does. Calling {@code get()} on the returned
    * future returns {@code null} if the step is successful or throws the same exception that would
@@ -615,7 +690,7 @@
    *     one, or if this {@code ClosingFuture} has already been {@linkplain #finishToFuture()
    *     finished}
    */
-  public <U> ClosingFuture<U> transform(
+  public <U extends @Nullable Object> ClosingFuture<U> transform(
       final ClosingFunction<? super V, U> function, Executor executor) {
     checkNotNull(function);
     AsyncFunction<V, U> applyFunction =
@@ -709,7 +784,7 @@
    *     one, or if this {@code ClosingFuture} has already been {@linkplain #finishToFuture()
    *     finished}
    */
-  public <U> ClosingFuture<U> transformAsync(
+  public <U extends @Nullable Object> ClosingFuture<U> transformAsync(
       final AsyncClosingFunction<? super V, U> function, Executor executor) {
     checkNotNull(function);
     AsyncFunction<V, U> applyFunction =
@@ -753,8 +828,8 @@
    * @param function transforms the value of a {@code ClosingFuture} step to a {@link
    *     ListenableFuture} with the value of a derived step
    */
-  public static <V, U> AsyncClosingFunction<V, U> withoutCloser(
-      final AsyncFunction<V, U> function) {
+  public static <V extends @Nullable Object, U extends @Nullable Object>
+      AsyncClosingFunction<V, U> withoutCloser(final AsyncFunction<V, U> function) {
     checkNotNull(function);
     return new AsyncClosingFunction<V, U>() {
       @Override
@@ -929,9 +1004,14 @@
   }
 
   /**
-   * Marks this step as the last step in the {@code ClosingFuture} pipeline. When the returned
-   * {@link Future} is done, all objects captured for closing during the pipeline's computation will
-   * be closed.
+   * Marks this step as the last step in the {@code ClosingFuture} pipeline.
+   *
+   * <p>The returned {@link Future} is completed when the pipeline's computation completes, or when
+   * the pipeline is cancelled.
+   *
+   * <p>All objects the pipeline has captured for closing will begin to be closed asynchronously
+   * <b>after</b> the returned {@code Future} is done: the future completes before closing starts,
+   * rather than once it has finished.
    *
    * <p>After calling this method, you may not call {@link
    * #finishToValueAndCloser(ValueAndCloserConsumer, Executor)}, this method, or any other
@@ -1018,7 +1098,7 @@
         executor);
   }
 
-  private static <C, V extends C> void provideValueAndCloser(
+  private static <C extends @Nullable Object, V extends C> void provideValueAndCloser(
       ValueAndCloserConsumer<C> consumer, ClosingFuture<V> closingFuture) {
     consumer.accept(new ValueAndCloser<C>(closingFuture));
   }
@@ -1054,7 +1134,7 @@
     closeables.close();
   }
 
-  private <U> ClosingFuture<U> derive(FluentFuture<U> future) {
+  private <U extends @Nullable Object> ClosingFuture<U> derive(FluentFuture<U> future) {
     ClosingFuture<U> derived = new ClosingFuture<>(future);
     becomeSubsumedInto(derived.closeables);
     return derived;
@@ -1090,6 +1170,7 @@
      *     CombiningCallable#call(DeferredCloser, Peeker)} or {@link
      *     AsyncCombiningCallable#call(DeferredCloser, Peeker)}
      */
+    @ParametricNullness
     public final <D extends @Nullable Object> D getDone(ClosingFuture<D> closingFuture)
         throws ExecutionException {
       checkState(beingCalled);
@@ -1097,6 +1178,7 @@
       return Futures.getDone(closingFuture.future);
     }
 
+    @ParametricNullness
     private <V extends @Nullable Object> V call(
         CombiningCallable<V> combiner, CloseableList closeables) throws Exception {
       beingCalled = true;
@@ -1171,6 +1253,7 @@
        *
        * @param peeker used to get the value of any of the input futures
        */
+      @ParametricNullness
       V call(DeferredCloser closer, Peeker peeker) throws Exception;
     }
 
@@ -1219,11 +1302,12 @@
      * <p>If the combiningCallable throws an {@code ExecutionException}, the cause of the thrown
      * {@code ExecutionException} will be extracted and used as the failure of the derived step.
      */
-    public <V> ClosingFuture<V> call(
+    public <V extends @Nullable Object> ClosingFuture<V> call(
         final CombiningCallable<V> combiningCallable, Executor executor) {
       Callable<V> callable =
           new Callable<V>() {
             @Override
+            @ParametricNullness
             public V call() throws Exception {
               return new Peeker(inputs).call(combiningCallable, closeables);
             }
@@ -1275,7 +1359,7 @@
      * <p>The same warnings about doing heavyweight operations within {@link
      * ClosingFuture#transformAsync(AsyncClosingFunction, Executor)} apply here.
      */
-    public <V> ClosingFuture<V> callAsync(
+    public <V extends @Nullable Object> ClosingFuture<V> callAsync(
         final AsyncCombiningCallable<V> combiningCallable, Executor executor) {
       AsyncCallable<V> asyncCallable =
           new AsyncCallable<V>() {
@@ -1295,7 +1379,7 @@
       return derived;
     }
 
-    private FutureCombiner<Object> futureCombiner() {
+    private FutureCombiner<@Nullable Object> futureCombiner() {
       return allMustSucceed
           ? Futures.whenAllSucceed(inputFutures())
           : Futures.whenAllComplete(inputFutures());
@@ -1345,7 +1429,9 @@
        * is done (but not before this method completes), even if this method throws or the pipeline
        * is cancelled.
        */
-      U apply(DeferredCloser closer, V1 value1, V2 value2) throws Exception;
+      @ParametricNullness
+      U apply(DeferredCloser closer, @ParametricNullness V1 value1, @ParametricNullness V2 value2)
+          throws Exception;
     }
 
     /**
@@ -1368,7 +1454,9 @@
        * is done (but not before this method completes), even if this method throws or the pipeline
        * is cancelled.
        */
-      ClosingFuture<U> apply(DeferredCloser closer, V1 value1, V2 value2) throws Exception;
+      ClosingFuture<U> apply(
+          DeferredCloser closer, @ParametricNullness V1 value1, @ParametricNullness V2 value2)
+          throws Exception;
     }
 
     private final ClosingFuture<V1> future1;
@@ -1398,6 +1486,7 @@
       return call(
           new CombiningCallable<U>() {
             @Override
+            @ParametricNullness
             public U call(DeferredCloser closer, Peeker peeker) throws Exception {
               return function.apply(closer, peeker.getDone(future1), peeker.getDone(future2));
             }
@@ -1499,7 +1588,13 @@
        * is done (but not before this method completes), even if this method throws or the pipeline
        * is cancelled.
        */
-      U apply(DeferredCloser closer, V1 value1, V2 value2, V3 v3) throws Exception;
+      @ParametricNullness
+      U apply(
+          DeferredCloser closer,
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3)
+          throws Exception;
     }
 
     /**
@@ -1525,7 +1620,11 @@
        * is done (but not before this method completes), even if this method throws or the pipeline
        * is cancelled.
        */
-      ClosingFuture<U> apply(DeferredCloser closer, V1 value1, V2 value2, V3 value3)
+      ClosingFuture<U> apply(
+          DeferredCloser closer,
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3)
           throws Exception;
     }
 
@@ -1559,6 +1658,7 @@
       return call(
           new CombiningCallable<U>() {
             @Override
+            @ParametricNullness
             public U call(DeferredCloser closer, Peeker peeker) throws Exception {
               return function.apply(
                   closer,
@@ -1674,7 +1774,14 @@
        * is done (but not before this method completes), even if this method throws or the pipeline
        * is cancelled.
        */
-      U apply(DeferredCloser closer, V1 value1, V2 value2, V3 value3, V4 value4) throws Exception;
+      @ParametricNullness
+      U apply(
+          DeferredCloser closer,
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3,
+          @ParametricNullness V4 value4)
+          throws Exception;
     }
 
     /**
@@ -1703,7 +1810,12 @@
        * is done (but not before this method completes), even if this method throws or the pipeline
        * is cancelled.
        */
-      ClosingFuture<U> apply(DeferredCloser closer, V1 value1, V2 value2, V3 value3, V4 value4)
+      ClosingFuture<U> apply(
+          DeferredCloser closer,
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3,
+          @ParametricNullness V4 value4)
           throws Exception;
     }
 
@@ -1742,6 +1854,7 @@
       return call(
           new CombiningCallable<U>() {
             @Override
+            @ParametricNullness
             public U call(DeferredCloser closer, Peeker peeker) throws Exception {
               return function.apply(
                   closer,
@@ -1864,7 +1977,14 @@
        * is done (but not before this method completes), even if this method throws or the pipeline
        * is cancelled.
        */
-      U apply(DeferredCloser closer, V1 value1, V2 value2, V3 value3, V4 value4, V5 value5)
+      @ParametricNullness
+      U apply(
+          DeferredCloser closer,
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3,
+          @ParametricNullness V4 value4,
+          @ParametricNullness V5 value5)
           throws Exception;
     }
 
@@ -1897,7 +2017,12 @@
        * is cancelled.
        */
       ClosingFuture<U> apply(
-          DeferredCloser closer, V1 value1, V2 value2, V3 value3, V4 value4, V5 value5)
+          DeferredCloser closer,
+          @ParametricNullness V1 value1,
+          @ParametricNullness V2 value2,
+          @ParametricNullness V3 value3,
+          @ParametricNullness V4 value4,
+          @ParametricNullness V5 value5)
           throws Exception;
     }
 
@@ -1940,6 +2065,7 @@
       return call(
           new CombiningCallable<U>() {
             @Override
+            @ParametricNullness
             public U call(DeferredCloser closer, Peeker peeker) throws Exception {
               return function.apply(
                   closer,
@@ -2033,7 +2159,7 @@
     }
   }
 
-  private static void closeQuietly(final AutoCloseable closeable, Executor executor) {
+  private static void closeQuietly(@CheckForNull final AutoCloseable closeable, Executor executor) {
     if (closeable == null) {
       return;
     }
@@ -2075,10 +2201,12 @@
       implements Closeable {
     private final DeferredCloser closer = new DeferredCloser(this);
     private volatile boolean closed;
-    private volatile CountDownLatch whenClosed;
+    @CheckForNull private volatile CountDownLatch whenClosed;
 
-    <V, U> ListenableFuture<U> applyClosingFunction(
-        ClosingFunction<? super V, U> transformation, V input) throws Exception {
+    <V extends @Nullable Object, U extends @Nullable Object>
+        ListenableFuture<U> applyClosingFunction(
+            ClosingFunction<? super V, U> transformation, @ParametricNullness V input)
+            throws Exception {
       // TODO(dpb): Consider ways to defer closing without creating a separate CloseableList.
       CloseableList newCloseables = new CloseableList();
       try {
@@ -2088,8 +2216,10 @@
       }
     }
 
-    <V, U> FluentFuture<U> applyAsyncClosingFunction(
-        AsyncClosingFunction<V, U> transformation, V input) throws Exception {
+    <V extends @Nullable Object, U extends @Nullable Object>
+        FluentFuture<U> applyAsyncClosingFunction(
+            AsyncClosingFunction<V, U> transformation, @ParametricNullness V input)
+            throws Exception {
       // TODO(dpb): Consider ways to defer closing without creating a separate CloseableList.
       CloseableList newCloseables = new CloseableList();
       try {
@@ -2121,7 +2251,7 @@
       }
     }
 
-    void add(@Nullable AutoCloseable closeable, Executor executor) {
+    void add(@CheckForNull AutoCloseable closeable, Executor executor) {
       checkNotNull(executor);
       if (closeable == null) {
         return;
diff --git a/guava/src/com/google/common/util/concurrent/CollectionFuture.java b/guava/src/com/google/common/util/concurrent/CollectionFuture.java
index 9f0aa64..c106c15 100644
--- a/guava/src/com/google/common/util/concurrent/CollectionFuture.java
+++ b/guava/src/com/google/common/util/concurrent/CollectionFuture.java
@@ -19,32 +19,34 @@
 
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.Future;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Aggregate future that collects (stores) results of each future. */
 @GwtCompatible(emulated = true)
-abstract class CollectionFuture<V, C> extends AggregateFuture<V, C> {
+@ElementTypesAreNonnullByDefault
+abstract class CollectionFuture<V extends @Nullable Object, C extends @Nullable Object>
+    extends AggregateFuture<V, C> {
   /*
    * We access this field racily but safely. For discussion of a similar situation, see the comments
    * on the fields of TimeoutFuture. This field is slightly different than the fields discussed
    * there: cancel() never reads this field, only writes to it. That makes the race here completely
    * harmless, rather than just 99.99% harmless.
    */
-  private List<Present<V>> values;
+  @CheckForNull private List<@Nullable Present<V>> values;
 
   CollectionFuture(
       ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
       boolean allMustSucceed) {
     super(futures, allMustSucceed, true);
 
-    List<Present<V>> values =
+    List<@Nullable Present<V>> values =
         futures.isEmpty()
-            ? ImmutableList.<Present<V>>of()
-            : Lists.<Present<V>>newArrayListWithCapacity(futures.size());
+            ? Collections.<@Nullable Present<V>>emptyList()
+            : Lists.<@Nullable Present<V>>newArrayListWithCapacity(futures.size());
 
     // Populate the results list with null initially.
     for (int i = 0; i < futures.size(); ++i) {
@@ -55,8 +57,8 @@
   }
 
   @Override
-  final void collectOneValue(int index, @Nullable V returnValue) {
-    List<Present<V>> localValues = values;
+  final void collectOneValue(int index, @ParametricNullness V returnValue) {
+    List<@Nullable Present<V>> localValues = values;
     if (localValues != null) {
       localValues.set(index, new Present<>(returnValue));
     }
@@ -64,7 +66,7 @@
 
   @Override
   final void handleAllCompleted() {
-    List<Present<V>> localValues = values;
+    List<@Nullable Present<V>> localValues = values;
     if (localValues != null) {
       set(combine(localValues));
     }
@@ -76,10 +78,11 @@
     this.values = null;
   }
 
-  abstract C combine(List<Present<V>> values);
+  abstract C combine(List<@Nullable Present<V>> values);
 
   /** Used for {@link Futures#allAsList} and {@link Futures#successfulAsList}. */
-  static final class ListFuture<V> extends CollectionFuture<V, List<V>> {
+  static final class ListFuture<V extends @Nullable Object>
+      extends CollectionFuture<V, List<@Nullable V>> {
     ListFuture(
         ImmutableCollection<? extends ListenableFuture<? extends V>> futures,
         boolean allMustSucceed) {
@@ -88,8 +91,8 @@
     }
 
     @Override
-    public List<V> combine(List<Present<V>> values) {
-      List<V> result = newArrayListWithCapacity(values.size());
+    public List<@Nullable V> combine(List<@Nullable Present<V>> values) {
+      List<@Nullable V> result = newArrayListWithCapacity(values.size());
       for (Present<V> element : values) {
         result.add(element != null ? element.value : null);
       }
@@ -98,7 +101,7 @@
   }
 
   /** The result of a successful {@code Future}. */
-  private static final class Present<V> {
+  private static final class Present<V extends @Nullable Object> {
     V value;
 
     Present(V value) {
diff --git a/guava/src/com/google/common/util/concurrent/CombinedFuture.java b/guava/src/com/google/common/util/concurrent/CombinedFuture.java
index b8b0e2c..c222111 100644
--- a/guava/src/com/google/common/util/concurrent/CombinedFuture.java
+++ b/guava/src/com/google/common/util/concurrent/CombinedFuture.java
@@ -25,12 +25,15 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
 import java.util.concurrent.RejectedExecutionException;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Aggregate future that computes its value by calling a callable. */
 @GwtCompatible
-final class CombinedFuture<V> extends AggregateFuture<Object, V> {
-  private CombinedFutureInterruptibleTask<?> task;
+@ElementTypesAreNonnullByDefault
+final class CombinedFuture<V extends @Nullable Object>
+    extends AggregateFuture<@Nullable Object, V> {
+  @CheckForNull private CombinedFutureInterruptibleTask<?> task;
 
   CombinedFuture(
       ImmutableCollection<? extends ListenableFuture<?>> futures,
@@ -53,7 +56,7 @@
   }
 
   @Override
-  void collectOneValue(int index, @Nullable Object returnValue) {}
+  void collectOneValue(int index, @CheckForNull Object returnValue) {}
 
   @Override
   void handleAllCompleted() {
@@ -87,7 +90,8 @@
   }
 
   @WeakOuter
-  private abstract class CombinedFutureInterruptibleTask<T> extends InterruptibleTask<T> {
+  private abstract class CombinedFutureInterruptibleTask<T extends @Nullable Object>
+      extends InterruptibleTask<T> {
     private final Executor listenerExecutor;
 
     CombinedFutureInterruptibleTask(Executor listenerExecutor) {
@@ -108,7 +112,7 @@
     }
 
     @Override
-    final void afterRanInterruptibly(T result, Throwable error) {
+    final void afterRanInterruptiblySuccess(@ParametricNullness T result) {
       /*
        * The future no longer needs to interrupt this task, so it no longer needs a reference to it.
        *
@@ -122,20 +126,28 @@
        */
       CombinedFuture.this.task = null;
 
-      if (error != null) {
-        if (error instanceof ExecutionException) {
-          CombinedFuture.this.setException(error.getCause());
-        } else if (error instanceof CancellationException) {
-          cancel(false);
-        } else {
-          CombinedFuture.this.setException(error);
-        }
+      setValue(result);
+    }
+
+    @Override
+    final void afterRanInterruptiblyFailure(Throwable error) {
+      // See afterRanInterruptiblySuccess.
+      CombinedFuture.this.task = null;
+
+      if (error instanceof ExecutionException) {
+        /*
+         * Cast to ExecutionException to satisfy our nullness checker, which (unsoundly but
+         * *usually* safely) assumes that getCause() returns non-null on an ExecutionException.
+         */
+        CombinedFuture.this.setException(((ExecutionException) error).getCause());
+      } else if (error instanceof CancellationException) {
+        cancel(false);
       } else {
-        setValue(result);
+        CombinedFuture.this.setException(error);
       }
     }
 
-    abstract void setValue(T value);
+    abstract void setValue(@ParametricNullness T value);
   }
 
   @WeakOuter
@@ -179,12 +191,13 @@
     }
 
     @Override
+    @ParametricNullness
     V runInterruptibly() throws Exception {
       return callable.call();
     }
 
     @Override
-    void setValue(V value) {
+    void setValue(@ParametricNullness V value) {
       CombinedFuture.this.set(value);
     }
 
diff --git a/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java b/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
index 67d2478..b6b161d 100644
--- a/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
+++ b/guava/src/com/google/common/util/concurrent/CycleDetectingLockFactory.java
@@ -15,6 +15,7 @@
 package com.google.common.util.concurrent;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
@@ -42,7 +43,7 @@
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * The {@code CycleDetectingLockFactory} creates {@link ReentrantLock} instances and {@link
@@ -162,6 +163,7 @@
 @Beta
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public class CycleDetectingLockFactory {
 
   /**
@@ -268,7 +270,8 @@
   }
 
   // A static mapping from an Enum type to its set of LockGraphNodes.
-  private static final ConcurrentMap<Class<? extends Enum>, Map<? extends Enum, LockGraphNode>>
+  private static final ConcurrentMap<
+          Class<? extends Enum<?>>, Map<? extends Enum<?>, LockGraphNode>>
       lockGraphNodesPerType = new MapMaker().weakKeys().makeMap();
 
   /** Creates a {@code CycleDetectingLockFactory.WithExplicitOrdering<E>}. */
@@ -283,13 +286,15 @@
     return new WithExplicitOrdering<E>(policy, lockGraphNodes);
   }
 
-  private static Map<? extends Enum, LockGraphNode> getOrCreateNodes(Class<? extends Enum> clazz) {
-    Map<? extends Enum, LockGraphNode> existing = lockGraphNodesPerType.get(clazz);
+  @SuppressWarnings("unchecked")
+  private static <E extends Enum<E>> Map<? extends E, LockGraphNode> getOrCreateNodes(
+      Class<E> clazz) {
+    Map<E, LockGraphNode> existing = (Map<E, LockGraphNode>) lockGraphNodesPerType.get(clazz);
     if (existing != null) {
       return existing;
     }
-    Map<? extends Enum, LockGraphNode> created = createNodes(clazz);
-    existing = lockGraphNodesPerType.putIfAbsent(clazz, created);
+    Map<E, LockGraphNode> created = createNodes(clazz);
+    existing = (Map<E, LockGraphNode>) lockGraphNodesPerType.putIfAbsent(clazz, created);
     return MoreObjects.firstNonNull(existing, created);
   }
 
@@ -417,7 +422,9 @@
     public ReentrantLock newReentrantLock(E rank, boolean fair) {
       return policy == Policies.DISABLED
           ? new ReentrantLock(fair)
-          : new CycleDetectingReentrantLock(lockGraphNodes.get(rank), fair);
+          // requireNonNull is safe because createNodes inserts an entry for every E.
+          // (If the caller passes `null` for the `rank` parameter, this will throw, but that's OK.)
+          : new CycleDetectingReentrantLock(requireNonNull(lockGraphNodes.get(rank)), fair);
     }
 
     /** Equivalent to {@code newReentrantReadWriteLock(rank, false)}. */
@@ -436,7 +443,10 @@
     public ReentrantReadWriteLock newReentrantReadWriteLock(E rank, boolean fair) {
       return policy == Policies.DISABLED
           ? new ReentrantReadWriteLock(fair)
-          : new CycleDetectingReentrantReadWriteLock(lockGraphNodes.get(rank), fair);
+          // requireNonNull is safe because createNodes inserts an entry for every E.
+          // (If the caller passes `null` for the `rank` parameter, this will throw, but that's OK.)
+          : new CycleDetectingReentrantReadWriteLock(
+              requireNonNull(lockGraphNodes.get(rank)), fair);
     }
   }
 
@@ -546,7 +556,8 @@
      */
     @Override
     public String getMessage() {
-      StringBuilder message = new StringBuilder(super.getMessage());
+      // requireNonNull is safe because ExampleStackTrace sets a non-null message.
+      StringBuilder message = new StringBuilder(requireNonNull(super.getMessage()));
       for (Throwable t = conflictingStackTrace; t != null; t = t.getCause()) {
         message.append(", ").append(t.getMessage());
       }
@@ -599,8 +610,8 @@
     }
 
     void checkAcquiredLocks(Policy policy, List<LockGraphNode> acquiredLocks) {
-      for (int i = 0, size = acquiredLocks.size(); i < size; i++) {
-        checkAcquiredLock(policy, acquiredLocks.get(i));
+      for (LockGraphNode acquiredLock : acquiredLocks) {
+        checkAcquiredLock(policy, acquiredLock);
       }
     }
 
@@ -674,7 +685,8 @@
      * @return If a path was found, a chained {@link ExampleStackTrace} illustrating the path to the
      *     {@code lock}, or {@code null} if no path was found.
      */
-    private @Nullable ExampleStackTrace findPathTo(LockGraphNode node, Set<LockGraphNode> seen) {
+    @CheckForNull
+    private ExampleStackTrace findPathTo(LockGraphNode node, Set<LockGraphNode> seen) {
       if (!seen.add(this)) {
         return null; // Already traversed this node.
       }
diff --git a/guava/src/com/google/common/util/concurrent/DirectExecutor.java b/guava/src/com/google/common/util/concurrent/DirectExecutor.java
index 3022971..0c3a46b 100644
--- a/guava/src/com/google/common/util/concurrent/DirectExecutor.java
+++ b/guava/src/com/google/common/util/concurrent/DirectExecutor.java
@@ -22,6 +22,7 @@
  * execute}.
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 enum DirectExecutor implements Executor {
   INSTANCE;
 
diff --git a/guava/src/com/google/common/util/concurrent/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/util/concurrent/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..3487125
--- /dev/null
+++ b/guava/src/com/google/common/util/concurrent/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.util.concurrent;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/util/concurrent/ExecutionError.java b/guava/src/com/google/common/util/concurrent/ExecutionError.java
index 7663c15..deaff15 100644
--- a/guava/src/com/google/common/util/concurrent/ExecutionError.java
+++ b/guava/src/com/google/common/util/concurrent/ExecutionError.java
@@ -15,7 +15,7 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtCompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * {@link Error} variant of {@link java.util.concurrent.ExecutionException}. As with {@code
@@ -28,22 +28,29 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class ExecutionError extends Error {
+  /*
+   * Ideally, this class would have exposed only constructors that require a non-null cause. We
+   * might try to move in that direction, but there are complications. See
+   * https://github.com/jspecify/nullness-checker-for-checker-framework/blob/61aafa4ae52594830cfc2d61c8b113009dbdb045/src/main/java/com/google/jspecify/nullness/NullSpecTransfer.java#L789
+   */
+
   /** Creates a new instance with {@code null} as its detail message. */
   protected ExecutionError() {}
 
   /** Creates a new instance with the given detail message. */
-  protected ExecutionError(@Nullable String message) {
+  protected ExecutionError(@CheckForNull String message) {
     super(message);
   }
 
   /** Creates a new instance with the given detail message and cause. */
-  public ExecutionError(@Nullable String message, @Nullable Error cause) {
+  public ExecutionError(@CheckForNull String message, @CheckForNull Error cause) {
     super(message, cause);
   }
 
   /** Creates a new instance with the given cause. */
-  public ExecutionError(@Nullable Error cause) {
+  public ExecutionError(@CheckForNull Error cause) {
     super(cause);
   }
 
diff --git a/guava/src/com/google/common/util/concurrent/ExecutionList.java b/guava/src/com/google/common/util/concurrent/ExecutionList.java
index 1ff609b..96fc51c 100644
--- a/guava/src/com/google/common/util/concurrent/ExecutionList.java
+++ b/guava/src/com/google/common/util/concurrent/ExecutionList.java
@@ -21,7 +21,7 @@
 import java.util.concurrent.Executor;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A support class for {@code ListenableFuture} implementations to manage their listeners. An
@@ -40,6 +40,7 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ExecutionList {
   /** Logger to log exceptions caught when running runnables. */
   private static final Logger log = Logger.getLogger(ExecutionList.class.getName());
@@ -49,7 +50,8 @@
    * RunnableExecutorPair#next} field.
    */
   @GuardedBy("this")
-  private @Nullable RunnableExecutorPair runnables;
+  @CheckForNull
+  private RunnableExecutorPair runnables;
 
   @GuardedBy("this")
   private boolean executed;
@@ -153,9 +155,10 @@
   private static final class RunnableExecutorPair {
     final Runnable runnable;
     final Executor executor;
-    @Nullable RunnableExecutorPair next;
+    @CheckForNull RunnableExecutorPair next;
 
-    RunnableExecutorPair(Runnable runnable, Executor executor, RunnableExecutorPair next) {
+    RunnableExecutorPair(
+        Runnable runnable, Executor executor, @CheckForNull RunnableExecutorPair next) {
       this.runnable = runnable;
       this.executor = executor;
       this.next = next;
diff --git a/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java b/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
index f589e08..148f50b 100644
--- a/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
+++ b/guava/src/com/google/common/util/concurrent/ExecutionSequencer.java
@@ -23,11 +23,14 @@
 import static com.google.common.util.concurrent.Futures.immediateFuture;
 import static com.google.common.util.concurrent.Futures.immediateVoidFuture;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicReference;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Serializes execution of tasks, somewhat like an "asynchronous {@code synchronized} block." Each
@@ -78,6 +81,7 @@
  * @since 26.0
  */
 @Beta
+@ElementTypesAreNonnullByDefault
 public final class ExecutionSequencer {
 
   private ExecutionSequencer() {}
@@ -88,7 +92,7 @@
   }
 
   /** This reference acts as a pointer tracking the head of a linked list of ListenableFutures. */
-  private final AtomicReference<ListenableFuture<Void>> ref =
+  private final AtomicReference<ListenableFuture<@Nullable Void>> ref =
       new AtomicReference<>(immediateVoidFuture());
 
   private ThreadConfinedTaskQueue latestTaskQueue = new ThreadConfinedTaskQueue();
@@ -122,11 +126,11 @@
      * All the states where thread != currentThread are identical for our purposes, and so even
      * though it's racy, we don't care which of those values we get, so no need to synchronize.
      */
-    Thread thread;
+    @CheckForNull Thread thread;
     /** Only used by the thread associated with this object */
-    Runnable nextTask;
+    @CheckForNull Runnable nextTask;
     /** Only used by the thread associated with this object */
-    Executor nextExecutor;
+    @CheckForNull Executor nextExecutor;
   }
 
   /**
@@ -136,7 +140,8 @@
    * execute, but if the output future is cancelled before {@link Callable#call()} is invoked,
    * {@link Callable#call()} will not be invoked.
    */
-  public <T> ListenableFuture<T> submit(final Callable<T> callable, Executor executor) {
+  public <T extends @Nullable Object> ListenableFuture<T> submit(
+      final Callable<T> callable, Executor executor) {
     checkNotNull(callable);
     checkNotNull(executor);
     return submitAsync(
@@ -161,7 +166,7 @@
    * callable} or a callable that has begun to execute, but if the output future is cancelled before
    * {@link AsyncCallable#call()} is invoked, {@link AsyncCallable#call()} will not be invoked.
    */
-  public <T> ListenableFuture<T> submitAsync(
+  public <T extends @Nullable Object> ListenableFuture<T> submitAsync(
       final AsyncCallable<T> callable, final Executor executor) {
     checkNotNull(callable);
     checkNotNull(executor);
@@ -192,9 +197,9 @@
      * have completed - namely after oldFuture is done, and taskFuture has either completed or been
      * cancelled before the callable started execution.
      */
-    final SettableFuture<Void> newFuture = SettableFuture.create();
+    final SettableFuture<@Nullable Void> newFuture = SettableFuture.create();
 
-    final ListenableFuture<Void> oldFuture = ref.getAndSet(newFuture);
+    final ListenableFuture<@Nullable Void> oldFuture = ref.getAndSet(newFuture);
 
     // Invoke our task once the previous future completes.
     final TrustedListenableFutureTask<T> taskFuture = TrustedListenableFutureTask.create(task);
@@ -279,7 +284,6 @@
    * properties; for example, calling WeakReference.get() on Android will block during an
    * otherwise-concurrent GC cycle.
    */
-  @SuppressWarnings("ShouldNotSubclass") // Saving an allocation here is worth it
   private static final class TaskNonReentrantExecutor extends AtomicReference<RunningState>
       implements Executor, Runnable {
 
@@ -287,22 +291,22 @@
      * Used to update and read the latestTaskQueue field. Set to null once the runnable has been run
      * or queued.
      */
-    ExecutionSequencer sequencer;
+    @CheckForNull ExecutionSequencer sequencer;
 
     /**
      * Executor the task was set to run on. Set to null when the task has been queued, run, or
      * cancelled.
      */
-    Executor delegate;
+    @CheckForNull Executor delegate;
 
     /**
      * Set before calling delegate.execute(); set to null once run, so that it can be GCed; this
      * object may live on after, if submitAsync returns an incomplete future.
      */
-    Runnable task;
+    @CheckForNull Runnable task;
 
     /** Thread that called execute(). Set in execute, cleared when delegate.execute() returns. */
-    Thread submitting;
+    @CheckForNull Thread submitting;
 
     private TaskNonReentrantExecutor(Executor delegate, ExecutionSequencer sequencer) {
       super(NOT_RUN);
@@ -327,8 +331,18 @@
         return;
       }
       submitting = Thread.currentThread();
+
       try {
-        ThreadConfinedTaskQueue submittingTaskQueue = sequencer.latestTaskQueue;
+        /*
+         * requireNonNull is safe because we don't null out `sequencer` except:
+         *
+         * - above, where we return (in which case we never get here)
+         *
+         * - in `run`, which can't run until this Runnable is submitted to an executor, which
+         *   doesn't happen until below. (And this Executor -- yes, the object is both a Runnable
+         *   and an Executor -- is used for only a single `execute` call.)
+         */
+        ThreadConfinedTaskQueue submittingTaskQueue = requireNonNull(sequencer).latestTaskQueue;
         if (submittingTaskQueue.thread == submitting) {
           sequencer = null;
           // Submit from inside a reentrant submit. We don't know if this one will be reentrant (and
@@ -337,10 +351,12 @@
           // execution.
           checkState(submittingTaskQueue.nextTask == null);
           submittingTaskQueue.nextTask = task;
-          submittingTaskQueue.nextExecutor = delegate;
+          // requireNonNull(delegate) is safe for reasons similar to requireNonNull(sequencer).
+          submittingTaskQueue.nextExecutor = requireNonNull(delegate);
           delegate = null;
         } else {
-          Executor localDelegate = delegate;
+          // requireNonNull(delegate) is safe for reasons similar to requireNonNull(sequencer).
+          Executor localDelegate = requireNonNull(delegate);
           delegate = null;
           this.task = task;
           localDelegate.execute(this);
@@ -359,7 +375,11 @@
     public void run() {
       Thread currentThread = Thread.currentThread();
       if (currentThread != submitting) {
-        Runnable localTask = task;
+        /*
+         * requireNonNull is safe because we set `task` before submitting this Runnable to an
+         * Executor, and we don't null it out until here.
+         */
+        Runnable localTask = requireNonNull(task);
         task = null;
         localTask.run();
         return;
@@ -369,6 +389,18 @@
       // latestTaskQueue, and queue rather than calling execute() directly.
       ThreadConfinedTaskQueue executingTaskQueue = new ThreadConfinedTaskQueue();
       executingTaskQueue.thread = currentThread;
+      /*
+       * requireNonNull is safe because we don't null out `sequencer` except:
+       *
+       * - after the requireNonNull call below. (And this object has its Runnable.run override
+       *   called only once, just as it has its Executor.execute override called only once.)
+       *
+       * - if we return immediately from `execute` (in which case we never get here)
+       *
+       * - in the "reentrant submit" case of `execute` (in which case we must have started running a
+       *   user task -- which means that we already got past this code (or else we exited early
+       *   above))
+       */
       // Unconditionally set; there is no risk of throwing away a queued task from another thread,
       // because in order for the current task to run on this executor the previous task must have
       // already started execution. Because each task on a TaskNonReentrantExecutor can only produce
@@ -378,10 +410,11 @@
       // otherwise have another task queued on to it. Note the exception to this, cancellation, is
       // specially handled in execute() - execute() calls triggered by cancellation are no-ops, and
       // thus don't count.
-      sequencer.latestTaskQueue = executingTaskQueue;
+      requireNonNull(sequencer).latestTaskQueue = executingTaskQueue;
       sequencer = null;
       try {
-        Runnable localTask = task;
+        // requireNonNull is safe, as discussed above.
+        Runnable localTask = requireNonNull(task);
         task = null;
         localTask.run();
         // Now check if our task attempted to reentrantly execute the next task.
diff --git a/guava/src/com/google/common/util/concurrent/FakeTimeLimiter.java b/guava/src/com/google/common/util/concurrent/FakeTimeLimiter.java
index 9dad51b..ddc9440 100644
--- a/guava/src/com/google/common/util/concurrent/FakeTimeLimiter.java
+++ b/guava/src/com/google/common/util/concurrent/FakeTimeLimiter.java
@@ -22,6 +22,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A TimeLimiter implementation which actually does not attempt to limit time at all. This may be
@@ -36,6 +37,7 @@
 @Beta
 @CanIgnoreReturnValue
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class FakeTimeLimiter implements TimeLimiter {
   @Override
   public <T> T newProxy(
@@ -47,8 +49,9 @@
   }
 
   @Override
-  public <T> T callWithTimeout(Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
-      throws ExecutionException {
+  @ParametricNullness
+  public <T extends @Nullable Object> T callWithTimeout(
+      Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit) throws ExecutionException {
     checkNotNull(callable);
     checkNotNull(timeoutUnit);
     try {
@@ -67,7 +70,8 @@
   }
 
   @Override
-  public <T> T callUninterruptiblyWithTimeout(
+  @ParametricNullness
+  public <T extends @Nullable Object> T callUninterruptiblyWithTimeout(
       Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit) throws ExecutionException {
     return callWithTimeout(callable, timeoutDuration, timeoutUnit);
   }
diff --git a/guava/src/com/google/common/util/concurrent/FluentFuture.java b/guava/src/com/google/common/util/concurrent/FluentFuture.java
index 88696ea..4320b78 100644
--- a/guava/src/com/google/common/util/concurrent/FluentFuture.java
+++ b/guava/src/com/google/common/util/concurrent/FluentFuture.java
@@ -29,6 +29,7 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link ListenableFuture} that supports fluent chains of operations. For example:
@@ -74,22 +75,26 @@
 @Beta
 @DoNotMock("Use FluentFuture.from(Futures.immediate*Future) or SettableFuture")
 @GwtCompatible(emulated = true)
-public abstract class FluentFuture<V> extends GwtFluentFutureCatchingSpecialization<V> {
+@ElementTypesAreNonnullByDefault
+public abstract class FluentFuture<V extends @Nullable Object>
+    extends GwtFluentFutureCatchingSpecialization<V> {
 
   /**
    * A less abstract subclass of AbstractFuture. This can be used to optimize setFuture by ensuring
    * that {@link #get} calls exactly the implementation of {@link AbstractFuture#get}.
    */
-  abstract static class TrustedFuture<V> extends FluentFuture<V>
+  abstract static class TrustedFuture<V extends @Nullable Object> extends FluentFuture<V>
       implements AbstractFuture.Trusted<V> {
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public final V get() throws InterruptedException, ExecutionException {
       return super.get();
     }
 
     @CanIgnoreReturnValue
     @Override
+    @ParametricNullness
     public final V get(long timeout, TimeUnit unit)
         throws InterruptedException, ExecutionException, TimeoutException {
       return super.get(timeout, unit);
@@ -126,7 +131,7 @@
    * directly. If not, it is wrapped in a {@code FluentFuture} that delegates all calls to the
    * original {@code ListenableFuture}.
    */
-  public static <V> FluentFuture<V> from(ListenableFuture<V> future) {
+  public static <V extends @Nullable Object> FluentFuture<V> from(ListenableFuture<V> future) {
     return future instanceof FluentFuture
         ? (FluentFuture<V>) future
         : new ForwardingFluentFuture<V>(future);
@@ -139,7 +144,7 @@
    * @since 28.0
    */
   @Deprecated
-  public static <V> FluentFuture<V> from(FluentFuture<V> future) {
+  public static <V extends @Nullable Object> FluentFuture<V> from(FluentFuture<V> future) {
     return checkNotNull(future);
   }
 
@@ -322,7 +327,7 @@
    * @return A future that holds result of the function (if the input succeeded) or the original
    *     input's failure (if not)
    */
-  public final <T> FluentFuture<T> transformAsync(
+  public final <T extends @Nullable Object> FluentFuture<T> transformAsync(
       AsyncFunction<? super V, T> function, Executor executor) {
     return (FluentFuture<T>) Futures.transformAsync(this, function, executor);
   }
@@ -359,7 +364,8 @@
    * @param executor Executor to run the function in.
    * @return A future that holds result of the transformation.
    */
-  public final <T> FluentFuture<T> transform(Function<? super V, T> function, Executor executor) {
+  public final <T extends @Nullable Object> FluentFuture<T> transform(
+      Function<? super V, T> function, Executor executor) {
     return (FluentFuture<T>) Futures.transform(this, function, executor);
   }
 
diff --git a/guava/src/com/google/common/util/concurrent/ForwardingBlockingDeque.java b/guava/src/com/google/common/util/concurrent/ForwardingBlockingDeque.java
index 2485966..d0d72a8 100644
--- a/guava/src/com/google/common/util/concurrent/ForwardingBlockingDeque.java
+++ b/guava/src/com/google/common/util/concurrent/ForwardingBlockingDeque.java
@@ -21,6 +21,7 @@
 import java.util.Collection;
 import java.util.concurrent.BlockingDeque;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link BlockingDeque} which forwards all its method calls to another {@code BlockingDeque}.
@@ -44,6 +45,7 @@
  * @since 21.0 (since 14.0 as {@link com.google.common.collect.ForwardingBlockingDeque})
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingBlockingDeque<E> extends ForwardingDeque<E>
     implements BlockingDeque<E> {
 
@@ -89,11 +91,13 @@
   }
 
   @Override
+  @CheckForNull
   public E pollFirst(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().pollFirst(timeout, unit);
   }
 
   @Override
+  @CheckForNull
   public E pollLast(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().pollLast(timeout, unit);
   }
@@ -114,6 +118,7 @@
   }
 
   @Override
+  @CheckForNull
   public E poll(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().poll(timeout, unit);
   }
diff --git a/guava/src/com/google/common/util/concurrent/ForwardingBlockingQueue.java b/guava/src/com/google/common/util/concurrent/ForwardingBlockingQueue.java
index f5575a1..dc8511d 100644
--- a/guava/src/com/google/common/util/concurrent/ForwardingBlockingQueue.java
+++ b/guava/src/com/google/common/util/concurrent/ForwardingBlockingQueue.java
@@ -20,6 +20,7 @@
 import java.util.Collection;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.TimeUnit;
+import javax.annotation.CheckForNull;
 
 /**
  * A {@link BlockingQueue} which forwards all its method calls to another {@link BlockingQueue}.
@@ -37,6 +38,7 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingBlockingQueue<E> extends ForwardingQueue<E>
     implements BlockingQueue<E> {
 
@@ -62,6 +64,7 @@
   }
 
   @Override
+  @CheckForNull
   public E poll(long timeout, TimeUnit unit) throws InterruptedException {
     return delegate().poll(timeout, unit);
   }
diff --git a/guava/src/com/google/common/util/concurrent/ForwardingCondition.java b/guava/src/com/google/common/util/concurrent/ForwardingCondition.java
index 62c4d4c..d17f98c 100644
--- a/guava/src/com/google/common/util/concurrent/ForwardingCondition.java
+++ b/guava/src/com/google/common/util/concurrent/ForwardingCondition.java
@@ -19,6 +19,7 @@
 import java.util.concurrent.locks.Condition;
 
 /** Forwarding wrapper around a {@code Condition}. */
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingCondition implements Condition {
   abstract Condition delegate();
 
diff --git a/guava/src/com/google/common/util/concurrent/ForwardingExecutorService.java b/guava/src/com/google/common/util/concurrent/ForwardingExecutorService.java
index f9da1d4..ed78b86 100644
--- a/guava/src/com/google/common/util/concurrent/ForwardingExecutorService.java
+++ b/guava/src/com/google/common/util/concurrent/ForwardingExecutorService.java
@@ -25,6 +25,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An executor service which forwards all its method calls to another executor service. Subclasses
@@ -36,6 +37,7 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingExecutorService extends ForwardingObject
     implements ExecutorService {
   /** Constructor for use by subclasses. */
@@ -50,26 +52,27 @@
   }
 
   @Override
-  public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
-      throws InterruptedException {
+  public <T extends @Nullable Object> List<Future<T>> invokeAll(
+      Collection<? extends Callable<T>> tasks) throws InterruptedException {
     return delegate().invokeAll(tasks);
   }
 
   @Override
-  public <T> List<Future<T>> invokeAll(
+  public <T extends @Nullable Object> List<Future<T>> invokeAll(
       Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
       throws InterruptedException {
     return delegate().invokeAll(tasks, timeout, unit);
   }
 
   @Override
-  public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
+  public <T extends @Nullable Object> T invokeAny(Collection<? extends Callable<T>> tasks)
       throws InterruptedException, ExecutionException {
     return delegate().invokeAny(tasks);
   }
 
   @Override
-  public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
+  public <T extends @Nullable Object> T invokeAny(
+      Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
       throws InterruptedException, ExecutionException, TimeoutException {
     return delegate().invokeAny(tasks, timeout, unit);
   }
@@ -100,7 +103,7 @@
   }
 
   @Override
-  public <T> Future<T> submit(Callable<T> task) {
+  public <T extends @Nullable Object> Future<T> submit(Callable<T> task) {
     return delegate().submit(task);
   }
 
@@ -110,7 +113,8 @@
   }
 
   @Override
-  public <T> Future<T> submit(Runnable task, T result) {
+  public <T extends @Nullable Object> Future<T> submit(
+      Runnable task, @ParametricNullness T result) {
     return delegate().submit(task, result);
   }
 }
diff --git a/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java b/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java
index 984fd68..cb779c3 100644
--- a/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ForwardingFluentFuture.java
@@ -21,6 +21,7 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * {@link FluentFuture} that forwards all calls to a delegate.
@@ -33,7 +34,8 @@
  * forwards to that future and adds the desired methods.
  */
 @GwtCompatible
-final class ForwardingFluentFuture<V> extends FluentFuture<V> {
+@ElementTypesAreNonnullByDefault
+final class ForwardingFluentFuture<V extends @Nullable Object> extends FluentFuture<V> {
   private final ListenableFuture<V> delegate;
 
   ForwardingFluentFuture(ListenableFuture<V> delegate) {
@@ -61,11 +63,13 @@
   }
 
   @Override
+  @ParametricNullness
   public V get() throws InterruptedException, ExecutionException {
     return delegate.get();
   }
 
   @Override
+  @ParametricNullness
   public V get(long timeout, TimeUnit unit)
       throws InterruptedException, ExecutionException, TimeoutException {
     return delegate.get(timeout, unit);
diff --git a/guava/src/com/google/common/util/concurrent/ForwardingFuture.java b/guava/src/com/google/common/util/concurrent/ForwardingFuture.java
index 165793b..47002b0 100644
--- a/guava/src/com/google/common/util/concurrent/ForwardingFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ForwardingFuture.java
@@ -22,6 +22,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Future} which forwards all its method calls to another future. Subclasses should
@@ -35,7 +36,9 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtCompatible
-public abstract class ForwardingFuture<V> extends ForwardingObject implements Future<V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingFuture<V extends @Nullable Object> extends ForwardingObject
+    implements Future<V> {
   /** Constructor for use by subclasses. */
   protected ForwardingFuture() {}
 
@@ -58,11 +61,13 @@
   }
 
   @Override
+  @ParametricNullness
   public V get() throws InterruptedException, ExecutionException {
     return delegate().get();
   }
 
   @Override
+  @ParametricNullness
   public V get(long timeout, TimeUnit unit)
       throws InterruptedException, ExecutionException, TimeoutException {
     return delegate().get(timeout, unit);
@@ -75,7 +80,8 @@
    *
    * @since 9.0
    */
-  public abstract static class SimpleForwardingFuture<V> extends ForwardingFuture<V> {
+  public abstract static class SimpleForwardingFuture<V extends @Nullable Object>
+      extends ForwardingFuture<V> {
     private final Future<V> delegate;
 
     protected SimpleForwardingFuture(Future<V> delegate) {
diff --git a/guava/src/com/google/common/util/concurrent/ForwardingListenableFuture.java b/guava/src/com/google/common/util/concurrent/ForwardingListenableFuture.java
index d3ed3c2..3868091 100644
--- a/guava/src/com/google/common/util/concurrent/ForwardingListenableFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ForwardingListenableFuture.java
@@ -18,6 +18,7 @@
 import com.google.common.base.Preconditions;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.concurrent.Executor;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link ListenableFuture} which forwards all its method calls to another future. Subclasses
@@ -31,8 +32,9 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtCompatible
-public abstract class ForwardingListenableFuture<V> extends ForwardingFuture<V>
-    implements ListenableFuture<V> {
+@ElementTypesAreNonnullByDefault
+public abstract class ForwardingListenableFuture<V extends @Nullable Object>
+    extends ForwardingFuture<V> implements ListenableFuture<V> {
 
   /** Constructor for use by subclasses. */
   protected ForwardingListenableFuture() {}
@@ -52,7 +54,7 @@
    *
    * @since 9.0
    */
-  public abstract static class SimpleForwardingListenableFuture<V>
+  public abstract static class SimpleForwardingListenableFuture<V extends @Nullable Object>
       extends ForwardingListenableFuture<V> {
     private final ListenableFuture<V> delegate;
 
diff --git a/guava/src/com/google/common/util/concurrent/ForwardingListeningExecutorService.java b/guava/src/com/google/common/util/concurrent/ForwardingListeningExecutorService.java
index 48a49b8..fe25b86 100644
--- a/guava/src/com/google/common/util/concurrent/ForwardingListeningExecutorService.java
+++ b/guava/src/com/google/common/util/concurrent/ForwardingListeningExecutorService.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import java.util.concurrent.Callable;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A listening executor service which forwards all its method calls to another listening executor
@@ -29,6 +30,7 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class ForwardingListeningExecutorService extends ForwardingExecutorService
     implements ListeningExecutorService {
   /** Constructor for use by subclasses. */
@@ -38,7 +40,7 @@
   protected abstract ListeningExecutorService delegate();
 
   @Override
-  public <T> ListenableFuture<T> submit(Callable<T> task) {
+  public <T extends @Nullable Object> ListenableFuture<T> submit(Callable<T> task) {
     return delegate().submit(task);
   }
 
@@ -48,7 +50,8 @@
   }
 
   @Override
-  public <T> ListenableFuture<T> submit(Runnable task, T result) {
+  public <T extends @Nullable Object> ListenableFuture<T> submit(
+      Runnable task, @ParametricNullness T result) {
     return delegate().submit(task, result);
   }
 }
diff --git a/guava/src/com/google/common/util/concurrent/ForwardingLock.java b/guava/src/com/google/common/util/concurrent/ForwardingLock.java
index 8c50787..db2026a 100644
--- a/guava/src/com/google/common/util/concurrent/ForwardingLock.java
+++ b/guava/src/com/google/common/util/concurrent/ForwardingLock.java
@@ -19,6 +19,7 @@
 import java.util.concurrent.locks.Lock;
 
 /** Forwarding wrapper around a {@code Lock}. */
+@ElementTypesAreNonnullByDefault
 abstract class ForwardingLock implements Lock {
   abstract Lock delegate();
 
diff --git a/guava/src/com/google/common/util/concurrent/FutureCallback.java b/guava/src/com/google/common/util/concurrent/FutureCallback.java
index b180477..f5684e7 100644
--- a/guava/src/com/google/common/util/concurrent/FutureCallback.java
+++ b/guava/src/com/google/common/util/concurrent/FutureCallback.java
@@ -29,9 +29,10 @@
  * @since 10.0
  */
 @GwtCompatible
-public interface FutureCallback<V> {
+@ElementTypesAreNonnullByDefault
+public interface FutureCallback<V extends @Nullable Object> {
   /** Invoked with the result of the {@code Future} computation when it is successful. */
-  void onSuccess(@Nullable V result);
+  void onSuccess(@ParametricNullness V result);
 
   /**
    * Invoked when a {@code Future} computation fails or is canceled.
diff --git a/guava/src/com/google/common/util/concurrent/Futures.java b/guava/src/com/google/common/util/concurrent/Futures.java
index 6bad226..43205b8 100644
--- a/guava/src/com/google/common/util/concurrent/Futures.java
+++ b/guava/src/com/google/common/util/concurrent/Futures.java
@@ -19,6 +19,7 @@
 import static com.google.common.util.concurrent.Internal.toNanosSaturated;
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 import static com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
@@ -46,6 +47,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -73,6 +75,7 @@
  * @since 1.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Futures extends GwtFuturesCatchingSpecialization {
 
   // A note on memory visibility.
@@ -127,7 +130,8 @@
    * getters just return the value. This {@code Future} can't be canceled or timed out and its
    * {@code isDone()} method always returns {@code true}.
    */
-  public static <V> ListenableFuture<V> immediateFuture(@Nullable V value) {
+  public static <V extends @Nullable Object> ListenableFuture<V> immediateFuture(
+      @ParametricNullness V value) {
     if (value == null) {
       // This cast is safe because null is assignable to V for all V (i.e. it is bivariant)
       @SuppressWarnings("unchecked")
@@ -144,8 +148,8 @@
    * @since 29.0
    */
   @SuppressWarnings("unchecked")
-  public static ListenableFuture<Void> immediateVoidFuture() {
-    return (ListenableFuture<Void>) ImmediateFuture.NULL;
+  public static ListenableFuture<@Nullable Void> immediateVoidFuture() {
+    return (ListenableFuture<@Nullable Void>) ImmediateFuture.NULL;
   }
 
   /**
@@ -155,7 +159,8 @@
    * returns {@code true}. Calling {@code get()} will immediately throw the provided {@code
    * Throwable} wrapped in an {@code ExecutionException}.
    */
-  public static <V> ListenableFuture<V> immediateFailedFuture(Throwable throwable) {
+  public static <V extends @Nullable Object> ListenableFuture<V> immediateFailedFuture(
+      Throwable throwable) {
     checkNotNull(throwable);
     return new ImmediateFailedFuture<V>(throwable);
   }
@@ -166,7 +171,7 @@
    *
    * @since 14.0
    */
-  public static <V> ListenableFuture<V> immediateCancelledFuture() {
+  public static <V extends @Nullable Object> ListenableFuture<V> immediateCancelledFuture() {
     return new ImmediateCancelledFuture<V>();
   }
 
@@ -177,7 +182,8 @@
    * @since 28.2
    */
   @Beta
-  public static <O> ListenableFuture<O> submit(Callable<O> callable, Executor executor) {
+  public static <O extends @Nullable Object> ListenableFuture<O> submit(
+      Callable<O> callable, Executor executor) {
     TrustedListenableFutureTask<O> task = TrustedListenableFutureTask.create(callable);
     executor.execute(task);
     return task;
@@ -191,8 +197,9 @@
    * @since 28.2
    */
   @Beta
-  public static ListenableFuture<Void> submit(Runnable runnable, Executor executor) {
-    TrustedListenableFutureTask<Void> task = TrustedListenableFutureTask.create(runnable, null);
+  public static ListenableFuture<@Nullable Void> submit(Runnable runnable, Executor executor) {
+    TrustedListenableFutureTask<@Nullable Void> task =
+        TrustedListenableFutureTask.create(runnable, null);
     executor.execute(task);
     return task;
   }
@@ -204,7 +211,8 @@
    * @since 23.0
    */
   @Beta
-  public static <O> ListenableFuture<O> submitAsync(AsyncCallable<O> callable, Executor executor) {
+  public static <O extends @Nullable Object> ListenableFuture<O> submitAsync(
+      AsyncCallable<O> callable, Executor executor) {
     TrustedListenableFutureTask<O> task = TrustedListenableFutureTask.create(callable);
     executor.execute(task);
     return task;
@@ -218,7 +226,7 @@
    */
   @Beta
   @GwtIncompatible // java.util.concurrent.ScheduledExecutorService
-  public static <O> ListenableFuture<O> scheduleAsync(
+  public static <O extends @Nullable Object> ListenableFuture<O> scheduleAsync(
       AsyncCallable<O> callable, Duration delay, ScheduledExecutorService executorService) {
     return scheduleAsync(callable, toNanosSaturated(delay), TimeUnit.NANOSECONDS, executorService);
   }
@@ -232,7 +240,7 @@
   @Beta
   @GwtIncompatible // java.util.concurrent.ScheduledExecutorService
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  public static <O> ListenableFuture<O> scheduleAsync(
+  public static <O extends @Nullable Object> ListenableFuture<O> scheduleAsync(
       AsyncCallable<O> callable,
       long delay,
       TimeUnit timeUnit,
@@ -289,7 +297,7 @@
    */
   @Beta
   @Partially.GwtIncompatible("AVAILABLE but requires exceptionType to be Throwable.class")
-  public static <V, X extends Throwable> ListenableFuture<V> catching(
+  public static <V extends @Nullable Object, X extends Throwable> ListenableFuture<V> catching(
       ListenableFuture<? extends V> input,
       Class<X> exceptionType,
       Function<? super X, ? extends V> fallback,
@@ -354,7 +362,7 @@
    */
   @Beta
   @Partially.GwtIncompatible("AVAILABLE but requires exceptionType to be Throwable.class")
-  public static <V, X extends Throwable> ListenableFuture<V> catchingAsync(
+  public static <V extends @Nullable Object, X extends Throwable> ListenableFuture<V> catchingAsync(
       ListenableFuture<? extends V> input,
       Class<X> exceptionType,
       AsyncFunction<? super X, ? extends V> fallback,
@@ -375,7 +383,7 @@
    */
   @Beta
   @GwtIncompatible // java.util.concurrent.ScheduledExecutorService
-  public static <V> ListenableFuture<V> withTimeout(
+  public static <V extends @Nullable Object> ListenableFuture<V> withTimeout(
       ListenableFuture<V> delegate, Duration time, ScheduledExecutorService scheduledExecutor) {
     return withTimeout(delegate, toNanosSaturated(time), TimeUnit.NANOSECONDS, scheduledExecutor);
   }
@@ -395,7 +403,7 @@
   @Beta
   @GwtIncompatible // java.util.concurrent.ScheduledExecutorService
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  public static <V> ListenableFuture<V> withTimeout(
+  public static <V extends @Nullable Object> ListenableFuture<V> withTimeout(
       ListenableFuture<V> delegate,
       long time,
       TimeUnit unit,
@@ -439,10 +447,11 @@
    * @since 19.0 (in 11.0 as {@code transform})
    */
   @Beta
-  public static <I, O> ListenableFuture<O> transformAsync(
-      ListenableFuture<I> input,
-      AsyncFunction<? super I, ? extends O> function,
-      Executor executor) {
+  public static <I extends @Nullable Object, O extends @Nullable Object>
+      ListenableFuture<O> transformAsync(
+          ListenableFuture<I> input,
+          AsyncFunction<? super I, ? extends O> function,
+          Executor executor) {
     return AbstractTransformFuture.create(input, function, executor);
   }
 
@@ -476,8 +485,9 @@
    * @since 9.0 (in 2.0 as {@code compose})
    */
   @Beta
-  public static <I, O> ListenableFuture<O> transform(
-      ListenableFuture<I> input, Function<? super I, ? extends O> function, Executor executor) {
+  public static <I extends @Nullable Object, O extends @Nullable Object>
+      ListenableFuture<O> transform(
+          ListenableFuture<I> input, Function<? super I, ? extends O> function, Executor executor) {
     return AbstractTransformFuture.create(input, function, executor);
   }
 
@@ -503,7 +513,7 @@
    */
   @Beta
   @GwtIncompatible // TODO
-  public static <I, O> Future<O> lazyTransform(
+  public static <I extends @Nullable Object, O extends @Nullable Object> Future<O> lazyTransform(
       final Future<I> input, final Function<? super I, ? extends O> function) {
     checkNotNull(input);
     checkNotNull(function);
@@ -563,8 +573,14 @@
    */
   @Beta
   @SafeVarargs
-  public static <V> ListenableFuture<List<V>> allAsList(ListenableFuture<? extends V>... futures) {
-    return new ListFuture<V>(ImmutableList.copyOf(futures), true);
+  public static <V extends @Nullable Object> ListenableFuture<List<V>> allAsList(
+      ListenableFuture<? extends V>... futures) {
+    ListenableFuture<List<@Nullable V>> nullable =
+        new ListFuture<V>(ImmutableList.copyOf(futures), true);
+    // allAsList ensures that it fills the output list with V instances.
+    @SuppressWarnings("nullness")
+    ListenableFuture<List<V>> nonNull = nullable;
+    return nonNull;
   }
 
   /**
@@ -584,9 +600,14 @@
    * @since 10.0
    */
   @Beta
-  public static <V> ListenableFuture<List<V>> allAsList(
+  public static <V extends @Nullable Object> ListenableFuture<List<V>> allAsList(
       Iterable<? extends ListenableFuture<? extends V>> futures) {
-    return new ListFuture<V>(ImmutableList.copyOf(futures), true);
+    ListenableFuture<List<@Nullable V>> nullable =
+        new ListFuture<V>(ImmutableList.copyOf(futures), true);
+    // allAsList ensures that it fills the output list with V instances.
+    @SuppressWarnings("nullness")
+    ListenableFuture<List<V>> nonNull = nullable;
+    return nonNull;
   }
 
   /**
@@ -599,7 +620,8 @@
    */
   @Beta
   @SafeVarargs
-  public static <V> FutureCombiner<V> whenAllComplete(ListenableFuture<? extends V>... futures) {
+  public static <V extends @Nullable Object> FutureCombiner<V> whenAllComplete(
+      ListenableFuture<? extends V>... futures) {
     return new FutureCombiner<V>(false, ImmutableList.copyOf(futures));
   }
 
@@ -612,7 +634,7 @@
    * @since 20.0
    */
   @Beta
-  public static <V> FutureCombiner<V> whenAllComplete(
+  public static <V extends @Nullable Object> FutureCombiner<V> whenAllComplete(
       Iterable<? extends ListenableFuture<? extends V>> futures) {
     return new FutureCombiner<V>(false, ImmutableList.copyOf(futures));
   }
@@ -626,7 +648,8 @@
    */
   @Beta
   @SafeVarargs
-  public static <V> FutureCombiner<V> whenAllSucceed(ListenableFuture<? extends V>... futures) {
+  public static <V extends @Nullable Object> FutureCombiner<V> whenAllSucceed(
+      ListenableFuture<? extends V>... futures) {
     return new FutureCombiner<V>(true, ImmutableList.copyOf(futures));
   }
 
@@ -638,7 +661,7 @@
    * @since 20.0
    */
   @Beta
-  public static <V> FutureCombiner<V> whenAllSucceed(
+  public static <V extends @Nullable Object> FutureCombiner<V> whenAllSucceed(
       Iterable<? extends ListenableFuture<? extends V>> futures) {
     return new FutureCombiner<V>(true, ImmutableList.copyOf(futures));
   }
@@ -672,7 +695,7 @@
   @Beta
   @CanIgnoreReturnValue // TODO(cpovirk): Consider removing, especially if we provide run(Runnable)
   @GwtCompatible
-  public static final class FutureCombiner<V> {
+  public static final class FutureCombiner<V extends @Nullable Object> {
     private final boolean allMustSucceed;
     private final ImmutableList<ListenableFuture<? extends V>> futures;
 
@@ -696,7 +719,8 @@
      *
      * <p>Canceling this future will attempt to cancel all the component futures.
      */
-    public <C> ListenableFuture<C> callAsync(AsyncCallable<C> combiner, Executor executor) {
+    public <C extends @Nullable Object> ListenableFuture<C> callAsync(
+        AsyncCallable<C> combiner, Executor executor) {
       return new CombinedFuture<C>(futures, allMustSucceed, executor, combiner);
     }
 
@@ -715,7 +739,8 @@
      * <p>Canceling this future will attempt to cancel all the component futures.
      */
     @CanIgnoreReturnValue // TODO(cpovirk): Remove this
-    public <C> ListenableFuture<C> call(Callable<C> combiner, Executor executor) {
+    public <C extends @Nullable Object> ListenableFuture<C> call(
+        Callable<C> combiner, Executor executor) {
       return new CombinedFuture<C>(futures, allMustSucceed, executor, combiner);
     }
 
@@ -732,8 +757,9 @@
      */
     public ListenableFuture<?> run(final Runnable combiner, Executor executor) {
       return call(
-          new Callable<Void>() {
+          new Callable<@Nullable Void>() {
             @Override
+            @CheckForNull
             public Void call() throws Exception {
               combiner.run();
               return null;
@@ -751,7 +777,8 @@
    * @since 15.0
    */
   @Beta
-  public static <V> ListenableFuture<V> nonCancellationPropagating(ListenableFuture<V> future) {
+  public static <V extends @Nullable Object> ListenableFuture<V> nonCancellationPropagating(
+      ListenableFuture<V> future) {
     if (future.isDone()) {
       return future;
     }
@@ -761,9 +788,9 @@
   }
 
   /** A wrapped future that does not propagate cancellation to its delegate. */
-  private static final class NonCancellationPropagatingFuture<V>
+  private static final class NonCancellationPropagatingFuture<V extends @Nullable Object>
       extends AbstractFuture.TrustedFuture<V> implements Runnable {
-    private ListenableFuture<V> delegate;
+    @CheckForNull private ListenableFuture<V> delegate;
 
     NonCancellationPropagatingFuture(final ListenableFuture<V> delegate) {
       this.delegate = delegate;
@@ -780,6 +807,7 @@
     }
 
     @Override
+    @CheckForNull
     protected String pendingToString() {
       ListenableFuture<V> localDelegate = delegate;
       if (localDelegate != null) {
@@ -812,9 +840,21 @@
    * @return a future that provides a list of the results of the component futures
    * @since 10.0
    */
+  /*
+   * Another way to express this signature would be to bound <V> by @NonNull and accept LF<? extends
+   * @Nullable V>. That might be better: There's currently no difference between the outputs users
+   * get when calling this with <Foo> and calling it with <@Nullable Foo>. The only difference is
+   * that calling it with <Foo> won't work when an input Future has a @Nullable type. So why even
+   * make that error possible by giving callers the choice?
+   *
+   * On the other hand, the current signature is consistent with the similar allAsList method. And
+   * eventually this method may go away entirely in favor of an API like
+   * whenAllComplete().collectSuccesses(). That API would have a signature more like the current
+   * one.
+   */
   @Beta
   @SafeVarargs
-  public static <V> ListenableFuture<List<V>> successfulAsList(
+  public static <V extends @Nullable Object> ListenableFuture<List<@Nullable V>> successfulAsList(
       ListenableFuture<? extends V>... futures) {
     return new ListFuture<V>(ImmutableList.copyOf(futures), false);
   }
@@ -838,7 +878,7 @@
    * @since 10.0
    */
   @Beta
-  public static <V> ListenableFuture<List<V>> successfulAsList(
+  public static <V extends @Nullable Object> ListenableFuture<List<@Nullable V>> successfulAsList(
       Iterable<? extends ListenableFuture<? extends V>> futures) {
     return new ListFuture<V>(ImmutableList.copyOf(futures), false);
   }
@@ -865,21 +905,12 @@
    * @since 17.0
    */
   @Beta
-  public static <T> ImmutableList<ListenableFuture<T>> inCompletionOrder(
+  public static <T extends @Nullable Object> ImmutableList<ListenableFuture<T>> inCompletionOrder(
       Iterable<? extends ListenableFuture<? extends T>> futures) {
-    // Can't use Iterables.toArray because it's not gwt compatible
-    final Collection<ListenableFuture<? extends T>> collection;
-    if (futures instanceof Collection) {
-      collection = (Collection<ListenableFuture<? extends T>>) futures;
-    } else {
-      collection = ImmutableList.copyOf(futures);
-    }
-    @SuppressWarnings("unchecked")
-    ListenableFuture<? extends T>[] copy =
-        (ListenableFuture<? extends T>[])
-            collection.toArray(new ListenableFuture[collection.size()]);
+    ListenableFuture<? extends T>[] copy = gwtCompatibleToArray(futures);
     final InCompletionOrderState<T> state = new InCompletionOrderState<>(copy);
-    ImmutableList.Builder<AbstractFuture<T>> delegatesBuilder = ImmutableList.builder();
+    ImmutableList.Builder<AbstractFuture<T>> delegatesBuilder =
+        ImmutableList.builderWithExpectedSize(copy.length);
     for (int i = 0; i < copy.length; i++) {
       delegatesBuilder.add(new InCompletionOrderFuture<T>(state));
     }
@@ -902,11 +933,25 @@
     return delegatesCast;
   }
 
+  /** Can't use Iterables.toArray because it's not gwt compatible */
+  @SuppressWarnings("unchecked")
+  private static <T extends @Nullable Object> ListenableFuture<? extends T>[] gwtCompatibleToArray(
+      Iterable<? extends ListenableFuture<? extends T>> futures) {
+    final Collection<ListenableFuture<? extends T>> collection;
+    if (futures instanceof Collection) {
+      collection = (Collection<ListenableFuture<? extends T>>) futures;
+    } else {
+      collection = ImmutableList.copyOf(futures);
+    }
+    return (ListenableFuture<? extends T>[]) collection.toArray(new ListenableFuture<?>[0]);
+  }
+
   // This can't be a TrustedFuture, because TrustedFuture has clever optimizations that
   // mean cancel won't be called if this Future is passed into setFuture, and then
   // cancelled.
-  private static final class InCompletionOrderFuture<T> extends AbstractFuture<T> {
-    private InCompletionOrderState<T> state;
+  private static final class InCompletionOrderFuture<T extends @Nullable Object>
+      extends AbstractFuture<T> {
+    @CheckForNull private InCompletionOrderState<T> state;
 
     private InCompletionOrderFuture(InCompletionOrderState<T> state) {
       this.state = state;
@@ -916,7 +961,15 @@
     public boolean cancel(boolean interruptIfRunning) {
       InCompletionOrderState<T> localState = state;
       if (super.cancel(interruptIfRunning)) {
-        localState.recordOutputCancellation(interruptIfRunning);
+        /*
+         * requireNonNull is generally safe: If cancel succeeded, then this Future was still
+         * pending, so its `state` field hasn't been nulled out yet.
+         *
+         * OK, it's technically possible for this to fail in the presence of unsafe publishing, as
+         * discussed in the comments in TimeoutFuture. TODO(cpovirk): Maybe check for null before
+         * calling recordOutputCancellation?
+         */
+        requireNonNull(localState).recordOutputCancellation(interruptIfRunning);
         return true;
       }
       return false;
@@ -928,6 +981,7 @@
     }
 
     @Override
+    @CheckForNull
     protected String pendingToString() {
       InCompletionOrderState<T> localState = state;
       if (localState != null) {
@@ -943,14 +997,15 @@
     }
   }
 
-  private static final class InCompletionOrderState<T> {
+  private static final class InCompletionOrderState<T extends @Nullable Object> {
     // A happens-before edge between the writes of these fields and their reads exists, because
     // in order to read these fields, the corresponding write to incompleteOutputCount must have
     // been read.
     private boolean wasCancelled = false;
     private boolean shouldInterrupt = true;
     private final AtomicInteger incompleteOutputCount;
-    private final ListenableFuture<? extends T>[] inputFutures;
+    // We set the elements of the array to null as they complete.
+    private final @Nullable ListenableFuture<? extends T>[] inputFutures;
     private volatile int delegateIndex = 0;
 
     private InCompletionOrderState(ListenableFuture<? extends T>[] inputFutures) {
@@ -970,7 +1025,11 @@
 
     private void recordInputCompletion(
         ImmutableList<AbstractFuture<T>> delegates, int inputFutureIndex) {
-      ListenableFuture<? extends T> inputFuture = inputFutures[inputFutureIndex];
+      /*
+       * requireNonNull is safe because we accepted an Iterable of non-null Future instances, and we
+       * don't overwrite an element in the array until after reading it.
+       */
+      ListenableFuture<? extends T> inputFuture = requireNonNull(inputFutures[inputFutureIndex]);
       // Null out our reference to this future, so it can be GCed
       inputFutures[inputFutureIndex] = null;
       for (int i = delegateIndex; i < delegates.size(); i++) {
@@ -989,7 +1048,7 @@
 
     private void recordCompletion() {
       if (incompleteOutputCount.decrementAndGet() == 0 && wasCancelled) {
-        for (ListenableFuture<?> toCancel : inputFutures) {
+        for (ListenableFuture<? extends T> toCancel : inputFutures) {
           if (toCancel != null) {
             toCancel.cancel(shouldInterrupt);
           }
@@ -1039,7 +1098,7 @@
    * @param executor The executor to run {@code callback} when the future completes.
    * @since 10.0
    */
-  public static <V> void addCallback(
+  public static <V extends @Nullable Object> void addCallback(
       final ListenableFuture<V> future,
       final FutureCallback<? super V> callback,
       Executor executor) {
@@ -1048,7 +1107,7 @@
   }
 
   /** See {@link #addCallback(ListenableFuture, FutureCallback, Executor)} for behavioral notes. */
-  private static final class CallbackListener<V> implements Runnable {
+  private static final class CallbackListener<V extends @Nullable Object> implements Runnable {
     final Future<V> future;
     final FutureCallback<? super V> callback;
 
@@ -1107,7 +1166,8 @@
    */
   @CanIgnoreReturnValue
   // TODO(cpovirk): Consider calling getDone() in our own code.
-  public static <V> V getDone(Future<V> future) throws ExecutionException {
+  @ParametricNullness
+  public static <V extends @Nullable Object> V getDone(Future<V> future) throws ExecutionException {
     /*
      * We throw IllegalStateException, since the call could succeed later. Perhaps we "should" throw
      * IllegalArgumentException, since the call could succeed with a different argument. Those
@@ -1115,7 +1175,6 @@
      * IllegalArgumentException here, in part to keep its recommendation simple: Static methods
      * should throw IllegalStateException only when they use static state.
      *
-     *
      * Why do we deviate here? The answer: We want for fluentFuture.getDone() to throw the same
      * exception as Futures.getDone(fluentFuture).
      */
@@ -1168,8 +1227,9 @@
   @Beta
   @CanIgnoreReturnValue
   @GwtIncompatible // reflection
-  public static <V, X extends Exception> V getChecked(Future<V> future, Class<X> exceptionClass)
-      throws X {
+  @ParametricNullness
+  public static <V extends @Nullable Object, X extends Exception> V getChecked(
+      Future<V> future, Class<X> exceptionClass) throws X {
     return FuturesGetChecked.getChecked(future, exceptionClass);
   }
 
@@ -1219,7 +1279,8 @@
   @Beta
   @CanIgnoreReturnValue
   @GwtIncompatible // reflection
-  public static <V, X extends Exception> V getChecked(
+  @ParametricNullness
+  public static <V extends @Nullable Object, X extends Exception> V getChecked(
       Future<V> future, Class<X> exceptionClass, Duration timeout) throws X {
     return getChecked(future, exceptionClass, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
   }
@@ -1271,7 +1332,8 @@
   @CanIgnoreReturnValue
   @GwtIncompatible // reflection
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  public static <V, X extends Exception> V getChecked(
+  @ParametricNullness
+  public static <V extends @Nullable Object, X extends Exception> V getChecked(
       Future<V> future, Class<X> exceptionClass, long timeout, TimeUnit unit) throws X {
     return FuturesGetChecked.getChecked(future, exceptionClass, timeout, unit);
   }
@@ -1311,7 +1373,8 @@
    * @since 10.0
    */
   @CanIgnoreReturnValue
-  public static <V> V getUnchecked(Future<V> future) {
+  @ParametricNullness
+  public static <V extends @Nullable Object> V getUnchecked(Future<V> future) {
     checkNotNull(future);
     try {
       return getUninterruptibly(future);
@@ -1341,7 +1404,7 @@
    * the computation -- makes sense, and if we don't convert it, the user still has to write a
    * try-catch block.
    *
-   * If you think you would use this method, let us know. You might also also look into the
+   * If you think you would use this method, let us know. You might also look into the
    * Fork-Join framework: http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html
    */
 }
diff --git a/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java b/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java
index 2365040..6f09b80 100644
--- a/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java
+++ b/guava/src/com/google/common/util/concurrent/FuturesGetChecked.java
@@ -35,20 +35,25 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /** Static methods used to implement {@link Futures#getChecked(Future, Class)}. */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class FuturesGetChecked {
   @CanIgnoreReturnValue
-  static <V, X extends Exception> V getChecked(Future<V> future, Class<X> exceptionClass) throws X {
+  @ParametricNullness
+  static <V extends @Nullable Object, X extends Exception> V getChecked(
+      Future<V> future, Class<X> exceptionClass) throws X {
     return getChecked(bestGetCheckedTypeValidator(), future, exceptionClass);
   }
 
   /** Implementation of {@link Futures#getChecked(Future, Class)}. */
   @CanIgnoreReturnValue
   @VisibleForTesting
-  static <V, X extends Exception> V getChecked(
+  @ParametricNullness
+  static <V extends @Nullable Object, X extends Exception> V getChecked(
       GetCheckedTypeValidator validator, Future<V> future, Class<X> exceptionClass) throws X {
     validator.validateClass(exceptionClass);
     try {
@@ -64,7 +69,8 @@
 
   /** Implementation of {@link Futures#getChecked(Future, Class, long, TimeUnit)}. */
   @CanIgnoreReturnValue
-  static <V, X extends Exception> V getChecked(
+  @ParametricNullness
+  static <V extends @Nullable Object, X extends Exception> V getChecked(
       Future<V> future, Class<X> exceptionClass, long timeout, TimeUnit unit) throws X {
     // TODO(cpovirk): benchmark a version of this method that accepts a GetCheckedTypeValidator
     bestGetCheckedTypeValidator().validateClass(exceptionClass);
@@ -114,7 +120,6 @@
 
     static final GetCheckedTypeValidator BEST_VALIDATOR = getBestValidator();
 
-    @IgnoreJRERequirement // getChecked falls back to another implementation if necessary
     @J2ObjCIncompatible // ClassValue
     enum ClassValueValidator implements GetCheckedTypeValidator {
       INSTANCE;
@@ -185,7 +190,8 @@
      */
     static GetCheckedTypeValidator getBestValidator() {
       try {
-        Class<?> theClass = Class.forName(CLASS_VALUE_VALIDATOR_NAME);
+        Class<? extends Enum> theClass =
+            Class.forName(CLASS_VALUE_VALIDATOR_NAME).asSubclass(Enum.class);
         return (GetCheckedTypeValidator) theClass.getEnumConstants()[0];
       } catch (Throwable t) { // ensure we really catch *everything*
         return weakSetValidator();
@@ -225,7 +231,7 @@
     @SuppressWarnings({"unchecked", "rawtypes"})
     List<Constructor<X>> constructors = (List) Arrays.asList(exceptionClass.getConstructors());
     for (Constructor<X> constructor : preferringStrings(constructors)) {
-      @Nullable X instance = newFromConstructor(constructor, cause);
+      X instance = newFromConstructor(constructor, cause);
       if (instance != null) {
         if (instance.getCause() == null) {
           instance.initCause(cause);
@@ -256,7 +262,8 @@
               })
           .reverse();
 
-  private static <X> @Nullable X newFromConstructor(Constructor<X> constructor, Throwable cause) {
+  @CheckForNull
+  private static <X> X newFromConstructor(Constructor<X> constructor, Throwable cause) {
     Class<?>[] paramTypes = constructor.getParameterTypes();
     Object[] params = new Object[paramTypes.length];
     for (int i = 0; i < paramTypes.length; i++) {
diff --git a/guava/src/com/google/common/util/concurrent/GwtFluentFutureCatchingSpecialization.java b/guava/src/com/google/common/util/concurrent/GwtFluentFutureCatchingSpecialization.java
index e8acf62..d29a673 100644
--- a/guava/src/com/google/common/util/concurrent/GwtFluentFutureCatchingSpecialization.java
+++ b/guava/src/com/google/common/util/concurrent/GwtFluentFutureCatchingSpecialization.java
@@ -15,6 +15,7 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtCompatible;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Hidden superclass of {@link FluentFuture} that provides us a place to declare special GWT
@@ -22,7 +23,9 @@
  * FluentFuture.catching} family of methods. Those versions have slightly different signatures.
  */
 @GwtCompatible(emulated = true)
-abstract class GwtFluentFutureCatchingSpecialization<V> extends AbstractFuture<V> {
+@ElementTypesAreNonnullByDefault
+abstract class GwtFluentFutureCatchingSpecialization<V extends @Nullable Object>
+    extends AbstractFuture<V> {
   /*
    * This server copy of the class is empty. The corresponding GWT copy contains alternative
    * versions of catching() and catchingAsync() with slightly different signatures from the ones
diff --git a/guava/src/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java b/guava/src/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java
index 4626ce9..95131ce 100644
--- a/guava/src/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java
+++ b/guava/src/com/google/common/util/concurrent/GwtFuturesCatchingSpecialization.java
@@ -23,6 +23,7 @@
  * different signatures.
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 abstract class GwtFuturesCatchingSpecialization {
   /*
    * This server copy of the class is empty. The corresponding GWT copy contains alternative
diff --git a/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java b/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java
deleted file mode 100644
index b557ac6..0000000
--- a/guava/src/com/google/common/util/concurrent/IgnoreJRERequirement.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2019 The Guava Authors
- *
- * 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 com.google.common.util.concurrent;
-
-@interface IgnoreJRERequirement {}
diff --git a/guava/src/com/google/common/util/concurrent/ImmediateFuture.java b/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
index 7bee37d..81912f5 100644
--- a/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ImmediateFuture.java
@@ -27,15 +27,16 @@
 
 /** Implementation of {@link Futures#immediateFuture}. */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 // TODO(cpovirk): Make this final (but that may break Mockito spy calls).
-class ImmediateFuture<V> implements ListenableFuture<V> {
-  static final ListenableFuture<?> NULL = new ImmediateFuture<>(null);
+class ImmediateFuture<V extends @Nullable Object> implements ListenableFuture<V> {
+  static final ListenableFuture<?> NULL = new ImmediateFuture<@Nullable Object>(null);
 
   private static final Logger log = Logger.getLogger(ImmediateFuture.class.getName());
 
-  private final @Nullable V value;
+  @ParametricNullness private final V value;
 
-  ImmediateFuture(@Nullable V value) {
+  ImmediateFuture(@ParametricNullness V value) {
     this.value = value;
   }
 
@@ -62,11 +63,13 @@
 
   // TODO(lukes): Consider throwing InterruptedException when appropriate.
   @Override
+  @ParametricNullness
   public V get() {
     return value;
   }
 
   @Override
+  @ParametricNullness
   public V get(long timeout, TimeUnit unit) throws ExecutionException {
     checkNotNull(unit);
     return get();
@@ -88,13 +91,13 @@
     return super.toString() + "[status=SUCCESS, result=[" + value + "]]";
   }
 
-  static final class ImmediateFailedFuture<V> extends TrustedFuture<V> {
+  static final class ImmediateFailedFuture<V extends @Nullable Object> extends TrustedFuture<V> {
     ImmediateFailedFuture(Throwable thrown) {
       setException(thrown);
     }
   }
 
-  static final class ImmediateCancelledFuture<V> extends TrustedFuture<V> {
+  static final class ImmediateCancelledFuture<V extends @Nullable Object> extends TrustedFuture<V> {
     ImmediateCancelledFuture() {
       cancel(false);
     }
diff --git a/guava/src/com/google/common/util/concurrent/Internal.java b/guava/src/com/google/common/util/concurrent/Internal.java
index 8f83823..06bee2e 100644
--- a/guava/src/com/google/common/util/concurrent/Internal.java
+++ b/guava/src/com/google/common/util/concurrent/Internal.java
@@ -19,6 +19,7 @@
 
 /** This class is for {@code com.google.common.util.concurrent} use only! */
 @GwtIncompatible // java.time.Duration
+@ElementTypesAreNonnullByDefault
 final class Internal {
 
   /**
diff --git a/guava/src/com/google/common/util/concurrent/InterruptibleTask.java b/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
index 7653776..168adf2 100644
--- a/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
+++ b/guava/src/com/google/common/util/concurrent/InterruptibleTask.java
@@ -14,20 +14,26 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.util.concurrent.NullnessCasts.uncheckedCastNullableTToT;
+
 import com.google.common.annotations.GwtCompatible;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.j2objc.annotations.ReflectionSupport;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.AbstractOwnableSynchronizer;
 import java.util.concurrent.locks.LockSupport;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 @GwtCompatible(emulated = true)
 @ReflectionSupport(value = ReflectionSupport.Level.FULL)
+@ElementTypesAreNonnullByDefault
 // Some Android 5.0.x Samsung devices have bugs in JDK reflection APIs that cause
 // getDeclaredField to throw a NoSuchFieldException when the field is definitely there.
 // Since this class only needs CAS on one field, we can avoid this bug by extending AtomicReference
 // instead of using an AtomicReferenceFieldUpdater. This reference stores Thread instances
 // and DONE/INTERRUPTED - they have a common ancestor of Runnable.
-abstract class InterruptibleTask<T> extends AtomicReference<Runnable> implements Runnable {
+abstract class InterruptibleTask<T extends @Nullable Object>
+    extends AtomicReference<@Nullable Runnable> implements Runnable {
   static {
     // Prevent rare disastrous classloading in first call to LockSupport.park.
     // See: https://bugs.openjdk.java.net/browse/JDK-8074773
@@ -42,7 +48,6 @@
   // The thread executing the task publishes itself to the superclass' reference and the thread
   // interrupting sets DONE when it has finished interrupting.
   private static final Runnable DONE = new DoNothingRunnable();
-  private static final Runnable INTERRUPTING = new DoNothingRunnable();
   private static final Runnable PARKED = new DoNothingRunnable();
   // Why 1000?  WHY NOT!
   private static final int MAX_BUSY_WAIT_SPINS = 1000;
@@ -73,68 +78,85 @@
     } finally {
       // Attempt to set the task as done so that further attempts to interrupt will fail.
       if (!compareAndSet(currentThread, DONE)) {
-        // If we were interrupted, it is possible that the interrupted bit hasn't been set yet. Wait
-        // for the interrupting thread to set DONE. See interruptTask().
-        // We want to wait so that we don't interrupt the _next_ thing run on the thread.
-        // Note: We don't reset the interrupted bit, just wait for it to be set.
-        // If this is a thread pool thread, the thread pool will reset it for us. Otherwise, the
-        // interrupted bit may have been intended for something else, so don't clear it.
-        boolean restoreInterruptedBit = false;
-        int spinCount = 0;
-        // Interrupting Cow Says:
-        //  ______
-        // < Spin >
-        //  ------
-        //        \   ^__^
-        //         \  (oo)\_______
-        //            (__)\       )\/\
-        //                ||----w |
-        //                ||     ||
-        Runnable state = get();
-        while (state == INTERRUPTING || state == PARKED) {
-          spinCount++;
-          if (spinCount > MAX_BUSY_WAIT_SPINS) {
-            // If we have spun a lot just park ourselves.
-            // This will save CPU while we wait for a slow interrupting thread.  In theory
-            // interruptTask() should be very fast but due to InterruptibleChannel and
-            // JavaLangAccess.blockedOn(Thread, Interruptible), it isn't predictable what work might
-            // be done.  (e.g. close a file and flush buffers to disk).  To protect ourselve from
-            // this we park ourselves and tell our interrupter that we did so.
-            if (state == PARKED || compareAndSet(INTERRUPTING, PARKED)) {
-              // Interrupting Cow Says:
-              //  ______
-              // < Park >
-              //  ------
-              //        \   ^__^
-              //         \  (oo)\_______
-              //            (__)\       )\/\
-              //                ||----w |
-              //                ||     ||
-              // We need to clear the interrupted bit prior to calling park and maintain it in case
-              // we wake up spuriously.
-              restoreInterruptedBit = Thread.interrupted() || restoreInterruptedBit;
-              LockSupport.park(this);
-            }
-          } else {
-            Thread.yield();
-          }
-          state = get();
-        }
-        if (restoreInterruptedBit) {
-          currentThread.interrupt();
-        }
-        /*
-         * TODO(cpovirk): Clear interrupt status here? We currently don't, which means that an
-         * interrupt before, during, or after runInterruptibly() (unless it produced an
-         * InterruptedException caught above) can linger and affect listeners.
-         */
+        waitForInterrupt(currentThread);
       }
       if (run) {
-        afterRanInterruptibly(result, error);
+        if (error == null) {
+          // The cast is safe because of the `run` and `error` checks.
+          afterRanInterruptiblySuccess(uncheckedCastNullableTToT(result));
+        } else {
+          afterRanInterruptiblyFailure(error);
+        }
       }
     }
   }
 
+  private void waitForInterrupt(Thread currentThread) {
+    /*
+     * If someone called cancel(true), it is possible that the interrupted bit hasn't been set yet.
+     * Wait for the interrupting thread to set DONE. (See interruptTask().) We want to wait so that
+     * the interrupting thread doesn't interrupt the _next_ thing to run on this thread.
+     *
+     * Note: We don't reset the interrupted bit, just wait for it to be set. If this is a thread
+     * pool thread, the thread pool will reset it for us. Otherwise, the interrupted bit may have
+     * been intended for something else, so don't clear it.
+     */
+    boolean restoreInterruptedBit = false;
+    int spinCount = 0;
+    // Interrupting Cow Says:
+    //  ______
+    // < Spin >
+    //  ------
+    //        \   ^__^
+    //         \  (oo)\_______
+    //            (__)\       )\/\
+    //                ||----w |
+    //                ||     ||
+    Runnable state = get();
+    Blocker blocker = null;
+    while (state instanceof Blocker || state == PARKED) {
+      if (state instanceof Blocker) {
+        blocker = (Blocker) state;
+      }
+      spinCount++;
+      if (spinCount > MAX_BUSY_WAIT_SPINS) {
+        /*
+         * If we have spun a lot, just park ourselves. This will save CPU while we wait for a slow
+         * interrupting thread. In theory, interruptTask() should be very fast, but due to
+         * InterruptibleChannel and JavaLangAccess.blockedOn(Thread, Interruptible), it isn't
+         * predictable what work might be done. (e.g., close a file and flush buffers to disk). To
+         * protect ourselves from this, we park ourselves and tell our interrupter that we did so.
+         */
+        if (state == PARKED || compareAndSet(state, PARKED)) {
+          // Interrupting Cow Says:
+          //  ______
+          // < Park >
+          //  ------
+          //        \   ^__^
+          //         \  (oo)\_______
+          //            (__)\       )\/\
+          //                ||----w |
+          //                ||     ||
+          // We need to clear the interrupted bit prior to calling park and maintain it in case we
+          // wake up spuriously.
+          restoreInterruptedBit = Thread.interrupted() || restoreInterruptedBit;
+          LockSupport.park(blocker);
+        }
+      } else {
+        Thread.yield();
+      }
+      state = get();
+    }
+    if (restoreInterruptedBit) {
+      currentThread.interrupt();
+    }
+    /*
+     * TODO(cpovirk): Clear interrupt status here? We currently don't, which means that an interrupt
+     * before, during, or after runInterruptibly() (unless it produced an InterruptedException
+     * caught above) can linger and affect listeners.
+     */
+  }
+
   /**
    * Called before runInterruptibly - if true, runInterruptibly and afterRanInterruptibly will not
    * be called.
@@ -145,13 +167,20 @@
    * Do interruptible work here - do not complete Futures here, as their listeners could be
    * interrupted.
    */
+  @ParametricNullness
   abstract T runInterruptibly() throws Exception;
 
   /**
    * Any interruption that happens as a result of calling interruptTask will arrive before this
    * method is called. Complete Futures here.
    */
-  abstract void afterRanInterruptibly(@Nullable T result, @Nullable Throwable error);
+  abstract void afterRanInterruptiblySuccess(@ParametricNullness T result);
+
+  /**
+   * Any interruption that happens as a result of calling interruptTask will arrive before this
+   * method is called. Complete Futures here.
+   */
+  abstract void afterRanInterruptiblyFailure(Throwable error);
 
   /**
    * Interrupts the running task. Because this internally calls {@link Thread#interrupt()} which can
@@ -162,29 +191,59 @@
     // in this CAS, there's no risk of interrupting the wrong thread or interrupting a thread that
     // isn't currently executing this task.
     Runnable currentRunner = get();
-    if (currentRunner instanceof Thread && compareAndSet(currentRunner, INTERRUPTING)) {
-      // Thread.interrupt can throw aribitrary exceptions due to the nio InterruptibleChannel API
-      // This will make sure that tasks don't get stuck busy waiting.
-      // Some of this is fixed in jdk11 (see https://bugs.openjdk.java.net/browse/JDK-8198692) but
-      // not all.  See the test cases for examples on how this can happen.
-      try {
-        ((Thread) currentRunner).interrupt();
-      } finally {
-        Runnable prev = getAndSet(DONE);
-        if (prev == PARKED) {
-          LockSupport.unpark((Thread) currentRunner);
+    if (currentRunner instanceof Thread) {
+      Blocker blocker = new Blocker(this);
+      blocker.setOwner(Thread.currentThread());
+      if (compareAndSet(currentRunner, blocker)) {
+        // Thread.interrupt can throw arbitrary exceptions due to the nio InterruptibleChannel API
+        // This will make sure that tasks don't get stuck busy waiting.
+        // Some of this is fixed in jdk11 (see https://bugs.openjdk.java.net/browse/JDK-8198692) but
+        // not all.  See the test cases for examples on how this can happen.
+        try {
+          ((Thread) currentRunner).interrupt();
+        } finally {
+          Runnable prev = getAndSet(DONE);
+          if (prev == PARKED) {
+            LockSupport.unpark((Thread) currentRunner);
+          }
         }
       }
     }
   }
 
+  /**
+   * Using this as the blocker object allows introspection and debugging tools to see that the
+   * currentRunner thread is blocked on the progress of the interruptor thread, which can help
+   * identify deadlocks.
+   */
+  @VisibleForTesting
+  static final class Blocker extends AbstractOwnableSynchronizer implements Runnable {
+    private final InterruptibleTask<?> task;
+
+    private Blocker(InterruptibleTask<?> task) {
+      this.task = task;
+    }
+
+    @Override
+    public void run() {}
+
+    private void setOwner(Thread thread) {
+      super.setExclusiveOwnerThread(thread);
+    }
+
+    @Override
+    public String toString() {
+      return task.toString();
+    }
+  }
+
   @Override
   public final String toString() {
     Runnable state = get();
     final String result;
     if (state == DONE) {
       result = "running=[DONE]";
-    } else if (state == INTERRUPTING) {
+    } else if (state instanceof Blocker) {
       result = "running=[INTERRUPTED]";
     } else if (state instanceof Thread) {
       // getName is final on Thread, no need to worry about exceptions
diff --git a/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java b/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
index 1b84302..82f8d95 100644
--- a/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
+++ b/guava/src/com/google/common/util/concurrent/JdkFutureAdapters.java
@@ -24,6 +24,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.atomic.AtomicBoolean;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Utilities necessary for working with libraries that supply plain {@link Future} instances. Note
@@ -35,6 +36,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class JdkFutureAdapters {
   /**
    * Assigns a thread to the given {@link Future} to provide {@link ListenableFuture} functionality.
@@ -49,7 +51,8 @@
    * ListenableFutureTask}, {@link AbstractFuture}, and other utilities over creating plain {@code
    * Future} instances to be upgraded to {@code ListenableFuture} after the fact.
    */
-  public static <V> ListenableFuture<V> listenInPoolThread(Future<V> future) {
+  public static <V extends @Nullable Object> ListenableFuture<V> listenInPoolThread(
+      Future<V> future) {
     if (future instanceof ListenableFuture) {
       return (ListenableFuture<V>) future;
     }
@@ -76,7 +79,8 @@
    *
    * @since 12.0
    */
-  public static <V> ListenableFuture<V> listenInPoolThread(Future<V> future, Executor executor) {
+  public static <V extends @Nullable Object> ListenableFuture<V> listenInPoolThread(
+      Future<V> future, Executor executor) {
     checkNotNull(executor);
     if (future instanceof ListenableFuture) {
       return (ListenableFuture<V>) future;
@@ -93,8 +97,8 @@
    * <p>If the delegate future is interrupted or throws an unexpected unchecked exception, the
    * listeners will not be invoked.
    */
-  private static class ListenableFutureAdapter<V> extends ForwardingFuture<V>
-      implements ListenableFuture<V> {
+  private static class ListenableFutureAdapter<V extends @Nullable Object>
+      extends ForwardingFuture<V> implements ListenableFuture<V> {
 
     private static final ThreadFactory threadFactory =
         new ThreadFactoryBuilder()
diff --git a/guava/src/com/google/common/util/concurrent/ListenableFuture.java b/guava/src/com/google/common/util/concurrent/ListenableFuture.java
index 98e31ed..cf0199a 100644
--- a/guava/src/com/google/common/util/concurrent/ListenableFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ListenableFuture.java
@@ -18,6 +18,7 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link Future} that accepts completion listeners. Each listener has an associated executor, and
@@ -99,8 +100,32 @@
  * @author Nishant Thakkar
  * @since 1.0
  */
+/*
+ * Some of the annotations below were added after we released our separate
+ * com.google.guava:listenablefuture:1.0 artifact. (For more on that artifact, see
+ * https://github.com/google/guava/releases/tag/v27.0) This means that the copy of ListenableFuture
+ * in com.google.guava:guava differs from the "frozen" copy in the listenablefuture artifact. This
+ * could in principle cause problems for some users. Still, we expect that the benefits of the
+ * nullness annotations in particular will outweigh the costs. (And it's worth noting that we have
+ * released multiple ListenableFuture.class files that are not byte-for-byte compatible even from
+ * the beginning, thanks to using different `-source -target` values for compiling our `-jre` and
+ * `-android` "flavors.")
+ *
+ * (We could consider releasing a listenablefuture:1.0.1 someday. But we would want to look into how
+ * that affects users, especially users of the Android Gradle Plugin, since the plugin developers
+ * put in a special hack for us: https://issuetracker.google.com/issues/131431257)
+ */
 @DoNotMock("Use the methods in Futures (like immediateFuture) or SettableFuture")
-public interface ListenableFuture<V> extends Future<V> {
+/*
+ * It would make sense to also annotate this class with @ElementTypesAreNonnullByDefault. However,
+ * it makes no difference because this class is already covered by the package-level
+ * @ParametersAreNonnullByDefault, and this class declares only parameters, not return types or
+ * fields. (Not to mention that we'll be removing all @*AreNonnullByDefault annotations after tools
+ * understand .) And it's fortunate that the annotation makes no difference, because
+ * we're seeing a breakage internally when we add that annotation :)
+ *
+ */
+public interface ListenableFuture<V extends @Nullable Object> extends Future<V> {
   /**
    * Registers a listener to be {@linkplain Executor#execute(Runnable) run} on the given executor.
    * The listener will run when the {@code Future}'s computation is {@linkplain Future#isDone()
diff --git a/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java b/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
index eccc4d3..9fdcc53 100644
--- a/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
+++ b/guava/src/com/google/common/util/concurrent/ListenableFutureTask.java
@@ -41,7 +41,9 @@
  * @since 1.0
  */
 @GwtIncompatible
-public class ListenableFutureTask<V> extends FutureTask<V> implements ListenableFuture<V> {
+@ElementTypesAreNonnullByDefault
+public class ListenableFutureTask<V extends @Nullable Object> extends FutureTask<V>
+    implements ListenableFuture<V> {
   // TODO(cpovirk): explore ways of making ListenableFutureTask final. There are some valid reasons
   // such as BoundedQueueExecutorService to allow extends but it would be nice to make it final to
   // avoid unintended usage.
@@ -56,7 +58,7 @@
    * @param callable the callable task
    * @since 10.0
    */
-  public static <V> ListenableFutureTask<V> create(Callable<V> callable) {
+  public static <V extends @Nullable Object> ListenableFutureTask<V> create(Callable<V> callable) {
     return new ListenableFutureTask<V>(callable);
   }
 
@@ -70,7 +72,8 @@
    *     ListenableFutureTask.create(runnable, null)}
    * @since 10.0
    */
-  public static <V> ListenableFutureTask<V> create(Runnable runnable, @Nullable V result) {
+  public static <V extends @Nullable Object> ListenableFutureTask<V> create(
+      Runnable runnable, @ParametricNullness V result) {
     return new ListenableFutureTask<V>(runnable, result);
   }
 
@@ -78,7 +81,7 @@
     super(callable);
   }
 
-  ListenableFutureTask(Runnable runnable, @Nullable V result) {
+  ListenableFutureTask(Runnable runnable, @ParametricNullness V result) {
     super(runnable, result);
   }
 
@@ -89,6 +92,7 @@
 
   @CanIgnoreReturnValue
   @Override
+  @ParametricNullness
   public V get(long timeout, TimeUnit unit)
       throws TimeoutException, InterruptedException, ExecutionException {
 
diff --git a/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java b/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
index 77fa5f7..e5aa5e3 100644
--- a/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
+++ b/guava/src/com/google/common/util/concurrent/ListenableScheduledFuture.java
@@ -17,6 +17,7 @@
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtCompatible;
 import java.util.concurrent.ScheduledFuture;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Helper interface to implement both {@link ListenableFuture} and {@link ScheduledFuture}.
@@ -26,4 +27,6 @@
  */
 @Beta
 @GwtCompatible
-public interface ListenableScheduledFuture<V> extends ScheduledFuture<V>, ListenableFuture<V> {}
+@ElementTypesAreNonnullByDefault
+public interface ListenableScheduledFuture<V extends @Nullable Object>
+    extends ScheduledFuture<V>, ListenableFuture<V> {}
diff --git a/guava/src/com/google/common/util/concurrent/ListenerCallQueue.java b/guava/src/com/google/common/util/concurrent/ListenerCallQueue.java
index ee6b5b9..ed8c906 100644
--- a/guava/src/com/google/common/util/concurrent/ListenerCallQueue.java
+++ b/guava/src/com/google/common/util/concurrent/ListenerCallQueue.java
@@ -53,6 +53,7 @@
  * #dispatch} is expected to be called concurrently, it is idempotent.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class ListenerCallQueue<L> {
   // TODO(cpovirk): consider using the logger associated with listener.getClass().
   private static final Logger logger = Logger.getLogger(ListenerCallQueue.class.getName());
@@ -123,7 +124,7 @@
 
   /**
    * A special purpose queue/executor that dispatches listener events serially on a configured
-   * executor. Each event event can be added and dispatched as separate phases.
+   * executor. Each event can be added and dispatched as separate phases.
    *
    * <p>This class is very similar to {@link SequentialExecutor} with the exception that events can
    * be added without necessarily executing immediately.
diff --git a/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java b/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java
index 469eb67..83ea759 100644
--- a/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java
+++ b/guava/src/com/google/common/util/concurrent/ListeningExecutorService.java
@@ -23,6 +23,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.TimeUnit;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An {@link ExecutorService} that returns {@link ListenableFuture} instances. To create an instance
@@ -36,13 +37,14 @@
     "Use TestingExecutors.sameThreadScheduledExecutor, or wrap a real Executor from "
         + "java.util.concurrent.Executors with MoreExecutors.listeningDecorator")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface ListeningExecutorService extends ExecutorService {
   /**
    * @return a {@code ListenableFuture} representing pending completion of the task
    * @throws RejectedExecutionException {@inheritDoc}
    */
   @Override
-  <T> ListenableFuture<T> submit(Callable<T> task);
+  <T extends @Nullable Object> ListenableFuture<T> submit(Callable<T> task);
 
   /**
    * @return a {@code ListenableFuture} representing pending completion of the task
@@ -56,7 +58,8 @@
    * @throws RejectedExecutionException {@inheritDoc}
    */
   @Override
-  <T> ListenableFuture<T> submit(Runnable task, T result);
+  <T extends @Nullable Object> ListenableFuture<T> submit(
+      Runnable task, @ParametricNullness T result);
 
   /**
    * {@inheritDoc}
@@ -77,7 +80,7 @@
    * @throws NullPointerException if any task is null
    */
   @Override
-  <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
+  <T extends @Nullable Object> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
       throws InterruptedException;
 
   /**
@@ -100,7 +103,7 @@
    * @throws NullPointerException if any task is null
    */
   @Override
-  <T> List<Future<T>> invokeAll(
+  <T extends @Nullable Object> List<Future<T>> invokeAll(
       Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
       throws InterruptedException;
 }
diff --git a/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java b/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java
index 6410e83..25185b9 100644
--- a/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java
+++ b/guava/src/com/google/common/util/concurrent/ListeningScheduledExecutorService.java
@@ -21,6 +21,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A {@link ScheduledExecutorService} that returns {@link ListenableFuture} instances from its
@@ -32,6 +33,7 @@
  * @since 10.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface ListeningScheduledExecutorService
     extends ScheduledExecutorService, ListeningExecutorService {
 
@@ -50,14 +52,16 @@
 
   /** @since 15.0 (previously returned ScheduledFuture) */
   @Override
-  <V> ListenableScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit);
+  <V extends @Nullable Object> ListenableScheduledFuture<V> schedule(
+      Callable<V> callable, long delay, TimeUnit unit);
 
   /**
    * Duration-based overload of {@link #schedule(Callable, long, TimeUnit)}.
    *
    * @since 29.0
    */
-  default <V> ListenableScheduledFuture<V> schedule(Callable<V> callable, Duration delay) {
+  default <V extends @Nullable Object> ListenableScheduledFuture<V> schedule(
+      Callable<V> callable, Duration delay) {
     return schedule(callable, toNanosSaturated(delay), TimeUnit.NANOSECONDS);
   }
 
diff --git a/guava/src/com/google/common/util/concurrent/Monitor.java b/guava/src/com/google/common/util/concurrent/Monitor.java
index dcdd7b6..6696b97 100644
--- a/guava/src/com/google/common/util/concurrent/Monitor.java
+++ b/guava/src/com/google/common/util/concurrent/Monitor.java
@@ -27,7 +27,7 @@
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.BooleanSupplier;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A synchronization abstraction supporting waiting on arbitrary boolean conditions.
@@ -203,6 +203,7 @@
 @Beta
 @GwtIncompatible
 @SuppressWarnings("GuardedBy") // TODO(b/35466881): Fix or suppress.
+@ElementTypesAreNonnullByDefault
 public final class Monitor {
   // TODO(user): Use raw LockSupport or AbstractQueuedSynchronizer instead of ReentrantLock.
   // TODO(user): "Port" jsr166 tests for ReentrantLock.
@@ -314,7 +315,7 @@
 
     /** The next active guard */
     @GuardedBy("monitor.lock")
-    @Nullable
+    @CheckForNull
     Guard next;
 
     protected Guard(Monitor monitor) {
@@ -341,6 +342,7 @@
    * A linked list threaded through the Guard.next field.
    */
   @GuardedBy("lock")
+  @CheckForNull
   private Guard activeGuards = null;
 
   /**
diff --git a/guava/src/com/google/common/util/concurrent/MoreExecutors.java b/guava/src/com/google/common/util/concurrent/MoreExecutors.java
index bc258ae..fc61fba 100644
--- a/guava/src/com/google/common/util/concurrent/MoreExecutors.java
+++ b/guava/src/com/google/common/util/concurrent/MoreExecutors.java
@@ -51,6 +51,7 @@
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Factory and utility methods for {@link java.util.concurrent.Executor}, {@link ExecutorService},
@@ -62,6 +63,7 @@
  * @since 3.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class MoreExecutors {
   private MoreExecutors() {}
 
@@ -453,6 +455,12 @@
    *       (In simple cases, callers can avoid this by registering all tasks with the same {@link
    *       MoreExecutors#newSequentialExecutor} wrapper around {@code directExecutor()}. More
    *       complex cases may require using thread pools or making deeper changes.)
+   *   <li>If an exception propagates out of a {@code Runnable}, it is not necessarily seen by any
+   *       {@code UncaughtExceptionHandler} for the thread. For example, if the callback passed to
+   *       {@link Futures#addCallback} throws an exception, that exception will be typically be
+   *       logged by the {@link ListenableFuture} implementation, even if the thread is configured
+   *       to do something different. In other cases, no code will catch the exception, and it may
+   *       terminate whichever thread happens to trigger the execution.
    * </ul>
    *
    * Additionally, beware of executing tasks with {@code directExecutor} while holding a lock. Since
@@ -472,7 +480,6 @@
    * <p>This should be preferred to {@link #newDirectExecutorService()} because implementing the
    * {@link ExecutorService} subinterface necessitates significant performance overhead.
    *
-   *
    * @since 18.0
    */
   public static Executor directExecutor() {
@@ -611,6 +618,11 @@
     public final void execute(Runnable command) {
       delegate.execute(command);
     }
+
+    @Override
+    public final String toString() {
+      return super.toString() + "[" + delegate + "]";
+    }
   }
 
   @GwtIncompatible // TODO
@@ -626,13 +638,14 @@
 
     @Override
     public ListenableScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
-      TrustedListenableFutureTask<Void> task = TrustedListenableFutureTask.create(command, null);
+      TrustedListenableFutureTask<@Nullable Void> task =
+          TrustedListenableFutureTask.create(command, null);
       ScheduledFuture<?> scheduled = delegate.schedule(task, delay, unit);
-      return new ListenableScheduledTask<>(task, scheduled);
+      return new ListenableScheduledTask<@Nullable Void>(task, scheduled);
     }
 
     @Override
-    public <V> ListenableScheduledFuture<V> schedule(
+    public <V extends @Nullable Object> ListenableScheduledFuture<V> schedule(
         Callable<V> callable, long delay, TimeUnit unit) {
       TrustedListenableFutureTask<V> task = TrustedListenableFutureTask.create(callable);
       ScheduledFuture<?> scheduled = delegate.schedule(task, delay, unit);
@@ -644,7 +657,7 @@
         Runnable command, long initialDelay, long period, TimeUnit unit) {
       NeverSuccessfulListenableFutureTask task = new NeverSuccessfulListenableFutureTask(command);
       ScheduledFuture<?> scheduled = delegate.scheduleAtFixedRate(task, initialDelay, period, unit);
-      return new ListenableScheduledTask<>(task, scheduled);
+      return new ListenableScheduledTask<@Nullable Void>(task, scheduled);
     }
 
     @Override
@@ -653,10 +666,10 @@
       NeverSuccessfulListenableFutureTask task = new NeverSuccessfulListenableFutureTask(command);
       ScheduledFuture<?> scheduled =
           delegate.scheduleWithFixedDelay(task, initialDelay, delay, unit);
-      return new ListenableScheduledTask<>(task, scheduled);
+      return new ListenableScheduledTask<@Nullable Void>(task, scheduled);
     }
 
-    private static final class ListenableScheduledTask<V>
+    private static final class ListenableScheduledTask<V extends @Nullable Object>
         extends SimpleForwardingListenableFuture<V> implements ListenableScheduledFuture<V> {
 
       private final ScheduledFuture<?> scheduledDelegate;
@@ -692,7 +705,7 @@
 
     @GwtIncompatible // TODO
     private static final class NeverSuccessfulListenableFutureTask
-        extends AbstractFuture.TrustedFuture<Void> implements Runnable {
+        extends AbstractFuture.TrustedFuture<@Nullable Void> implements Runnable {
       private final Runnable delegate;
 
       public NeverSuccessfulListenableFutureTask(Runnable delegate) {
@@ -708,6 +721,11 @@
           throw Throwables.propagate(t);
         }
       }
+
+      @Override
+      protected String pendingToString() {
+        return "task=[" + delegate + "]";
+      }
     }
   }
 
@@ -726,7 +744,9 @@
    * An implementation of {@link ExecutorService#invokeAny} for {@link ListeningExecutorService}
    * implementations.
    */
-  @GwtIncompatible static <T> T invokeAnyImpl(
+  @GwtIncompatible
+  @ParametricNullness
+  static <T extends @Nullable Object> T invokeAnyImpl(
       ListeningExecutorService executorService,
       Collection<? extends Callable<T>> tasks,
       boolean timed,
@@ -741,7 +761,9 @@
    * implementations.
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  @GwtIncompatible static <T> T invokeAnyImpl(
+  @GwtIncompatible
+  @ParametricNullness
+  static <T extends @Nullable Object> T invokeAnyImpl(
       ListeningExecutorService executorService,
       Collection<? extends Callable<T>> tasks,
       boolean timed,
@@ -821,7 +843,7 @@
    * Submits the task and adds a listener that adds the future to {@code queue} when it completes.
    */
   @GwtIncompatible // TODO
-  private static <T> ListenableFuture<T> submitAndAddQueueListener(
+  private static <T extends @Nullable Object> ListenableFuture<T> submitAndAddQueueListener(
       ListeningExecutorService executorService,
       Callable<T> task,
       final BlockingQueue<Future<T>> queue) {
@@ -933,7 +955,6 @@
    * right before each task is run. The renaming is best effort, if a {@link SecurityManager}
    * prevents the renaming then it will be skipped but the tasks will still execute.
    *
-   *
    * @param executor The executor to decorate
    * @param nameSupplier The source of names for each task
    */
@@ -957,7 +978,6 @@
    * right before each task is run. The renaming is best effort, if a {@link SecurityManager}
    * prevents the renaming then it will be skipped but the tasks will still execute.
    *
-   *
    * @param service The executor to decorate
    * @param nameSupplier The source of names for each task
    */
@@ -968,7 +988,7 @@
     checkNotNull(nameSupplier);
     return new WrappingExecutorService(service) {
       @Override
-      protected <T> Callable<T> wrapTask(Callable<T> callable) {
+      protected <T extends @Nullable Object> Callable<T> wrapTask(Callable<T> callable) {
         return Callables.threadRenaming(callable, nameSupplier);
       }
 
@@ -987,7 +1007,6 @@
    * right before each task is run. The renaming is best effort, if a {@link SecurityManager}
    * prevents the renaming then it will be skipped but the tasks will still execute.
    *
-   *
    * @param service The executor to decorate
    * @param nameSupplier The source of names for each task
    */
@@ -998,7 +1017,7 @@
     checkNotNull(nameSupplier);
     return new WrappingScheduledExecutorService(service) {
       @Override
-      protected <T> Callable<T> wrapTask(Callable<T> callable) {
+      protected <T extends @Nullable Object> Callable<T> wrapTask(Callable<T> callable) {
         return Callables.threadRenaming(callable, nameSupplier);
       }
 
diff --git a/guava/src/com/google/common/util/concurrent/NullnessCasts.java b/guava/src/com/google/common/util/concurrent/NullnessCasts.java
new file mode 100644
index 0000000..0a0d719
--- /dev/null
+++ b/guava/src/com/google/common/util/concurrent/NullnessCasts.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.util.concurrent;
+
+import com.google.common.annotations.GwtCompatible;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+/** A utility method to perform unchecked casts to suppress errors produced by nullness analyses. */
+@GwtCompatible
+@ElementTypesAreNonnullByDefault
+final class NullnessCasts {
+  /**
+   * Accepts a {@code @Nullable T} and returns a plain {@code T}, without performing any check that
+   * that conversion is safe.
+   *
+   * <p>This method is intended to help with usages of type parameters that have {@linkplain
+   * ParametricNullness parametric nullness}. If a type parameter instead ranges over only non-null
+   * types (or if the type is a non-variable type, like {@code String}), then code should almost
+   * never use this method, preferring instead to call {@code requireNonNull} so as to benefit from
+   * its runtime check.
+   *
+   * <p>An example use case for this method is in implementing an {@code Iterator<T>} whose {@code
+   * next} field is lazily initialized. The type of that field would be {@code @Nullable T}, and the
+   * code would be responsible for populating a "real" {@code T} (which might still be the value
+   * {@code null}!) before returning it to callers. Depending on how the code is structured, a
+   * nullness analysis might not understand that the field has been populated. To avoid that problem
+   * without having to add {@code @SuppressWarnings}, the code can call this method.
+   *
+   * <p>Why <i>not</i> just add {@code SuppressWarnings}? The problem is that this method is
+   * typically useful for {@code return} statements. That leaves the code with two options: Either
+   * add the suppression to the whole method (which turns off checking for a large section of code),
+   * or extract a variable, and put the suppression on that. However, a local variable typically
+   * doesn't work: Because nullness analyses typically infer the nullness of local variables,
+   * there's no way to assign a {@code @Nullable T} to a field {@code T foo;} and instruct the
+   * analysis that that means "plain {@code T}" rather than the inferred type {@code @Nullable T}.
+   * (Even if supported added {@code @NonNull}, that would not help, since the problem case
+   * addressed by this method is the case in which {@code T} has parametric nullness -- and thus its
+   * value may be legitimately {@code null}.)
+   */
+  @SuppressWarnings("nullness")
+  @ParametricNullness
+  static <T extends @Nullable Object> T uncheckedCastNullableTToT(@CheckForNull T t) {
+    return t;
+  }
+
+  /**
+   * Returns {@code null} cast to any type.
+   *
+   * <p>This method is intended to help with usages of type parameters that have {@linkplain
+   * ParametricNullness parametric nullness}. Sometimes, code may receive a null {@code T} but store
+   * a "null sentinel" to take its place. When the time comes to convert it back to a {@code T} to
+   * return to a caller, the code needs to a way to return {@code null} from a method that returns
+   * "plain {@code T}." This API provides that.
+   */
+  @SuppressWarnings("nullness")
+  @ParametricNullness
+  static <T extends @Nullable Object> T uncheckedNull() {
+    return null;
+  }
+
+  private NullnessCasts() {}
+}
diff --git a/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java b/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java
index aa07abf..3038ab7 100644
--- a/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java
+++ b/guava/src/com/google/common/util/concurrent/OverflowAvoidingLockSupport.java
@@ -17,19 +17,20 @@
 import static java.lang.Math.min;
 
 import java.util.concurrent.locks.LockSupport;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Works around an android bug, where parking for more than INT_MAX seconds can produce an abort
  * signal on 32 bit devices running Android Q.
  */
+@ElementTypesAreNonnullByDefault
 final class OverflowAvoidingLockSupport {
   // Represents the max nanoseconds representable on a linux timespec with a 32 bit tv_sec
   static final long MAX_NANOSECONDS_THRESHOLD = (1L + Integer.MAX_VALUE) * 1_000_000_000L - 1L;
 
   private OverflowAvoidingLockSupport() {}
 
-  static void parkNanos(@Nullable Object blocker, long nanos) {
+  static void parkNanos(@CheckForNull Object blocker, long nanos) {
     // Even in the extremely unlikely event that a thread unblocks itself early after only 68 years,
     // this is indistinguishable from a spurious wakeup, which LockSupport allows.
     LockSupport.parkNanos(blocker, min(nanos, MAX_NANOSECONDS_THRESHOLD));
diff --git a/guava/src/com/google/common/util/concurrent/ParametricNullness.java b/guava/src/com/google/common/util/concurrent/ParametricNullness.java
new file mode 100644
index 0000000..ebc5928
--- /dev/null
+++ b/guava/src/com/google/common/util/concurrent/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.util.concurrent;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/util/concurrent/Partially.java b/guava/src/com/google/common/util/concurrent/Partially.java
index c40ab4e..7aa16e7 100644
--- a/guava/src/com/google/common/util/concurrent/Partially.java
+++ b/guava/src/com/google/common/util/concurrent/Partially.java
@@ -32,6 +32,7 @@
  * version.
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 final class Partially {
   /**
    * The presence of this annotation on an API indicates that the method <i>may</i> be used with the
diff --git a/guava/src/com/google/common/util/concurrent/Platform.java b/guava/src/com/google/common/util/concurrent/Platform.java
index f27bfb3..cfb96a0 100644
--- a/guava/src/com/google/common/util/concurrent/Platform.java
+++ b/guava/src/com/google/common/util/concurrent/Platform.java
@@ -15,13 +15,14 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtCompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /** Methods factored out so that they can be emulated differently in GWT. */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 final class Platform {
   static boolean isInstanceOfThrowableClass(
-      @Nullable Throwable t, Class<? extends Throwable> expectedClass) {
+      @CheckForNull Throwable t, Class<? extends Throwable> expectedClass) {
     return expectedClass.isInstance(t);
   }
 
diff --git a/guava/src/com/google/common/util/concurrent/RateLimiter.java b/guava/src/com/google/common/util/concurrent/RateLimiter.java
index ec041d4..4b8b025 100644
--- a/guava/src/com/google/common/util/concurrent/RateLimiter.java
+++ b/guava/src/com/google/common/util/concurrent/RateLimiter.java
@@ -31,7 +31,7 @@
 import java.time.Duration;
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * A rate limiter. Conceptually, a rate limiter distributes permits at a configurable rate. Each
@@ -94,6 +94,7 @@
 // would mean a maximum rate of "1MB/s", which might be small in some cases.
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class RateLimiter {
   /**
    * Creates a {@code RateLimiter} with the specified stable throughput, given as "permits per
@@ -214,7 +215,7 @@
   private final SleepingStopwatch stopwatch;
 
   // Can't be initialized in the constructor because mocks don't call the constructor.
-  private volatile @Nullable Object mutexDoNotUseDirectly;
+  @CheckForNull private volatile Object mutexDoNotUseDirectly;
 
   private Object mutex() {
     Object mutex = mutexDoNotUseDirectly;
diff --git a/guava/src/com/google/common/util/concurrent/Runnables.java b/guava/src/com/google/common/util/concurrent/Runnables.java
index e1ebd23..5503f68 100644
--- a/guava/src/com/google/common/util/concurrent/Runnables.java
+++ b/guava/src/com/google/common/util/concurrent/Runnables.java
@@ -24,6 +24,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public final class Runnables {
 
   private static final Runnable EMPTY_RUNNABLE =
diff --git a/guava/src/com/google/common/util/concurrent/SequentialExecutor.java b/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
index 5604175..052c7e0 100644
--- a/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
+++ b/guava/src/com/google/common/util/concurrent/SequentialExecutor.java
@@ -31,6 +31,7 @@
 import java.util.concurrent.RejectedExecutionException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
 
 /**
  * Executor ensuring that all Runnables submitted are executed in order, using the provided
@@ -47,6 +48,7 @@
  * restarted by a call to {@link #execute}.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 final class SequentialExecutor implements Executor {
   private static final Logger log = Logger.getLogger(SequentialExecutor.class.getName());
 
@@ -91,7 +93,7 @@
    * Adds a task to the queue and makes sure a worker thread is running.
    *
    * <p>If this method throws, e.g. a {@code RejectedExecutionException} from the delegate executor,
-   * execution of tasks will stop until a call to this method or to {@link #resume()} is made.
+   * execution of tasks will stop until a call to this method is made.
    */
   @Override
   public void execute(final Runnable task) {
@@ -170,7 +172,7 @@
 
   /** Worker that runs tasks from {@link #queue} until it is empty. */
   private final class QueueWorker implements Runnable {
-    Runnable task;
+    @CheckForNull Runnable task;
 
     @Override
     public void run() {
diff --git a/guava/src/com/google/common/util/concurrent/Service.java b/guava/src/com/google/common/util/concurrent/Service.java
index 3c4c476..dd0c7e6 100644
--- a/guava/src/com/google/common/util/concurrent/Service.java
+++ b/guava/src/com/google/common/util/concurrent/Service.java
@@ -56,6 +56,7 @@
  */
 @DoNotMock("Create an AbstractIdleService")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface Service {
   /**
    * If the service state is {@link State#NEW}, this initiates service startup and returns
@@ -206,61 +207,28 @@
    */
   enum State {
     /** A service in this state is inactive. It does minimal work and consumes minimal resources. */
-    NEW {
-      @Override
-      boolean isTerminal() {
-        return false;
-      }
-    },
+    NEW,
 
     /** A service in this state is transitioning to {@link #RUNNING}. */
-    STARTING {
-      @Override
-      boolean isTerminal() {
-        return false;
-      }
-    },
+    STARTING,
 
     /** A service in this state is operational. */
-    RUNNING {
-      @Override
-      boolean isTerminal() {
-        return false;
-      }
-    },
+    RUNNING,
 
     /** A service in this state is transitioning to {@link #TERMINATED}. */
-    STOPPING {
-      @Override
-      boolean isTerminal() {
-        return false;
-      }
-    },
+    STOPPING,
 
     /**
      * A service in this state has completed execution normally. It does minimal work and consumes
      * minimal resources.
      */
-    TERMINATED {
-      @Override
-      boolean isTerminal() {
-        return true;
-      }
-    },
+    TERMINATED,
 
     /**
      * A service in this state has encountered a problem and may not be operational. It cannot be
      * started nor stopped.
      */
-    FAILED {
-      @Override
-      boolean isTerminal() {
-        return true;
-      }
-    };
-
-    /** Returns true if this state is terminal. */
-    abstract boolean isTerminal();
+    FAILED,
   }
 
   /**
diff --git a/guava/src/com/google/common/util/concurrent/ServiceManager.java b/guava/src/com/google/common/util/concurrent/ServiceManager.java
index e5b468f..d2dda7a 100644
--- a/guava/src/com/google/common/util/concurrent/ServiceManager.java
+++ b/guava/src/com/google/common/util/concurrent/ServiceManager.java
@@ -51,6 +51,7 @@
 import com.google.common.util.concurrent.Service.State;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
 import com.google.errorprone.annotations.concurrent.GuardedBy;
+import com.google.j2objc.annotations.J2ObjCIncompatible;
 import com.google.j2objc.annotations.WeakOuter;
 import java.lang.ref.WeakReference;
 import java.time.Duration;
@@ -120,6 +121,7 @@
  * @since 14.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ServiceManager implements ServiceManagerBridge {
   private static final Logger logger = Logger.getLogger(ServiceManager.class.getName());
   private static final ListenerCallQueue.Event<Listener> HEALTHY_EVENT =
@@ -413,6 +415,20 @@
     return state.startupTimes();
   }
 
+  /**
+   * Returns the service load times. This value will only return startup times for services that
+   * have finished starting.
+   *
+   * @return Map of services and their corresponding startup time, the map entries will be ordered
+   *     by startup time.
+   * @since 31.0
+   */
+  @J2ObjCIncompatible
+  public ImmutableMap<Service, Duration> startupDurations() {
+    return ImmutableMap.copyOf(
+        Maps.<Service, Long, Duration>transformValues(startupTimes(), Duration::ofMillis));
+  }
+
   @Override
   public String toString() {
     return MoreObjects.toStringHelper(ServiceManager.class)
@@ -625,9 +641,9 @@
         // N.B. There will only be an entry in the map if the service has started
         for (Entry<Service, Stopwatch> entry : startupTimers.entrySet()) {
           Service service = entry.getKey();
-          Stopwatch stopWatch = entry.getValue();
-          if (!stopWatch.isRunning() && !(service instanceof NoOpService)) {
-            loadTimes.add(Maps.immutableEntry(service, stopWatch.elapsed(MILLISECONDS)));
+          Stopwatch stopwatch = entry.getValue();
+          if (!stopwatch.isRunning() && !(service instanceof NoOpService)) {
+            loadTimes.add(Maps.immutableEntry(service, stopwatch.elapsed(MILLISECONDS)));
           }
         }
       } finally {
diff --git a/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java b/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java
index a9300a6..7ae430e 100644
--- a/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java
+++ b/guava/src/com/google/common/util/concurrent/ServiceManagerBridge.java
@@ -26,6 +26,7 @@
  * {@code servicesByState()} to return {@code ImmutableMultimap}.
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 interface ServiceManagerBridge {
   ImmutableMultimap<State, Service> servicesByState();
 }
diff --git a/guava/src/com/google/common/util/concurrent/SettableFuture.java b/guava/src/com/google/common/util/concurrent/SettableFuture.java
index a0f4732..893161e 100644
--- a/guava/src/com/google/common/util/concurrent/SettableFuture.java
+++ b/guava/src/com/google/common/util/concurrent/SettableFuture.java
@@ -33,17 +33,19 @@
  * @since 9.0 (in 1.0 as {@code ValueFuture})
  */
 @GwtCompatible
-public final class SettableFuture<V> extends AbstractFuture.TrustedFuture<V> {
+@ElementTypesAreNonnullByDefault
+public final class SettableFuture<V extends @Nullable Object>
+    extends AbstractFuture.TrustedFuture<V> {
   /**
    * Creates a new {@code SettableFuture} that can be completed or cancelled by a later method call.
    */
-  public static <V> SettableFuture<V> create() {
+  public static <V extends @Nullable Object> SettableFuture<V> create() {
     return new SettableFuture<V>();
   }
 
   @CanIgnoreReturnValue
   @Override
-  public boolean set(@Nullable V value) {
+  public boolean set(@ParametricNullness V value) {
     return super.set(value);
   }
 
diff --git a/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java b/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
index 9d0b81b..5a1969e 100644
--- a/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
+++ b/guava/src/com/google/common/util/concurrent/SimpleTimeLimiter.java
@@ -34,6 +34,8 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import javax.annotation.CheckForNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A TimeLimiter that runs method calls in the background using an {@link ExecutorService}. If the
@@ -45,6 +47,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class SimpleTimeLimiter implements TimeLimiter {
 
   private final ExecutorService executor;
@@ -85,11 +88,14 @@
     InvocationHandler handler =
         new InvocationHandler() {
           @Override
-          public Object invoke(Object obj, final Method method, final Object[] args)
+          @CheckForNull
+          public Object invoke(
+              Object obj, final Method method, @CheckForNull final @Nullable Object[] args)
               throws Throwable {
-            Callable<Object> callable =
-                new Callable<Object>() {
+            Callable<@Nullable Object> callable =
+                new Callable<@Nullable Object>() {
                   @Override
+                  @CheckForNull
                   public Object call() throws Exception {
                     try {
                       return method.invoke(target, args);
@@ -113,7 +119,7 @@
     return interfaceType.cast(object);
   }
 
-  private <T> T callWithTimeout(
+  private <T extends @Nullable Object> T callWithTimeout(
       Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit, boolean amInterruptible)
       throws Exception {
     checkNotNull(callable);
@@ -143,7 +149,8 @@
 
   @CanIgnoreReturnValue
   @Override
-  public <T> T callWithTimeout(Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
+  public <T extends @Nullable Object> T callWithTimeout(
+      Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException, InterruptedException, ExecutionException {
     checkNotNull(callable);
     checkNotNull(timeoutUnit);
@@ -164,7 +171,7 @@
 
   @CanIgnoreReturnValue
   @Override
-  public <T> T callUninterruptiblyWithTimeout(
+  public <T extends @Nullable Object> T callUninterruptiblyWithTimeout(
       Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException, ExecutionException {
     checkNotNull(callable);
diff --git a/guava/src/com/google/common/util/concurrent/SmoothRateLimiter.java b/guava/src/com/google/common/util/concurrent/SmoothRateLimiter.java
index d78d7da..ca78905 100644
--- a/guava/src/com/google/common/util/concurrent/SmoothRateLimiter.java
+++ b/guava/src/com/google/common/util/concurrent/SmoothRateLimiter.java
@@ -22,14 +22,15 @@
 import java.util.concurrent.TimeUnit;
 
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class SmoothRateLimiter extends RateLimiter {
   /*
    * How is the RateLimiter designed, and why?
    *
-   * The primary feature of a RateLimiter is its "stable rate", the maximum rate that is should
-   * allow at normal conditions. This is enforced by "throttling" incoming requests as needed, i.e.
-   * compute, for an incoming request, the appropriate throttle time, and make the calling thread
-   * wait as much.
+   * The primary feature of a RateLimiter is its "stable rate", the maximum rate that it should
+   * allow in normal conditions. This is enforced by "throttling" incoming requests as needed. For
+   * example, we could compute the appropriate throttle time for an incoming request, and make the
+   * calling thread wait for that time.
    *
    * The simplest way to maintain a rate of QPS is to keep the timestamp of the last granted
    * request, and ensure that (1/QPS) seconds have elapsed since then. For example, for a rate of
diff --git a/guava/src/com/google/common/util/concurrent/Striped.java b/guava/src/com/google/common/util/concurrent/Striped.java
index c9ba772..fc8bcd8 100644
--- a/guava/src/com/google/common/util/concurrent/Striped.java
+++ b/guava/src/com/google/common/util/concurrent/Striped.java
@@ -14,6 +14,8 @@
 
 package com.google.common.util.concurrent;
 
+import static com.google.common.collect.Lists.newArrayList;
+
 import com.google.common.annotations.Beta;
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
@@ -21,7 +23,6 @@
 import com.google.common.base.Preconditions;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.MapMaker;
 import com.google.common.math.IntMath;
 import com.google.common.primitives.Ints;
@@ -40,6 +41,7 @@
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * A striped {@code Lock/Semaphore/ReadWriteLock}. This offers the underlying lock striping similar
@@ -82,6 +84,7 @@
  */
 @Beta
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public abstract class Striped<L> {
   /**
    * If there are at least this many stripes, we assume the memory usage of a ConcurrentMap will be
@@ -136,26 +139,26 @@
    * @return the stripes corresponding to the objects (one per each object, derived by delegating to
    *     {@link #get(Object)}; may contain duplicates), in an increasing index order.
    */
-  public Iterable<L> bulkGet(Iterable<?> keys) {
-    // Initially using the array to store the keys, then reusing it to store the respective L's
-    final Object[] array = Iterables.toArray(keys, Object.class);
-    if (array.length == 0) {
+  public Iterable<L> bulkGet(Iterable<? extends Object> keys) {
+    // Initially using the list to store the keys, then reusing it to store the respective L's
+    List<Object> result = newArrayList(keys);
+    if (result.isEmpty()) {
       return ImmutableList.of();
     }
-    int[] stripes = new int[array.length];
-    for (int i = 0; i < array.length; i++) {
-      stripes[i] = indexFor(array[i]);
+    int[] stripes = new int[result.size()];
+    for (int i = 0; i < result.size(); i++) {
+      stripes[i] = indexFor(result.get(i));
     }
     Arrays.sort(stripes);
     // optimize for runs of identical stripes
     int previousStripe = stripes[0];
-    array[0] = getAt(previousStripe);
-    for (int i = 1; i < array.length; i++) {
+    result.set(0, getAt(previousStripe));
+    for (int i = 1; i < result.size(); i++) {
       int currentStripe = stripes[i];
       if (currentStripe == previousStripe) {
-        array[i] = array[i - 1];
+        result.set(i, result.get(i - 1));
       } else {
-        array[i] = getAt(currentStripe);
+        result.set(i, getAt(currentStripe));
         previousStripe = currentStripe;
       }
     }
@@ -177,8 +180,8 @@
      * be garbage collected after locking them, ending up in a huge mess.
      */
     @SuppressWarnings("unchecked") // we carefully replaced all keys with their respective L's
-    List<L> asList = (List<L>) Arrays.asList(array);
-    return Collections.unmodifiableList(asList);
+    List<L> asStripes = (List<L>) result;
+    return Collections.unmodifiableList(asStripes);
   }
 
   // Static factories
@@ -435,7 +438,7 @@
    */
   @VisibleForTesting
   static class SmallLazyStriped<L> extends PowerOfTwoStriped<L> {
-    final AtomicReferenceArray<ArrayReference<? extends L>> locks;
+    final AtomicReferenceArray<@Nullable ArrayReference<? extends L>> locks;
     final Supplier<L> supplier;
     final int size;
     final ReferenceQueue<L> queue = new ReferenceQueue<L>();
diff --git a/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java b/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
index f09ed4e..1027f3c 100644
--- a/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
+++ b/guava/src/com/google/common/util/concurrent/ThreadFactoryBuilder.java
@@ -16,6 +16,7 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -25,6 +26,7 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.atomic.AtomicLong;
+import javax.annotation.CheckForNull;
 
 /**
  * A ThreadFactory builder, providing any combination of these features:
@@ -45,12 +47,13 @@
  */
 @CanIgnoreReturnValue
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class ThreadFactoryBuilder {
-  private String nameFormat = null;
-  private Boolean daemon = null;
-  private Integer priority = null;
-  private UncaughtExceptionHandler uncaughtExceptionHandler = null;
-  private ThreadFactory backingThreadFactory = null;
+  @CheckForNull private String nameFormat = null;
+  @CheckForNull private Boolean daemon = null;
+  @CheckForNull private Integer priority = null;
+  @CheckForNull private UncaughtExceptionHandler uncaughtExceptionHandler = null;
+  @CheckForNull private ThreadFactory backingThreadFactory = null;
 
   /** Creates a new {@link ThreadFactory} builder. */
   public ThreadFactoryBuilder() {}
@@ -162,7 +165,8 @@
       public Thread newThread(Runnable runnable) {
         Thread thread = backingThreadFactory.newThread(runnable);
         if (nameFormat != null) {
-          thread.setName(format(nameFormat, count.getAndIncrement()));
+          // requireNonNull is safe because we create `count` if (and only if) we have a nameFormat.
+          thread.setName(format(nameFormat, requireNonNull(count).getAndIncrement()));
         }
         if (daemon != null) {
           thread.setDaemon(daemon);
diff --git a/guava/src/com/google/common/util/concurrent/TimeLimiter.java b/guava/src/com/google/common/util/concurrent/TimeLimiter.java
index 600c6cf..0245fec 100644
--- a/guava/src/com/google/common/util/concurrent/TimeLimiter.java
+++ b/guava/src/com/google/common/util/concurrent/TimeLimiter.java
@@ -25,6 +25,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Imposes a time limit on method calls.
@@ -36,6 +37,7 @@
 @Beta
 @DoNotMock("Use FakeTimeLimiter")
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public interface TimeLimiter {
 
   /**
@@ -144,7 +146,8 @@
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   @CanIgnoreReturnValue
-  <T> T callWithTimeout(Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
+  <T extends @Nullable Object> T callWithTimeout(
+      Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException, InterruptedException, ExecutionException;
 
   /**
@@ -164,7 +167,7 @@
    * @since 28.0
    */
   @CanIgnoreReturnValue
-  default <T> T callWithTimeout(Callable<T> callable, Duration timeout)
+  default <T extends @Nullable Object> T callWithTimeout(Callable<T> callable, Duration timeout)
       throws TimeoutException, InterruptedException, ExecutionException {
     return callWithTimeout(callable, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
   }
@@ -190,7 +193,7 @@
    */
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
   @CanIgnoreReturnValue
-  <T> T callUninterruptiblyWithTimeout(
+  <T extends @Nullable Object> T callUninterruptiblyWithTimeout(
       Callable<T> callable, long timeoutDuration, TimeUnit timeoutUnit)
       throws TimeoutException, ExecutionException;
 
@@ -213,8 +216,8 @@
    * @since 28.0
    */
   @CanIgnoreReturnValue
-  default <T> T callUninterruptiblyWithTimeout(Callable<T> callable, Duration timeout)
-      throws TimeoutException, ExecutionException {
+  default <T extends @Nullable Object> T callUninterruptiblyWithTimeout(
+      Callable<T> callable, Duration timeout) throws TimeoutException, ExecutionException {
     return callUninterruptiblyWithTimeout(
         callable, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
   }
diff --git a/guava/src/com/google/common/util/concurrent/TimeoutFuture.java b/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
index af30d1f..219a098 100644
--- a/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
+++ b/guava/src/com/google/common/util/concurrent/TimeoutFuture.java
@@ -24,6 +24,7 @@
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -34,8 +35,9 @@
  * interrupted and cancelled if it times out.
  */
 @GwtIncompatible
-final class TimeoutFuture<V> extends FluentFuture.TrustedFuture<V> {
-  static <V> ListenableFuture<V> create(
+@ElementTypesAreNonnullByDefault
+final class TimeoutFuture<V extends @Nullable Object> extends FluentFuture.TrustedFuture<V> {
+  static <V extends @Nullable Object> ListenableFuture<V> create(
       ListenableFuture<V> delegate,
       long time,
       TimeUnit unit,
@@ -71,16 +73,16 @@
    * write-barriers).
    */
 
-  private @Nullable ListenableFuture<V> delegateRef;
-  private @Nullable ScheduledFuture<?> timer;
+  @CheckForNull private ListenableFuture<V> delegateRef;
+  @CheckForNull private ScheduledFuture<?> timer;
 
   private TimeoutFuture(ListenableFuture<V> delegate) {
     this.delegateRef = Preconditions.checkNotNull(delegate);
   }
 
   /** A runnable that is called when the delegate or the timer completes. */
-  private static final class Fire<V> implements Runnable {
-    @Nullable TimeoutFuture<V> timeoutFutureRef;
+  private static final class Fire<V extends @Nullable Object> implements Runnable {
+    @CheckForNull TimeoutFuture<V> timeoutFutureRef;
 
     Fire(TimeoutFuture<V> timeoutFuture) {
       this.timeoutFutureRef = timeoutFuture;
@@ -152,6 +154,7 @@
   }
 
   @Override
+  @CheckForNull
   protected String pendingToString() {
     ListenableFuture<? extends V> localInputFuture = delegateRef;
     ScheduledFuture<?> localTimer = timer;
diff --git a/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java b/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
index 3a607c5..a2c2115 100644
--- a/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
+++ b/guava/src/com/google/common/util/concurrent/TrustedListenableFutureTask.java
@@ -21,6 +21,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executors;
 import java.util.concurrent.RunnableFuture;
+import javax.annotation.CheckForNull;
 import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
@@ -30,14 +31,16 @@
  * performance reasons.
  */
 @GwtCompatible
-class TrustedListenableFutureTask<V> extends FluentFuture.TrustedFuture<V>
+@ElementTypesAreNonnullByDefault
+class TrustedListenableFutureTask<V extends @Nullable Object> extends FluentFuture.TrustedFuture<V>
     implements RunnableFuture<V> {
 
-  static <V> TrustedListenableFutureTask<V> create(AsyncCallable<V> callable) {
+  static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(
+      AsyncCallable<V> callable) {
     return new TrustedListenableFutureTask<V>(callable);
   }
 
-  static <V> TrustedListenableFutureTask<V> create(Callable<V> callable) {
+  static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(Callable<V> callable) {
     return new TrustedListenableFutureTask<V>(callable);
   }
 
@@ -50,7 +53,8 @@
    *     result, consider using constructions of the form: {@code ListenableFuture<?> f =
    *     ListenableFutureTask.create(runnable, null)}
    */
-  static <V> TrustedListenableFutureTask<V> create(Runnable runnable, @Nullable V result) {
+  static <V extends @Nullable Object> TrustedListenableFutureTask<V> create(
+      Runnable runnable, @ParametricNullness V result) {
     return new TrustedListenableFutureTask<V>(Executors.callable(runnable, result));
   }
 
@@ -61,7 +65,7 @@
    * <p>{@code volatile} is required for j2objc transpiling:
    * https://developers.google.com/j2objc/guides/j2objc-memory-model#atomicity
    */
-  private volatile InterruptibleTask<?> task;
+  @CheckForNull private volatile InterruptibleTask<?> task;
 
   TrustedListenableFutureTask(Callable<V> callable) {
     this.task = new TrustedFutureInterruptibleTask(callable);
@@ -73,7 +77,7 @@
 
   @Override
   public void run() {
-    InterruptibleTask localTask = task;
+    InterruptibleTask<?> localTask = task;
     if (localTask != null) {
       localTask.run();
     }
@@ -89,7 +93,7 @@
     super.afterDone();
 
     if (wasInterrupted()) {
-      InterruptibleTask localTask = task;
+      InterruptibleTask<?> localTask = task;
       if (localTask != null) {
         localTask.interruptTask();
       }
@@ -99,8 +103,9 @@
   }
 
   @Override
+  @CheckForNull
   protected String pendingToString() {
-    InterruptibleTask localTask = task;
+    InterruptibleTask<?> localTask = task;
     if (localTask != null) {
       return "task=[" + localTask + "]";
     }
@@ -121,17 +126,19 @@
     }
 
     @Override
+    @ParametricNullness
     V runInterruptibly() throws Exception {
       return callable.call();
     }
 
     @Override
-    void afterRanInterruptibly(V result, Throwable error) {
-      if (error == null) {
-        TrustedListenableFutureTask.this.set(result);
-      } else {
-        setException(error);
-      }
+    void afterRanInterruptiblySuccess(@ParametricNullness V result) {
+      TrustedListenableFutureTask.this.set(result);
+    }
+
+    @Override
+    void afterRanInterruptiblyFailure(Throwable error) {
+      setException(error);
     }
 
     @Override
@@ -164,12 +171,13 @@
     }
 
     @Override
-    void afterRanInterruptibly(ListenableFuture<V> result, Throwable error) {
-      if (error == null) {
-        setFuture(result);
-      } else {
-        setException(error);
-      }
+    void afterRanInterruptiblySuccess(ListenableFuture<V> result) {
+      setFuture(result);
+    }
+
+    @Override
+    void afterRanInterruptiblyFailure(Throwable error) {
+      setException(error);
     }
 
     @Override
diff --git a/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java b/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java
index c0c2600..a1add8b 100644
--- a/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java
+++ b/guava/src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java
@@ -29,6 +29,7 @@
  * @since 8.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public final class UncaughtExceptionHandlers {
   private UncaughtExceptionHandlers() {}
 
diff --git a/guava/src/com/google/common/util/concurrent/UncheckedExecutionException.java b/guava/src/com/google/common/util/concurrent/UncheckedExecutionException.java
index c6c57d3..713f4a6 100644
--- a/guava/src/com/google/common/util/concurrent/UncheckedExecutionException.java
+++ b/guava/src/com/google/common/util/concurrent/UncheckedExecutionException.java
@@ -15,7 +15,7 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtCompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Unchecked variant of {@link java.util.concurrent.ExecutionException}. As with {@code
@@ -33,22 +33,29 @@
  * @since 10.0
  */
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class UncheckedExecutionException extends RuntimeException {
+  /*
+   * Ideally, this class would have exposed only constructors that require a non-null cause. We
+   * might try to move in that direction, but there are complications. See
+   * https://github.com/jspecify/nullness-checker-for-checker-framework/blob/61aafa4ae52594830cfc2d61c8b113009dbdb045/src/main/java/com/google/jspecify/nullness/NullSpecTransfer.java#L789
+   */
+
   /** Creates a new instance with {@code null} as its detail message. */
   protected UncheckedExecutionException() {}
 
   /** Creates a new instance with the given detail message. */
-  protected UncheckedExecutionException(@Nullable String message) {
+  protected UncheckedExecutionException(@CheckForNull String message) {
     super(message);
   }
 
   /** Creates a new instance with the given detail message and cause. */
-  public UncheckedExecutionException(@Nullable String message, @Nullable Throwable cause) {
+  public UncheckedExecutionException(@CheckForNull String message, @CheckForNull Throwable cause) {
     super(message, cause);
   }
 
   /** Creates a new instance with the given cause. */
-  public UncheckedExecutionException(@Nullable Throwable cause) {
+  public UncheckedExecutionException(@CheckForNull Throwable cause) {
     super(cause);
   }
 
diff --git a/guava/src/com/google/common/util/concurrent/UncheckedTimeoutException.java b/guava/src/com/google/common/util/concurrent/UncheckedTimeoutException.java
index 04fddf4..8e30fca 100644
--- a/guava/src/com/google/common/util/concurrent/UncheckedTimeoutException.java
+++ b/guava/src/com/google/common/util/concurrent/UncheckedTimeoutException.java
@@ -15,7 +15,7 @@
 package com.google.common.util.concurrent;
 
 import com.google.common.annotations.GwtIncompatible;
-import org.checkerframework.checker.nullness.qual.Nullable;
+import javax.annotation.CheckForNull;
 
 /**
  * Unchecked version of {@link java.util.concurrent.TimeoutException}.
@@ -24,18 +24,19 @@
  * @since 1.0
  */
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 public class UncheckedTimeoutException extends RuntimeException {
   public UncheckedTimeoutException() {}
 
-  public UncheckedTimeoutException(@Nullable String message) {
+  public UncheckedTimeoutException(@CheckForNull String message) {
     super(message);
   }
 
-  public UncheckedTimeoutException(@Nullable Throwable cause) {
+  public UncheckedTimeoutException(@CheckForNull Throwable cause) {
     super(cause);
   }
 
-  public UncheckedTimeoutException(@Nullable String message, @Nullable Throwable cause) {
+  public UncheckedTimeoutException(@CheckForNull String message, @CheckForNull Throwable cause) {
     super(message, cause);
   }
 
diff --git a/guava/src/com/google/common/util/concurrent/Uninterruptibles.java b/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
index 0ce6f1a..94678ec 100644
--- a/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
+++ b/guava/src/com/google/common/util/concurrent/Uninterruptibles.java
@@ -35,6 +35,7 @@
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * Utilities for treating interruptible operations as uninterruptible. In all cases, if a thread is
@@ -45,6 +46,7 @@
  * @since 10.0
  */
 @GwtCompatible(emulated = true)
+@ElementTypesAreNonnullByDefault
 public final class Uninterruptibles {
 
   // Implementation Note: As of 3-7-11, the logic for each blocking/timeout
@@ -232,7 +234,9 @@
    * @throws CancellationException if the computation was cancelled
    */
   @CanIgnoreReturnValue
-  public static <V> V getUninterruptibly(Future<V> future) throws ExecutionException {
+  @ParametricNullness
+  public static <V extends @Nullable Object> V getUninterruptibly(Future<V> future)
+      throws ExecutionException {
     boolean interrupted = false;
     try {
       while (true) {
@@ -271,8 +275,9 @@
   @CanIgnoreReturnValue
   @GwtIncompatible // java.time.Duration
   @Beta
-  public static <V> V getUninterruptibly(Future<V> future, Duration timeout)
-      throws ExecutionException, TimeoutException {
+  @ParametricNullness
+  public static <V extends @Nullable Object> V getUninterruptibly(
+      Future<V> future, Duration timeout) throws ExecutionException, TimeoutException {
     return getUninterruptibly(future, toNanosSaturated(timeout), TimeUnit.NANOSECONDS);
   }
 
@@ -297,8 +302,9 @@
   @CanIgnoreReturnValue
   @GwtIncompatible // TODO
   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
-  public static <V> V getUninterruptibly(Future<V> future, long timeout, TimeUnit unit)
-      throws ExecutionException, TimeoutException {
+  @ParametricNullness
+  public static <V extends @Nullable Object> V getUninterruptibly(
+      Future<V> future, long timeout, TimeUnit unit) throws ExecutionException, TimeoutException {
     boolean interrupted = false;
     try {
       long remainingNanos = unit.toNanos(timeout);
diff --git a/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java b/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
index 217e0a7..03c08cc 100644
--- a/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
+++ b/guava/src/com/google/common/util/concurrent/WrappingExecutorService.java
@@ -29,6 +29,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An abstract {@code ExecutorService} that allows subclasses to {@linkplain #wrapTask(Callable)
@@ -42,6 +43,7 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class WrappingExecutorService implements ExecutorService {
   private final ExecutorService delegate;
 
@@ -53,7 +55,7 @@
    * Wraps a {@code Callable} for submission to the underlying executor. This method is also applied
    * to any {@code Runnable} passed to the default implementation of {@link #wrapTask(Runnable)}.
    */
-  protected abstract <T> Callable<T> wrapTask(Callable<T> callable);
+  protected abstract <T extends @Nullable Object> Callable<T> wrapTask(Callable<T> callable);
 
   /**
    * Wraps a {@code Runnable} for submission to the underlying executor. The default implementation
@@ -79,7 +81,8 @@
    *
    * @throws NullPointerException if any element of {@code tasks} is null
    */
-  private <T> ImmutableList<Callable<T>> wrapTasks(Collection<? extends Callable<T>> tasks) {
+  private <T extends @Nullable Object> ImmutableList<Callable<T>> wrapTasks(
+      Collection<? extends Callable<T>> tasks) {
     ImmutableList.Builder<Callable<T>> builder = ImmutableList.builder();
     for (Callable<T> task : tasks) {
       builder.add(wrapTask(task));
@@ -94,7 +97,7 @@
   }
 
   @Override
-  public final <T> Future<T> submit(Callable<T> task) {
+  public final <T extends @Nullable Object> Future<T> submit(Callable<T> task) {
     return delegate.submit(wrapTask(checkNotNull(task)));
   }
 
@@ -104,31 +107,33 @@
   }
 
   @Override
-  public final <T> Future<T> submit(Runnable task, T result) {
+  public final <T extends @Nullable Object> Future<T> submit(
+      Runnable task, @ParametricNullness T result) {
     return delegate.submit(wrapTask(task), result);
   }
 
   @Override
-  public final <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
-      throws InterruptedException {
+  public final <T extends @Nullable Object> List<Future<T>> invokeAll(
+      Collection<? extends Callable<T>> tasks) throws InterruptedException {
     return delegate.invokeAll(wrapTasks(tasks));
   }
 
   @Override
-  public final <T> List<Future<T>> invokeAll(
+  public final <T extends @Nullable Object> List<Future<T>> invokeAll(
       Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
       throws InterruptedException {
     return delegate.invokeAll(wrapTasks(tasks), timeout, unit);
   }
 
   @Override
-  public final <T> T invokeAny(Collection<? extends Callable<T>> tasks)
+  public final <T extends @Nullable Object> T invokeAny(Collection<? extends Callable<T>> tasks)
       throws InterruptedException, ExecutionException {
     return delegate.invokeAny(wrapTasks(tasks));
   }
 
   @Override
-  public final <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
+  public final <T extends @Nullable Object> T invokeAny(
+      Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
       throws InterruptedException, ExecutionException, TimeoutException {
     return delegate.invokeAny(wrapTasks(tasks), timeout, unit);
   }
diff --git a/guava/src/com/google/common/util/concurrent/WrappingScheduledExecutorService.java b/guava/src/com/google/common/util/concurrent/WrappingScheduledExecutorService.java
index 4ab700f..48f23c1 100644
--- a/guava/src/com/google/common/util/concurrent/WrappingScheduledExecutorService.java
+++ b/guava/src/com/google/common/util/concurrent/WrappingScheduledExecutorService.java
@@ -20,6 +20,7 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
+import org.checkerframework.checker.nullness.qual.Nullable;
 
 /**
  * An abstract {@code ScheduledExecutorService} that allows subclasses to {@linkplain
@@ -31,6 +32,7 @@
  */
 @CanIgnoreReturnValue // TODO(cpovirk): Consider being more strict.
 @GwtIncompatible
+@ElementTypesAreNonnullByDefault
 abstract class WrappingScheduledExecutorService extends WrappingExecutorService
     implements ScheduledExecutorService {
   final ScheduledExecutorService delegate;
@@ -46,7 +48,8 @@
   }
 
   @Override
-  public final <V> ScheduledFuture<V> schedule(Callable<V> task, long delay, TimeUnit unit) {
+  public final <V extends @Nullable Object> ScheduledFuture<V> schedule(
+      Callable<V> task, long delay, TimeUnit unit) {
     return delegate.schedule(wrapTask(task), delay, unit);
   }
 
diff --git a/guava/src/com/google/common/xml/ElementTypesAreNonnullByDefault.java b/guava/src/com/google/common/xml/ElementTypesAreNonnullByDefault.java
new file mode 100644
index 0000000..b4fb4e3
--- /dev/null
+++ b/guava/src/com/google/common/xml/ElementTypesAreNonnullByDefault.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.xml;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierDefault;
+
+/**
+ * Marks all "top-level" types as non-null in a way that is recognized by Kotlin. Note that this
+ * unfortunately includes type-variable usages, so we also provide {@link ParametricNullness} to
+ * "undo" it as best we can.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target(TYPE)
+@TypeQualifierDefault({FIELD, METHOD, PARAMETER})
+@Nonnull
+@interface ElementTypesAreNonnullByDefault {}
diff --git a/guava/src/com/google/common/xml/ParametricNullness.java b/guava/src/com/google/common/xml/ParametricNullness.java
new file mode 100644
index 0000000..a476558
--- /dev/null
+++ b/guava/src/com/google/common/xml/ParametricNullness.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2021 The Guava Authors
+ *
+ * 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 com.google.common.xml;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static javax.annotation.meta.When.UNKNOWN;
+
+import com.google.common.annotations.GwtCompatible;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import javax.annotation.Nonnull;
+import javax.annotation.meta.TypeQualifierNickname;
+
+/**
+ * Marks a "top-level" type-variable usage as (a) a Kotlin platform type when the type argument is
+ * non-nullable and (b) nullable when the type argument is nullable. This is the closest we can get
+ * to "non-nullable when non-nullable; nullable when nullable" (like the Android <a
+ * href="https://android.googlesource.com/platform/libcore/+/master/luni/src/main/java/libcore/util/NullFromTypeParam.java">{@code
+ * NullFromTypeParam}</a>). We use this to "undo" {@link ElementTypesAreNonnullByDefault}.
+ */
+@GwtCompatible
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, PARAMETER})
+@TypeQualifierNickname
+@Nonnull(when = UNKNOWN)
+@interface ParametricNullness {}
diff --git a/guava/src/com/google/common/xml/XmlEscapers.java b/guava/src/com/google/common/xml/XmlEscapers.java
index b25fcfc..a1c637c 100644
--- a/guava/src/com/google/common/xml/XmlEscapers.java
+++ b/guava/src/com/google/common/xml/XmlEscapers.java
@@ -30,7 +30,6 @@
  * non-ASCII characters to their numeric entity replacements. These XML escapers provide the minimal
  * level of escaping to ensure that the output can be safely included in a Unicode XML document.
  *
- *
  * <p>For details on the behavior of the escapers in this class, see sections <a
  * href="http://www.w3.org/TR/2008/REC-xml-20081126/#charsets">2.2</a> and <a
  * href="http://www.w3.org/TR/2008/REC-xml-20081126/#syntax">2.4</a> of the XML specification.
@@ -41,6 +40,7 @@
  */
 @Beta
 @GwtCompatible
+@ElementTypesAreNonnullByDefault
 public class XmlEscapers {
   private XmlEscapers() {}
 
diff --git a/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java b/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
index 475cabb..9e5f173 100644
--- a/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
+++ b/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java
@@ -30,7 +30,7 @@
  * determining whether a given domain name is an effective top-level domain (public suffix).
  *
  * <p>Because this class is used in GWT, the data members are stored in a space-efficient manner.
- * {@see TrieParser}.
+ * See {@link TrieParser}.
  *
  * @since 16.0
  */
@@ -42,7 +42,7 @@
   /** If a hostname is contained as a key in this map, it is a public suffix. */
   public static final ImmutableMap<String, PublicSuffixType> EXACT =
       TrieParser.parseTrie(
-          "a&0&0trk9--nx?27qjf--nx?e9ebgn--nx?nbb0c7abgm--nx??1&2oa08--nx?apg6qpcbgm--nx?hbbgm--nx?rdceqa08--nx??2&8ugbgm--nx?eyh3la2ckx--nx?qbd9--nx??3&2wqq1--nx?60a0y8--nx??4x1d77xrck--nx?6&1f4a3abgm--nx?2yqyn--nx?3np8lv81qo3--nx?5b06t--nx?axq--nx?ec7q--nx?lbgw--nx??883xnn--nx?9d2c24--nx?a&a?it??b!.&gro?lim?moc?t&en?opsgolb,?ude?vog??abila?c?ihsot?m?n??c!.&b&a?m?n??c&b?g?q??ep?fn?k&s?y??ln?no?oc,pi-on,sn?t&n?opsgolb,?un?ysrab,?i&ma?r&emarp?fa??sroc??naiva?s??d&ats?n&eit?oh??om?sa?tl??eg?f&c?ob??g!emo?naripi?oy??hskihs?i&cnal?dem?hs?k!on??sa!.snduolc,??jnin?k&aso?dov?ede?usto??l!.&c,gro?m&oc?yn,?ofni?r&ep?nb,?t&en?ni??ude?vog??irgnahs?le&nisiuc?rbmuder???m!.&ca?gro?oc?sserp?ten?vog??ahokoy?e00sf7vqn--nx?m??n!.&ac?cc?eman?gro?ibom?loohcs?moc?ni?o&c?fni?rp??r&d?o??s&u?w??vt?xm??av?is?olecrab?tea??p!.&bog?ca?d&em?ls??g&ni?ro??mo&c?n??oba?ten?ude??c?g7hyabgm--nx?ra!.&461e?6pi?iru?nru?rdda-ni?siri???s??q!.&eman?gro?hcs?lim?mo&c?n,?t&en?opsgolb,?ude?vog???r&az?emac?f4a3abgm--nx?n!d5uhf8le58r4w--nx??u&kas?tan???s!.&bup?dem?gro?hcs?moc?ten?ude?vog??ac!.uban.iu,?iv??t&ad?elhta?led?oyot??u!.&a&cinniv?emirc?i&hzhziropaz?stynniv??s&edo?sedo??tlay?vatlop??bs?cc,d&argovorik?o!roghzu??tl,?e&hzhziropaz?nvir?t??f&i?ni,?g&l?ro??hk?i&stvinrehc?ykstynlemhk??k&c?m?s&nagul?t&enod?ul??v&iknarf-onavi?orteporp&end?ind?????l&iponret?opotsa&bes?ves??p??m&k?oc?s?yrk??n&c?d?i?osrehk?v?ylov??o&c,nvor??p&d?p,z??r&c?imotihz?k?ymotyhz??sk?t&en?l?z??ude?v:c?e&alokin?ik??i&alokym?hinrehc?krahk?vl?yk??k?l?o&g!inrehc??krahk??r?,y&ikstinlemhk?mus?s&akrehc?sakrehc?tvonrehc???z&ib,u????v!aj?bb?et?iv??waniko?x&a?iacal??yogan?z&.&bew?c&a?i&n?rga???gro?l&im?oohcs??m&on?t??o&c!.topsgolb,?gn??radnorg?sin?t&en?la??ude?vog?wal??zip???b&00ave5a9iabgm--nx?1&25qhx--nx?68quv--nx?e2kc1--nx??2xtbgm--nx?3&b2kcc--nx?jca1d--nx??4&6&1rfz--nx?qif--nx??96rzc--nx??7w9u16qlj--nx?88uvor--nx?a&0dc4xbgm--nx?c?her?n?ra?t??b!.&erots?gro?moc?o&c?fni??ten?ude?v&og?t??zib??a??c&j?s??d&hesa08--nx?mi??ec?g?l!.&gro?moc?ten?ude?vog??m??s!.&gro?moc?ten?ude?vog???tc-retarebsnegmrev--nx?u&lc!.&elej,snduolc,y&nop,srab,??smas??p!.ysrab,??wp-gnutarebsnegmrev--nx??c&1&1q54--nx?hbgw--nx??2e9c2czf--nx?4&4ub1km--nx?a1e--nx?byj9q--nx?erd5a9b1kcb--nx??8&4xx2g--nx?c9jrb2h--nx??9jr&b&2h--nx?54--nx?9s--nx??c&eg--nx?h3--nx?s2--nx???a!.&gro?lim?moc?ten?ude?vog??3a09--nx!.&ca1o--nx?gva1c--nx?h&ca1o--nx?za09--nx??ta1d--nx?ua08--nx???da??b&a?b?ci?f76a0c7ylqbgm--nx?sh??c!.&eugaelysatnaf,gnipparcs,liamwt,revres-emag,s&nduolc,otohpym,seccaptf,?xsc,?0atf7b45--nx?a1l--nx??e!.&21k?bog?dem?gro?lim?m&oc?yn,?nif?o&fni?rp??ten?ude?vog??beuq?n?smoc??fdh?i&l&buperananab?ohtac??n&agro?ilc?osanap??tic??l!.&gro?m&oc?yn,?oc?ten?ude?vog?yo,?l??m!.&mt?ossa??p1akcq--nx??n!.&mon?ossa??i?p??relcel?s!.&gro?moc?ten?ude?vog??c??t!.&e&m,w,?hc,?s?w??v!.&e0,gro?lim?mo&c?n,?ten?ude?v&g:.d,,og???q??wp?yn??d&2urzc--nx?3&1wrpk--nx?c&4b11--nx?9jrcpf--nx???5xq55--nx?697uto--nx?75yrpk--nx?9ctdvkce--nx?a!.mon?d?er?olnwod??b2babgm--nx?c!.vog?g9a2g2b0ae0chclc--nx??e&m!bulc??r!k??sopxe?timil?w??fc?g!.&mon,ude?vog???h&d3tbgm--nx?p?t??i!.&ased?bew?ca?etrof,hcs?lim?o&c!.topsgolb,?g??ro?sepnop?ten?ym?zib??ar?b?ordna?p?rdam??l&iub?og?row??m!.&ed,ot,pj,t&a,opsgolb,???n&a&b?l!.citats:.&setis,ved,?,lohwen?raas???ob?uf??o&of?rp??r&a&c&tiderc?yalcrab??ugnav??ef506w4b--nx?k!.&oc,ude,?jh3a1habgm--nx??of??s!.&dem?gro?moc?ofni?ten?ude?v&og?t???m!kcrem???t!.topsgolb,excwkcc--nx?l??uolc!.&atcepsrep,citsalej.piv,drayknil,elej,nworu,r&epolroov,opav,?xelpciffart,??za5cbgn--nx??e&1&53wlf--nx?7a1hbbgm--nx?ta3kg--nx??2a6a1b6b1i--nx?3ma0e1cvr--nx?418txh--nx?707b0e3--nx?a!.&ca?gro?hcs?lim?mon,oc?t&en?opsgolb,?vog??09--nx??b!.&ca?gnitsohbew,topsgolb,?ortal?ut!uoy???c&a&lp!.oc,?ps!.&lla4sx,rebu,slootiknil,tsafym,?artxe??sla??i!ffo??n&a&d?iler?nif?rusni!efil?srelevart???eics!.oby,??rofria??d!.&1sndnyd,42pi-nyd,7erauqs,amil4,brb-ni,decalpb,e&daregtmueart,mohsnd,nihcamyek,?hcierebsnoissuksid,keegnietsi,lsd-ni,moc,n&-i-g-o-l,aw-ym,esgnutiel,i&emtsi,lreb-n&i,yd,??oitatsksid-ygolonys,pv&-n&i,yd,?nyd,??orp-ytinummoc,p&h21,iog:ol,,?r&e&ntrapdeeps.remotsuc,su&-lautriv,lautriv,?t&adpusnd,tub-ni,uor-ym,?vres&-e&bucl,mohym,?bew-emoh:.nyd,,luhcs,??ogiv-&niem,ym,??s&d-&onys,ygolonys,?nd&-&dd,nufiat,sehcsimanyd,tenretni,yard,?isoc.nyd,ps,yard,?oper-&nvs,tig,?sndd:.&nyd,sndnyd,?,?topsgolb,vresi-&niem,tset,?xi2,y&awetag-&llawerif,ym,?srab,tic-amil,?zten&mitbel,sadtretteuf,??a&lg?rt!.oby,??i&s&doow?ruoyno??ug?wnoitan??nil?on--nx??e!.&bil?dem?eif?gro?irp?kiir?moc!.topsgolb,?pia?ude?vog??ei?ffoc?gg?r&f?ged???f&a&c?s??il!tem???g!.&gro?lim?mo&c?n,?t&en?vp??ude?vog??a&f?gtrom?p!.&kselp,sndp,ycvrp,??rots?yov??elloc?na&hcxe?ro??roeg?ug??i!.&myn,topsgolb,vog??tilop?v&bba?om???j!.&gro?oc?ten???k!.&c&a?s??e&m?n??ibom?mon,o&c!.topsgolb,?fni?g??ro??i&b?l?n???l&a&dmrif?s!.rof,rof???b&a?i&b?dua???c&aro?ric??dnik?g!oog??i&bom?ms??l&asal?erauqa??ppa?uhcs?yts!efil???m!.&4&32i,pct,?66c,ailisarb,b&dnevar,g-raegelif,?ca?duolcsd,e&d-raegelif,i&-raegelif,lpad:.tsohlacol,,?pcm,?g&ro?s-raegelif,?hctilg,k&catsegde,uoc,?myn,noitatsksid,o&bmoy,c!ku,?t&nigol,poh,??p&ion,j-raegelif,ohbew,?r&aegelif,ofsnd,?s&dym,ndd,ti??t&en?s&acdnuos,ohon,??u&a-raegelif,de?tcn,?v&irp?og??y&golonys,olpedew,srab,??a&g?n!.&reh.togrof,sih.togrof,???em?i&rp?twohs??orhc?w??n!goloc?i&lno!.ysrab,?w??o!.&derno:.gnigats,,knilemoh,rof,?hp?latipac?ts&der?e&gdirb?rif???z!.&66duolc,amil,sh,???ruoblem??om?p!.&bog?gro?lim?m&o&c?n??yn,?t&en?opsgolb,?ude??irg?yks??r!.&mo&c?n??ossa?topsgolb,?a&c!htlaeh??pmoc?wtfos??bc?eh?if?ots!.erawpohs,?taeht?u&ces?sni?t&inruf?necca??za???s!.&a?b!ibnal?rofmok??c!a??d!b?n&arb?ubroflanummok???e?f!noc,?g!ro??h!f??i!trap??k!shf??l?m!oc,t??n!mygskurbrutan??o?p!p??r?s!serp??t!opsgolb,?u?vhf?w?x!uvmok??y?z??a&c?el?hc??i&er?urc??nesemoh?roh?uoh??t&a&d?ts&e!laer??lla???is!.&areduolc,e&lej,nilnigol,retnim,winmo,?k&rowtenoilof,wnf,?laicosnepo,n&eyb,oyc,?spvtsaf,xulel,ysrab,?bew??ov?ra?t&ioled?ol??utitsni??u&lb?qi&nilc?tuob???v!.&21e?b&ew?og??ce&r?t??erots?gro?lim?m&oc?rif??o&c?fni??stra?t&en?ni??ude?vog??as?e3gerb2h--nx?i&l?rd?ssergorp??ol??w&kct--nx?r??xul??f&0f3rkcg--nx?198xim--nx?280xim--nx?7vqn--nx?a!.&gro?mo&c?n,?ten?ude?vog???b!.vog?wa9bgm--nx??c!.topsgolb,a1p--nx?ns??ea1j--nx?fo?g?iam?l&a1d--nx?og??n!.&bew?cer?erots?m&oc?rif??ofni?re&hto?p??stra?ten???orp?p!.&gro?moc?ude???rus?t!w??vd7ckaabgm--nx?w??g&2&4wq55--nx?8zrf6--nx??3&44sd3--nx?91w6j--nx!.&a5wqmg--nx?d&22svcw--nx?5xq55--nx??gla0do--nx?m1qtxm--nx?vta0cu--nx????455ses--nx?5mzt5--nx?69vqhr--nx?7&8a4d5a4prebgm--nx?rb2c--nx??a!.&gro?mo&c?n??oc?ten??vd??b!.&0?1?2?3?4?5?6?7?8?9?a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t!opsgolb,?u?v?w?x?y!srab,?z???c!b?za9a0cbgm--nx??e!.&eman?gro?ics?lim?moc!.topsgolb,?nue?ten?ude?vog??a??g!.&ayc,gro?lenap:.nomead,,oc?saak,ten???i&a?v??k!.&g&olb,ro??ku,lim?moc?oi,pj,su,ten?ude?v&og?t,???m!.&drp?gro?lim?m&o&c?n??t??oc?ude?vog??pk??n!.&dtl,eman?gro?hcs?i!bom??l&im?oc,?m&oc!.topsgolb,?rif,?neg,ogn,ten?ude?vog??aw?i!b!mulp??car?d&art?dew??h&sif?tolc??k&iv?oo&b?c???ls?n&aelc?iart??p!pohs??re&enigne?tac??t&ad?ekram?hgil?lusnoc?neg?ov?soh!.tfarcnepo,?tebdaerps??vi&g?l???o!s??u&rehcisrev?smas?tarebsnegömrev???o&d?lb?og!.duolc,??r&2n084qlj--nx?ebmoolb?o!.&77ndc.c:sr,,a&remacytirucesym,t&neimip,sivretla,?z,?bew-llams,d&ab-yrev-si,e&sufnocsim,vas-si,?nuof-si,oog-yrev-si,uolc&arfniarodef,mw,??e&a,cin-yrev-si,grof&loot,peh,?l&as-4-ffuts,poeparodef,?m&-morf,agevres,ohruoyslles,?n&ozdop,uma.elet,?r&ehwongniogyldlob,iwym,uces-77ndc.nigiro.lss,?t&adidnac-a-si,is&-ybboh,golb,???fehc-a-si,golbymdaer,k&eeg-a&-si,si,?h,nut,?l&i&amwt,ve-yrev-si,?lawerif&-ym,ym,?sd-ni,?m&acssecca,edom-elbac,?n&af&blm,cfu,egelloc,lfn,s&citlec-a-si,niurb-a-si,tap-a-si,?xos-a-si,?o&itatsksid,rviop,?pv-ni,?o&jodsnd,tp&az,oh,??p&i&-on,fles,?o&hbew,tksedeerf,?tf&e&moh,vres,?ym,??r&e&gatop,ppepteews,su-xunil-a-si,?gmtrec,vdmac,?s&a&ila&nyd,snd,?nymsd,?b&alfmw,bevres,?dylimaf,eirfotatophcuoc,gulku,j,koob-daer,ltbup,nd&-won,deerf,emoh,golb,kcud,mood,nyd:.&emoh,og,?,ps,rvd,tog,uolc,?s&a-skcik,ndd,?tnemhcattaomb,u,?t&ce&jorparodef.&duolc,gts.so.ppa,so.ppa,?riderbew,?e&ews-yrev-si,nretni&ehtfodne,fodne,??hgink-a-si,igude,oi-allizom,s&ixetn&od,seod,?o&h-emag,l-si,?rifyam,??ue:.&a&-q,c,?cm,dc,e&b,d,e,i,m,s,?g&b,n,?hc,i&f,s,?k&d,m,s,u,?l&a,i,n,p,?n&c,i,?o&n,r,ssa,?pj,r&f,g,h,k,t,?s&e,i:rap,,u,?t&a,en,i,l,m,ni,p,?u&a,de,h,l,r,?vl,y&c,m,?z&c,n,??,vresnyd,x&inuemoh,unilemoh,?y&limafxut,srab,???ub&mah?oj???s!.&gro?moc?rep?t&en?opsgolb,?ude?vog??gb639j43us5--nx??t?u!.&c&a?s??en?gro?mo&c?n,?o&c?g??ro?topsgolb,??v!.&mon,ta,?a1c--nx??wsa08--nx??h&0ee5a3ld2ckx--nx?4wc3o--nx!.&a&2xyc3o--nx?3j0hc3m--nx?ve4b3c0oc21--nx??id1kzuc3h--nx?l8bxi8ifc21--nx?rb0ef1c21--nx???8&8yvfe--nx?a7maabgm--nx??b!.&gro?moc?ten?ude?vog??mg??c!.&7erauqs,amil4,duolc-drayknil,gniksnd,ph21,sndtog,topsgolb,wolf.enigneppa,xi2,ytic-amil,?aoc?et?ir!euz??r&aes!errecnac??uhc??sob?taw!s???d0sbgp--nx?f&2lpbgm--nx?k??g!.&gro?lim?moc?ude?vog???iesac?m!a1j--nx??ocir?p!.&gro?i?lim?moc?ogn?ten?ude?vog???s!.&g&nabhsah,ro??l&im?xv,?m&oc?roftalp.&cb,su,tne,ue,??ten?vog?won,yolpedew,?a&c?nom??i&d?f?ri???t!.&ca?enilno,im?ni?o&c?g??pohs,ro?ten??iaf!.oby,?laeh?orxer?ra&ba?e???vo!.lopdren,?zb??i&3tupk--nx?7a0oi--nx?a!.&ffo?gro?mo&c?n,?ten?uwu,?1p--nx?bud?dnuyh?tnihc??b!.&gro?moc?oc?ro?ude??ahduba?o!m!.&duolcsd,ysrab,???s??c!.&ayb-tropora--nx?ca?d&e?m??esserp?gro?ln,moc?nif,o&c?g?ssa??ro?t&en?ni?roporéa??ude?vuog??cug?t??d&dk?ua??e&bhf--nx?piat??f!.&aw5-nenikkh--nx,dnala?iki,mroftalpduolc.if,nenikkäh,retnecatad.saap,topsgolb,yd,?onas??g!.&d&om?tl??gro?moc?ude?vog???h&c&atih?ra??s&abodoy?ibustim???juohs?k!.&gro?moc?ofni?ten?ude?vog?zib??b4gc--nx?iw?nisleh?s?uzus??l!.&aac,m&on,yn,?topsgolb,?drahcir?iamsi??maim?n!.&b&ew?og??ca?gro?lim?mo&c?n??ni?o&c?fni??pp?t&en?ni??ude?zib??airpic?i&hgrobmal?m??re??om?rarref?s!.&egaptig,mon,topsgolb,?ed??t&aresam?i&c?nifni??rahb?tagub??ut?v!.&21k?gro?moc?oc?ten???wik?xa&rp?t??yf??j&6pqgza9iabgm--nx?8da1tabbgl--nx?b!.&ossa?topsgolb,uaerrab?vuog???d?f!.&ca?eman?gro?lim?moc?o&fni?rp??ten?vog?zib???nj?s?t!.&bew?c&a?in??eman?gro?lim?mo&c?n,?o&c?g??t&en?ni?set??ude?vog?zib???yqx94qit--nx??k&8uxp3--nx?924tcf--nx?arfel?c&a&bdeef?lb??ebdnul?ilc?reme?ud??d!.&erots,ger,mrif,oc,topsgolb,zib,?t??e&es?samet??h!.&a&4ya0cu--nx?5wqmg--nx??b3qa0do--nx?cni,d&2&2svcw--nx?3rvcl--nx??5xq55--nx?tl,?g&a0nt--nx?la0do--nx?ro??i&050qmg--nx?7a0oi--nx?xa0km--nx??m&1qtxm--nx?oc?yn,?npqic--nx?t&en?opsgolb,?ude?v&di?og?ta0cu--nx??xva0fz--nx?人&个?個?箇??司公?府政?絡&網?网??織&組?组??织&組?组??络&網?网??育&敎?教???n??i&tsob?vdnas??l!.&bew?c&a?os??dtl?gro?hcs?letoh?moc?nssa?ogn?prg?t&en?ni??ude?vog??at?cd?is??m!.&eman?fni?gro?mo&c?n,?t&en?opsgolb,?ude?vog???n&ab!cfdh?etats?mmoc?t&en?fos??u??i!.gn,l!.&noyc,pepym,??p???oob?p!.&b&ew?og??gro?kog?m&af?oc??nog?ofni?pog?sog?ten?ude?vog?zib???row!.&fo,ot,?ten!.&htumiza,o&c,vra,??doof???s!.&myn,topsgolb,??t?u!.&c&a?lp??d&om?tl??e&cilop?m??gro!.&gul:g,,sgul,??nnoc,o&c!.&bunsorter.tsuc,e&lddiwg,n&ilnoysrab,ozgniebllew,??krametyb.&hd,mv,?pi-on,t&fihsreyal.j,opsgolb,?vres-hn,ysrab,??rpoc,?shn?t&en?nmyp,?vog!.eci&ffoemoh,vres,??ysrab,???l&04sr4w--nx?a!.&gro?lim?mo&c?n,?t&en?opsgolb,?ude?vog??bolg?c?ed?g!el??i&c&nanif!.oc,lpl??os??romem?tnedurp??n&if?oitanretni??t&i&gid!.sppaduolc:.nodnol,,?p&ac?soh???ned?ot??utum!nretsewhtron???c!.&bog?lim?mon,oc?samednerpa?topsgolb,vog???dil?e&datic?n&ahc?nahc!gnikooc?levart?rehtaew???t!ni?ria?tam??vart??f&8f&pbgo--nx?tbgm--nx??a?n??g!.&gro?mo&c?n,?oc?ten?ude?xx,zib,??h&d?op??i!.&21k?ca?fdi?gro?inum?oc!.topsgolb,?ten?vog??a&f?m&e?g?toh???m?r?xil??l&a&b&esab?t&eksab!.&sua,zn,??oof!.fo,???c?mt??e&d?hs??ihmailliw?j??m!.&esserp?gro?moc?ten?ude?v&og?uog????n!.&n&iemodleeutriv,o&med,rtsic,??oc,retsulc-gnitsoh,topsgolb,wsma,yalphk,?o??o&a?btuf?l!.gmo,?o&c!.ed,?hcs!.gn,??rit?u??p!.&a&cin&diws?gel??d&g,ortso?urawon??i&dem?mraw?nydg,?k&elo&guld?rtso??slopolam?tsu?ytsyrut??l&ip?o&kzs?w&-awolats?oksnok????n&img?zcel,?rog&-ai&bab?nelej??j?z??syn?tsaim?w&a&l&eib?i?o??zsraw??o&namil?tainop,??z&eiwolaib?mol???c&e&iw&alselob?o&nsos?rtso???le&im?zrogz???orw,p??d&em,ia?ragrats??e&c&i&lrog?w&ilg,o&hc&arats?orp??klop?tak????yzreibok??i&csjuoniws?ksromop?saldop??l&ahdop?opo??napokaz,tatselaer?z&romop?swozam???g&alble?ezrbo&lok?nrat??ro??hcyzrblaw?i&csomohcurein?grat?klawus??k&e&rut?walcolw??in&byr?diws,sark,?le?o&nas?tsylaib??rob&el?lam??s&als?jazel?nadg,puls?rowezrp???l&colw?e&r?vart??i&am?m???m&o&c?dar?n?tyb??s&g?iruot??t!a???n&a&gaz?nzop,?i&bul?cezczs?lbul,molow?nok?zd&eb?obeiws???uleiw?y&tzslo?z&rtek?seic????o&c,fni?k&celo?zdolk??lkan?n&leim?pek?t&uk?yzczs??z&copo?eing?rowaj???rga?tua?w&ejarg?ogarm???p&e&eb,lks??klwwortso?ohs??romophcaz?sos?t&aiwop?en?opos,ra,sezc??ude?v&irp?og!.&a&p?s!w???bni&p?w??ci?dtiw?essp?fiw?g&imu?u??hiiw?m&igu?rio?u!o???nds?o&ks?p!pu??s?wtsorats??p&a?sp!mk?pk?wk??u&m?p??wk?z??r&ksw?s??s&i?oiw?u?zu??talusnok?w&gzr?i&p?rg?w??m?opu?u!imzw???zouw????w&a&l&corw?sizdow??w??o&golg?k&ark,ul?zsurp??r&az?gew??t&rabul,sugua??z&coks?sezr????xes?y&buzsak?d&azczseib?ikseb??hcyt?n&jes?lod-zreimizak??pal?r&ogt?uzam??walup?zutrak??z&am-awar?c&aprak?iwol?zsogdyb??dalezc?ib?s&i&lak?p??uklo????l??r&as?f?s??s!.&gro?moc?ten?ude?vog???t!.vog??ubnatsi?x3b689qq6--nx?yc5rb54--nx??m&00tsb3--nx?1qtxm--nx?981rvj--nx?a!.&aayn,enummoc?gro?moc?o&c?idar,ken,?t&en?opsgolb,??c!bew??dretsma?e&rts?t!.&citsalej,esruocsid,???fma?rirhs?xq--nx??b!.&gro?moc?ten?ude?vog??i??c!.&moc?oc?ten?vog???d!.&gro?moc?ten?ude?vog???f!.&gro?moc?oidar,ten?ude??i??g!vu96d8syzf--nx??h?i!.&ca?gro?mo&c?n,?o&c!.&clp?dtl???r,?t&en?t??vt??k?rbg4--nx??k!.&drp?e&rianiretev?sserp??gro?lim?m&o&c?n??t??nicedem?ossa?pooc?s&eriaton?neicamrahp?sa??ude?v&og?uog????l&if?ohkcots??o!.&dem?gro?m&oc?uesum??o&c?rp??ten?ude?vog??b?c!.&2aq,3pmevres,a&c&-morf,ir&bafno,fa,??g&-morf,oy-sehcaet,?i-morf,m&-morf,all&-a-si,amai,??p&-morf,c-a-si,?r&emacytirucesym,odih,?s,tadtsudgniht,v-morf,w-morf,z,?b&dnevarym,ew&-sndnyd,draiw.segap,ottad,?g,ildts.ipa,?c&amytirucesemoh,d-morf,esyrcs,itsalej.omed,n&-morf,vym,?p&kroweht,ytirucesemoh,?q,rievres,s-morf,?d&aerotffuts,e&calpb,ifitrec-&si,ton-si,?llortnocduolc,rewopenignepw,?i&-morf,rgevissam.saap,?m-morf,n&-morf,abeht-htiw-si,?s-morf,uolc&-noitatsyalp,hr,meaeboda,panqym:-&ahpla,ved,?,smetsystuo,ved&j,pw,??wetomer,?e&butuoyhtiw,ciffo-sndnyd,d:-morf,o&celgoog,n&il.srebmem,neve.&1-&su,ue,?2-&su,ue,?3-&su,ue,?4-&su,ue,????,erf&-sndnyd,sndd,?filflahevres,gnahcxeevres,i&hcet-a-si,p-sekil,?k&auqevres,irtsretnuocevres,?l&bitpa-no,googhtiw,?m&agevres,ina-otni-si,oh-&sndnyd,ta-sndnyd,??n&-morf,ilnoysrab,og-si,?r&alfduolcyrt,ihcec,uzanoppanex,?srun-a-si,t&i&nuarepo,s&-ybboh,aloy,tipohs,??omer-sndnyd,ysgolb,?v&als-elcibuc-a-si,i&lsndd,tavresnoc-a-si,??z&amkcar,eelg,iig,??fehc-a-si,g&ni&gats-swennwot,ksndd,robsikrow,?o&fgp,lb&-sndnyd,sihtsetirw,???h&n-morf,o-morf,?i&fiwehtno,h-morf,kiw-sndnyd,m-morf,pdetsoh,r-morf,w-morf,z&ihcppa,nilppa,??jn-morf,k&a&-morf,erfocsic,?cils-si,eeg&-a&-si,si,?sndd,?h,latsnaebcitsale:.&1-&htuos-pa,lartnec-&ac,ue,?ts&ae&-&as,su,?ht&ron-pa,uos-pa,??ew-&su,ue,vog-su,???2-ts&ae&-su,ht&ron-pa,uos-pa,??ew-&su,ue,??3-ts&aehtron-pa,ew-ue,??,o-morf,r&adhtiwtliub,ow&-&sndnyd,ta-sndnyd,?ten-orehkcats,??u,?l&a&-morf,colottad,rebil-a-si,?f-morf,i&-morf,am-sndnyd,?l&ecelffaw,uf-ytnuob:.a&hpla,teb,?,?ppmswa,ru-&elpmis,taen,?ssukoreh,xegap,?m&n-morf,pml.ppa,rofererac-htlaeh,sacrasevres,uirarret-yltsaf,?n&a&cilbuper-a-si,f&-sllub-a-si,racsan-a-si,?i&cisum-a-si,ratrebil-a-si,??c,dcxirtrepmi,eerg-a-si,i-morf,m-morf,o&ehtnaptog,isam-al-a-tse,rtap-el-tse,s&iam-al-a-tse,replausunu,??pj,t-morf,?o&bordym,c,jodsnd,m-morf,n:iloxip,,ttadym,?p&2pevres,aelutym,i&-sndnyd,fles,ogol,ruoy&esol,hctid,?ymteg,?pa&-rettalp,anis:piv,,esaberif,k1,lortnocduolc,oifilauq,r&aegyks,oetem:.ue,,?tnorfegap,ukoreh,?t&fevres,thevres,??r&a:-morf,tskcor-a-si,,b,e&d&ivorpnwo,ner&.ppa,no,??e&bevres,nigne-na-si,?ggolb-a-si,h&caet-a-si,pargotohp-a-si,?krow-drah-a-si,n&gised-a-si,ia&rtlanosrep-a-si,tretne-na-si,??p&acsdnal-a-si,eekkoob-a-si,?retac-a-si,subq,tn&ecysrab,iap-a-si,uh-a-si,?vres&-&ki.duolcj,s&ndnyd,pvtsaf,??inim,nmad,sak,?y&alp-a-si,wal-a-si,?zilibomdeepsegap,?g,k,mgrp.nex,o&-morf,sivdalaicnanif-a-si,t&c&a-na-si,od-a-si,?susaym,??p-morf,u&as-o-nyd,eugolb-nom-tse,omuhevres,??s&a&apod,ila&nyd,snd,?nymsd,?bbevres,ci&p&-sndnyd,evres,?tcatytiruces,?dylimaf,e&cived-anelab,itilitu3,lahw-eht-sevas,mag-otni-si,tyskciuq,?i&ht2tniop,pa&elgoog,tneltneg,??k&-morf,aerf-ten,colbpohsym,?m&-morf,cxolb,?n&d&-pmet,dyard,golb,mood,tog,?kselp,nyd,ootrac-otni-si,?o&-xobeerf,xobeerf,?ppatneg,r&ac-otni-si,etsohmaerd,?s&e&l-rof-slles,rtca-na-si,?ibodym,?tsaeb-cihtym.&azno,ilay,remotsuc,sv,toleco,x:n&ihps,yl,?,?u,wanozama.&1-&htuos-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??la&nretxe-3s,rtnec-&ac&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????ts&ae&-&as&-&3s,etisbew-3s,?.kcatslaud.3s,?su:-etisbew-3s,.kcatslaud.3s,,?ht&ron-pa&-&3s,etisbew-3s,?.kcatslaud.3s,?uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-&3s,etisbew-3s,?.kcatslaud.3s,?vog-su-&3s,spif-3s,????2-ts&ae&-su&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ht&ron-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????3&-tsew-ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,??s,???t&arcomed-a-si,c-morf,eel&-si,rebu-si,?m-morf,n&atnuocca-na-si,e&duts-a-si,r-ot-ecaps,tnocresu&buhtig,elbavresbo.citats,pl,???ops&edoc,golb,ppa,?s&i&hcrana-&a-si,na-si,?laicos-a-si,pareht-a-si,tra-na-si,xetn&od,seod,??oh&piym,sfn,??u&-morf,nyekcoh-asi,?v-morf,?u&-rof-slles,4,e,h,oynahtretramssi,r:ug-a-si,,?v&n-morf,w-morf,?w&ozok,ww100,?x&bsbf.sppa,em,i&nuemoh,rtrepmi,?obaniateb,t-morf,unilemoh,?y&a&bnx:.&2u,lacol-2u,?,lerottad,wetag-llawerif,?dnacsekil,k&-morf,niksisnd,?rotceridevitcaym,u:goo,,w-morf,x&alagkeeg,orphsilbup,???inu??m!.&dna,rof,??or?tsla??p!.nwo,?raf!.jrots,etats??s?t!.&gro?lim?mo&c?n??oc?ten?ude?vog???u&esum!.&a&92chg-seacinumocelet-e-soierroc--nx?atnav?c&i&aduj?rfatsae??rollam??d&anac?enomaledasac?irolf??e&raaihpledalihp?srednu??g&hannavas?oonattahc??hamo?i&auhsu?bmuloc!hsitirb??dem?groeg?hpledalihp?l&artsua?etalif??n&igriv?rofilac??ssur?tsonod??ksa&la?rben??l&lojal?q-snl--nx?uossim!trof???m&a&bala?nap??enic?o&m?r???n&a&cirema?idni??edasap?ilorachtuos?olecrab??r&abrabatnas?ezzivs??su?t&nalta?osennim??zalp??c&dnotgnihsaw?ebeuq?i&depolcycne?ficap?hpargonaeco?lbup?sum?t&carporihc?lec?naltadim??vu??yn??d&a&dhgab?etsmraf?m?orliar??i&rdam?ulegnedleeb??leif?n&a!l&gne?nif?ragyduj?t&ocs?rop??yram???u&brofsdgybmeh?osdnaegami???r&augria?ofxo???e&c&a&l&ap?phtrib??ps??n&a&lubma?tsiser??e&fedlatsaoc?gilletni?ics!foyrotsih????pein?rof??d&nukneklov?revasem??e&rt?tsurt??f&atnas?ildliw??g&a&lliv?tireh!lanoitan???dirbmac?rog??i&cnum?nollaw??koorbrehs?l&ab?bib?cycrotom?i&ssim?txet??oks?tsac??m&affollah?it!iram??utsoc??n&golos?ilno?recul??r&a&uqs?waled!foetats???i&hs&acnal?kroy?pmahwen??otsih??omitlab?ut&an?cetihcra?inruf?luc!irga?su???vuol??s&abatad?iacnarf?sius?uoh!lum???t&a&locohc?rak?ts!e!yrtnuoc!su?????imesoy?tevroc??u&qihpargonaeco?velleb??vit&caretni?omotua???f&iuj?ohgrub??g&n&i&dliub?ginerevmuesum?kiv?lahw?nim?peekemit?vil??ulmmastsnuk??orf?r&ebnrats?u&b&ierf?le?m&ah?uan??ram?s&mailliw!lainoloc??naitsirhc?retepts??zlas??ob&irf?mexul?????h&atu?c&raeser?sirotsih?uot??g&ea1h--nx?rubsttip??si&tirb?wej??t&laeh?ro&n?wtrof??uo&mnom?y????i&d6glbhbd9--nx?iawah?k&nisleh?s??lad!rodavlas??sissa?tannicnic??k&c&nivleeg?olc!-dna-hctaw?dnahctaw???fj?inebis?l&is?ofron??na&rfenna?t??oorbnarc?r&am&ned?reiets??oy!wen????l&a&ci&dem?golo&eahcra?meg?oz??natob?rotsih??ertnom?iromem?noita&cude?n??oc?rutluc?trop?utriv?van??e&nurb?s&ab?surb??utriv??i&artnogero?sarb??l&a&besab?hsnoegrus??e&hs?rdnevle??i&b?m!dniw????o&bup?ohcs?tsirb???m&a&dretsma?ets?h&netlehc?rud???ct?elas!urej??l&if?ohkcots?u??raf?silanruoj?u&esumyrotsihlarutan?ira&tenalp?uqa??terobra???n&a&c!irema!evitan???gihcim?i&dni?tpyge??mfoelsi?wehctaksas??e&d&alokohcs?ews?rag!cinatob?lacinatob?s&nerdlihc?u????gahnepoc?hcneum?laftsew?ppahcsnetewruutan?r&dlihc?ednaalv?hu!dnutamieh???sseig??gised!dn&atra?utsnuk???h&ab!nesie??ojts??i&lreb?tsua??l&eok?ocnil??n&ob?urbneohcs??o&dnol?gero?i&s&iv&dnadnuos?elet??nam??t&a&c&inummoc?ude!tra???dnuof?erc?i&cossa?va??kinummokelet?nissassa?r&belectsevrah?oproc?tsulli??silivic?t&nalp?s??vres&erp?noclatnemnorivne??zilivic??c&elloc?if-ecneics??ibihxe???ri?s&dnah?imaj?reffej?sral??t&erbepac?nilc?sob???r&e&b?dom?tsew?uab?zul??obredap??vahnebeok?wot??o&2a6v-seacinumoc--nx?ablib?c&edtra?ixemwen?sicnarfnas??elap?g&a&cihc?to??eidnas??i&cadnuf?diserp?ratno??llecitnom?mitiram?nirot?r&htna?ienajedoir???pohskrow?qari?r&aw!dloc?livic??dd?e&b&ma?yc??irrac?llimsiwel?naksiznarf?papswen?t&aeht?exe?nec!ecneics?larutluc?muesum?tra??s&ehc&nam?or??neum??upmoc???ia!nepo??obal?u&asonid?obal?takirak???s&a&l&g?l&ad?eh???xet??di&k?pardnarg??e&cneics!larutan??dnal?hcsi&deuj?rotsih!nizidem?rutan??selhcs??itinamuh?l&aw?egnasol?l&e&rutansecneics?xurb??iasrev???r&e&em?ugif??tsac??suohcirotsih?u&en?q&adac?itna!nacirema?su????õçacinumoc!elet-e-soierroc???gnirpsmlap?htab?i&lopanaidni?rap?uoltnias?xa??l&essurb?lod??mraeriflanoitan?n&a&blats?l??erdlihc?oi&snam?tacinummoc!elet-dna-stsop???äl??re&dnalf?lttes?mraf?nim?tnececneics??s&alg?erp??t&farc!dnastra??nalp?olip?ra!e&nif?vitaroced!su???su?xuaeb???u&b!muloc??cric???t&agilltrop?cejorp?dats?e&esum?kramnaidni??iorted?ne&m&elttes?norivne?piuqemraf??vnoc??oped?r&a!drib?enif?gttuts?hsiwej?kcor?n&acirema?ootrac??tamsa?yraropmetnoc??op&aes?snart?wen??ufknarf??s&a&cdaorb?octsae??ewhtuos?ilayol?nuk?r&ohnemled?uhlyram??urt???u&a&bgreb?etalpodaroloc??rmyc??w&ocsom?rn??x&esse?ineohp?nam?tas??y&a&bekaepasehc?w&etag?liar???camrahp?doc?e&hsub?l&ekreb?l&av!eniwydnarb??ort???n&dys?om??rrus?s&nreug?rejwen???golo&e&ahcra?g??motne?nh&cet?te??oz?po&rhtna?t??roh??hpargotohp?l&etalihp?imaf??m&edaca?onortsa??n&atob?yn??ps?r&a&ropmetnoc?tilim??e&diorbme?llag!tra??vocsid??lewej?nosameerf?otsih!dnaecneics?ecneics?gnivil!su??la&col?rutan??retupmoc?su??tsudnidnaecneics??spelipe?t&eicos!lacirotsih??i&nummoc?srevinu??nuoc???z&arg?iewhcs?nil?ojadab?urcatnas??моки?םילשורי???rof??z!.&ca?gro?hcs?lim?moc?o&c?fni??ten?ude?vog?zib????n&315rmi--nx?a&brud?cilbuper?f?grompj?hkaga?idraug?m?ol?ssin?u&hix?qna??varac?yalo??b!.&gro?moc?oc,ten?ude?vog??c??c!.&ah?bh?c&a?s??d&5xq55--nx?g?s?uolctnatsni,?eh?g&la0do--nx?ro??h&a?q?s??i&7a0oi--nx?h??j&b?f?t?x?z??kh?l&h?im?j??m&n?oc!.swanozama.&1-htron-nc.3s,be.1-&htron-nc,tsewhtron-nc,????n&h?l?s?y??om?qc?s&g?j??ten?ude?vog?wt?x&g?j?n?s??z&g?x??司公?絡網?络网??b??d&g!.ypnc,?ka??e&drag?erg?fuak?gawsklov?hctik?i&libommi?w??m!.rof,?po?r!ednaalv??sier?ves??g!.&ca?gro?moc?ten?ude?vog??is&ed!.ssb,?irev???h!.&bog?cc,gro?lim?mo&c?n,?ten?ude???i!.&bew,c&a?in??dni?gro?lim?mrif?neg?oc?s&er?nduolc,?t&en?opsgolb,?ude?vog?ysrab,?elknivlac?griv?ks?lreb?p!ul??v?w?x??k!.&gro?ten?ude?vog???l&eok?ocnil??m!.&cyn,gro?myn,ude?vog???o&dnol!.&fo,ni,??i&hsaf!.&fo,no,??n&o?utiderc??siv!orue??t&a&cude!.oc,?dnuof?tsyalp??c&etorp?u&a?rtsnoc?????kin?las?mrom?nac?p&q?uoc??s&iam?nhojcs?pe?scire??t&ron?sob??zama??p!.&gro?oc?ten?ude?vog??k??r&e&c?yab??op!.eidni,??s!.&gro?moc?osrep?t&opsgolb,ra??ude?v&inu?uog????t!.&dni?esnefed?gro?ltni?m&oc!nim??siruot??n&erut?if??o&fni?srep??sn&e?r??t&an?en!irga?ude??rnr??unr?vog??m??u&f?r!.&bdnevar,lper,sh,tnempoleved,??stad?xamay?y??v!.&ca?eman?gro?htlaeh?moc?o&fni?rp??t&en?ni?opsgolb,?ude?vog?zib???wo&rc?t!epac????o&76i4orfy--nx?a!.&bp?de?go?oc?ti?vg??boat??b!.&a&ci&sum?tilop??i&c&arcomed?neic??golo&ce?ncet??m&edaca?onoce??rt&ap?sudni??vilob??n&egidni?icidem??serpme?tsiver?vitarepooc??b&ew?og??dulas?e&rbmon?tr&a?op&ed?snart????g&olb?ro??ikiw?l&a&noi&canirulp?seforp??rutan??im??moc?o&fni?lbeup?rga?tneimivom??saiciton?t&askt?en?ni??ude?vt??h?iew?olg??c!.&bew?cer?dr&c,rac,?gro?ipym,l&im?per,?m&o&c!.topsgolb,?n??rif?udon,?ofni?s&egap&dael,l,?tra??t&4n,en?ni??ude?vog??a?e!vi??in?mara?s&edarb?ic???d!.&b&ew?og??dls?gro?lim?moc?t&en?ra??ude?vog??agoba?if?zd7acbgm--nx??e&c?d&iv?or??morafla??f!ni!.&e&g&delwonk-fo-l&errab,lerrab,?ellocevoli,?ht-skorg,rom-rof-ereh,tadpusn:d,,?llatiswonk,macrvd,ofni-v,p&i&-on,fles,?ohbew,?ruo-rof,s&iht-skorg,nd&-cimanyd,nyd,uolc,??tsrifyam,ysrab,zmurof,???g&el?n!am?ib???hwsohw?i!.&35nyd,8302,a&minifed,tad-b,?b&altig,uhtig,?c&inone:.remotsuc,,zh,?d&in,u&olc&iaznab.ppa,noitacilppa,ropav,?rd,??e&civedniser,donppad.sndnyd,egipa,lej,nilnigol,sufxob,t&isnoehtnap,newtu,??gni&gatsniser.secived,tsohytsoh,?k&orgn,ramytefasresworb,?m&oc?udon,?nyded,p&opilol,pa&-arusah,cs,enalpkcab,??r&evres&cisab,lautriv,?ial.sppa,?s&codehtdaer,nemeis-om,pparevelc,tacdnas,?t&enotorp,i&belet,detfihs,kecaps,?raedon.egats,sudgniht.&cersid.tsuc,dorp.tsuc,gnitset.tsuc,ved.tsuc,??vgib.0ku,whs,x&bslprbv.g,cq,?y&olpedew,srab,??b?d&ar?u&a?ts???j?r?syhp??j!.&eman?gro?hcs?lim?moc?ten?ude?vog???ll&ag?o??m!.&gro?moc?ten?ude?vog??g?il?mi?orp??n!.&a&0&b-ekhgnark--nx?c-iehsrgev--nx?g-lksedlig--nx?k-negnanvk--nx??1&p-nedragy--nx?q-&asierrs--nx?grebsnt--nx?lado-rs--nx?n&egnidl--nx?orf-rs--nx??regnayh--nx?ssofenh--nx??r-datsgrt--nx?s-ladrjts--nx?v-y&senner--nx?vrejks--nx???3g-datsobegh--nx?4&5-&dnaleprj--nx?goksnerl--nx?tednalyh--nx??6-neladnjm--nx?s-&antouvachb--nx?impouvtalm--nx??y-&agrjnevvad--nx?ikhvlaraeb--nx???7k-antouvacchb--nx?8&k-rekie-erv--nx?l-ladrua-rs--nx?m-darehsdrk--nx??a!.sg??bct-eimeuvejsemn--nx?d&do?iisevvad?lov?narts?uas??f&1-&l--nx?s--nx??2-h--nx??g&10aq0-ineve--nx?av?ev?lot?r&ajn&evvad?u??ájn&evvad?u????h?iz-lf--nx?j&ddadab?sel??k&el?hoj&sarak?šárák??iiv&ag&na&el?g??ŋ&ael?ág???ran???l&f?lahrevo?o&ms?s??sennev?t-&ilm--nx?tom--nx??u&-edr--nx?s??øms??muar?n&0-tsr--nx?2-dob--nx?5-&asir--nx?tals--nx??a&r!-i-om?f?t??t??douvsatvid?kiv?m&os?øs??n&od?ød??ra?sen?t&aouvatheig?ouv&a&c&ch&ab?áb??h&ab?áb???n??i&ag?ág??sa&mo?ttvid??án???z-rey--nx?ær&f?t???o&p-&ladr--nx?sens--nx??q-nagv--nx?r-asns--nx?s-kjks--nx?v-murb--nx?w-&anr&f--nx?t--nx??ublk--nx???ppol?q&0-t&baol--nx?soum--nx?veib--nx??x-&ipphl--nx?r&embh--nx?imph--nx???y-tinks--nx??r&f-atsr--nx?g-&an&ms--nx?nd--nx??e&drf--nx?ngs--nx??murs--nx?netl--nx?olmb--nx?sorr--nx??h-&a&lms--nx?yrf--nx??emjt--nx??i&-&lboh--nx?rsir--nx?y&d&ar--nx?na--nx??ksa--nx?lem--nx?r&ul--nx?yd--nx????stu??j-&drav--nx?rolf--nx?sdav--nx??kua?l-&drojf--nx?lares--nx??m-tlohr--nx?n-esans--nx?olf?p-sdnil--nx?s-ladrl--nx?tih?v-rvsyt--nx??s&a&ns?ons??i&ar?er&dron?r&os?øs???ár??la&g?h??mor!t??sir?uf?åns??t&koulo&nka?ŋká??la?p-raddjb--nx?r-agrjnu--nx?s&aefr&ammah?ámmáh??orf?r&o?ø???u-vreiks--nx??u&h-dnusel--nx?i-&drojfk--nx?vleslm--nx??j-ekerom--nx?k-rekrem--nx?u-&dnalr--nx?goksr--nx?sensk--nx??v-nekyr--nx?w-&k&abrd--nx?ivjg--nx??oryso--nx??y-y&dnas--nx?mrak--nx?n&art--nx?nif--nx??reva--nx??z-smort--nx??v!.sg?ledatskork?reiks??wh-antouvn--nx?x&9-dlofts--nx.aoq-relv--nx?d-nmaherk--nx?f-dnalnks--nx?h-neltloh--nx?i-drgeppo--nx?j-gve&gnal--nx?lreb--nx??m-negnilr--nx?n-drojfvk--nx??y&7-ujdaehal--nx?8-antouvig--nx?b-&dlofrs--nx?goksmr--nx?kivryr--nx?retslj--nx??e-nejsom--nx?f-y&krajb--nx?re&dni--nx?tso--nx??stivk--nx??g-regark--nx?orf?ørf??z9-drojfstb--nx??b&25-akiivagael--nx?53ay7-olousech--nx?a&iy-gv--nx?le-tl&b--nx?s--nx??n0-ydr--nx??c&0-dnal-erdns--nx?z-netot-erts--nx??g&g-regnarav-rs--nx?o-nejssendnas--nx??ju-erdils-ertsy--nx?nj-dnalh-goksrua--nx?q&q-ladsmor-go-erm--nx.&ari-yreh--nx?ednas??s-neslahsladrjts--nx???ca&4s-atsaefrmmh--nx?8m-dnusynnrb--nx?il-tl--nx?le-slg--nx?n5-rdib--nx?op-drgl--nx?uw-ynnrb--nx??d&a&qx-tggrv--nx?reh!nnivk?sd&ork?ørk??uas??ts&e&bi?kkar?llyh?nnan??g&ort?ørt??k&alf?irderf??levev?mirg?obeg&ah?æh??r&ah?ejg????barm-jdddb--nx?ie!rah?s&etivk?ladman???lof&r&os?øs??ts&ev.ednas?o.relav?ø.relåv???n&a&l&-erd&n&os?øs??ron??adroh.so?dron.&a&g5-b--nx?ri-yreh--nx??ob?y&oreh?øreh??øb??e&m!lejh??pr&oj?øj??vi??gyb?n&aks?åks??o&h-goksrua?rf??r&o?ua?ø??tros?øh-goksrua??rts!e&devt?lab?mloh???s&ellil?naitsirk?rof???u&l!os??s!d&im?lejt??e&guah?l&a?å???kkoh?lavk?naitsirk?r&af?eg&e?ie???tef?y&onnorb?ønnørb?????r&a&blavs!.sg??g&eppo?la???o&j&f&a!dniv?k?vk??die?e&dnas?kkelf??llins?r&iel?ots??s&lab?t&ab?åb??yt??å!k??ævk??les??ts??åg&eppo?lå???ureksub.sen??e&ayb-yrettn--nx?d&ar?lom?r&of?øf??år??g&gyr?nats??i&meuv&ejsem&aan?åån??sekaal??rjea??j&d&ef?oks??les??k&er&aom?åom??hgna&ark?årk??iregnir?kot!s??s&ig?uaf???l&bmab?kyb?l&av?ehtats??oh??m&it?ojt?øjt??n&arg?g&os?øs??meh?reil?te?ummok?yrb??r&dils-erts&ev?y&o?ø???ua?vod??sa&ans?åns??t&robraa?spaav??urg??f&62ats-ugsrop--nx?a&10-ujvrekkhr--nx?7k-tajjrv-attm--nx??o!.sg?h??s!.sg??v!.sg???g&5aly-yr&n--nx?v--nx??a&llor?ve&gnal?lreb???n&av!snellu??org??oks&die?m&or?ør??ner&ol?øl??r&o?ø???r&eb!adnar?edyps?s&die?elf?gnok?n&ot?øt????obspras??uahatsla?åve&gnal?lreb???h&0alu-ysm--nx?7&4ay8-akiivagg--nx?5ay7-atkoulok--nx??a!.sg???i&e&hsr&agev?ågev??rf??k&h&avlaraeb?ávlaraeb??s??lm&a?å??mpouvtal&am?ám??pph&al?ál??rrounaddleid?ssaneve?ššáneve??j&0aoq-ysgv--nx?94bawh-akhojrk--nx??k&a&b&ord?ørd??jks?lleis??iv!aklejps?l&am?evs?u??mag?nel?ojg?r&a&l?n??epok?iel?y&or?ør???s&ah?kel?om??øjg??kabene?ojsarak?ram&deh.&aoq-relv--nx?rel&av?åv??so??e&let.&ag5-b--nx?ob?øb??ra???åjks??l&a!d&anrus?d&numurb?ron??e&gnard?nte?s&meh?sin??ttin??g&is?nyl??kro?l&em?l&ejfttah?of??u&ag-ertdim?s???n&am?era?gos?i&b?nroh?r??kos?nus?oj??o-&dron?r&os?øs???ppo?r&a!l?nram??e&gne?l?v??is?o&jts?ts??u&a-&dron?r&os?øs???h??å?æl?øjts??s&e&jg?nivk?ryf??kav?mor-go-er&om.&ednas?yoreh??øm.&ednas?yøreh???uag??t&las?rajh?suan??v&l&a?e-rots??u-go-eron??yt??ksedlig?res&a?å???bib&eklof?seklyf??es!dah??h!.sg??i&m?syrt??l&ejf?ov&etsua?gnit?ksa?sdie???n!.sg??o!.sg?boh?g?h??r!.sg??å!ksedlig??øboh??m&a&rah?vk??f!.sg??h!.sg??i&e&h&dnort?rtsua?ssej??rkrejb??ksa??ol?t!.sg??u&dom?esum?r&ab?drejg?evle?os?uh?æb?øs??ttals???n&a&g&av?okssman?åv??jlis?or?r&g?rev???e&d&do&sen?ton??lah?r&agy&o?ø??ojfsam???g&iets?n&a&l&as?lab??n&avk?ævk??t&arg?ddosen??v&al?essov???i&d&ol?øl??l&ar?ær???yl??reb??iks?k&srot?y&or?ør???l&a&d&gnos?n&er?ojm?øjm??om??tloh??ug?åtloh??mmard?ojs&om?sendnas??ppolg?s&lahsladr&ojts?øjts??o??t&o&l?t-erts&ev?o?ø???roh?øl??vly&kkys?nav??yam-naj!.sg??øjs&om?sendnas???g&orf?ujb??i&dnaort?vnarg??kob?ladendua?maherk&a?å??n&it?urgsrop??orf-&dron?r&os?øs???r&aieb?evats??sfev?uaks?yrts??o&6axi-ygvtsev--nx?c,d&ob?rav??ievs?kssouf?l&m&ob?øb??ous&adna?ech&ac?áč???so!.sg???msdeks?niekotuak?r&egark?olf?y&oso?øso???s&dav?mort???p&ed?p&akdron?elk???r&a&d&dj&ab?áb??iab??jtif?luag?mah?vsyt??e&gn&a&k&iel?ro??merb?n&at?mas??rav-r&os?øs??srop?talf?v&ats?el??y&oh?øh???ivsgnok??il?jkniets?k&a&nvej?rem?s&gnir?nellu???ie-er&den?v&o?ø???ram?sa?årem??la&jf?vh??m&b&ah?áh??mahellil??nnul?ts&l&oj?øj??ul??y&o?ø???imp&ah?áh??m!.sg??osir?t!.sg??ádiáb?ævsyt?øsir??s&adnil?en&dnas?e&dga?k&ri&b?k??som??ve??me&h?jg??nroh-go-ejve?s&a?ednil?k&o?ø??of?yt?å??tsev??gv?hf?igaval?o&r&or?ør??sman??so&fen&oh?øh??m?v??uh&lem?sreka.sen??å!dnil???t&a&baol?g&aov?grav??jjr&av-attam?áv-attám??l&a&b?s??ás??soum?ts?v&eib?our???e&dnaly&oh?øh??f?s&nyt?rokomsdeks?sen??vtpiks??in&aks?áks??loh&ar?år??n!.sg??o&m&a?å??psgolb,?s!.sg?efremmah?or?ør??terdi?á&baol?ggráv?lá&b?s??soum?veib???u&b!.sg?alk?e&dna?gnir?nner??les?ælk??dra&b?eb??g&nasrop?vi?ŋásrop??j&daehal&a?á??jedub?v&arekkhar?árekkhár???ksiouf?n&diaegadvoug?taed???v&irp?lesl&am?åm???y&b&essen?nart?sebel?tsev??o&d&ar?na!s??or??gavtsev?k&rajb?sa??lem?mrak?n&art?n&if?orb???r&a&mah?n?v??e&dni?t&so?ton??va??ul?yd??s&am?enner?gav?lrak?tivk??vrejks??ø&d&ar?na!s??ør??gåvtsev?k&rajb?sa??lem?mrak?n&art?n&if?ørb???r&e&dni?t&so?tøn??va??ul?yd?æ&n?v???s&enner?gåv?tivk?åm??vrejks???á&slág?tlá?vreiks??å&gåv?h?jddådåb?lf??ø&d&ob?rav??r&egark?olf??s&dav?mort????aki?i&sac?tal??u??o&b?f?g?hay?o?ttat??r!.&cer?erots?gro?m&o&c?n??rif?t?yn,?o&c,fni??pohs,stra?t&n?opsgolb,?www??e&a!.&a&ac?cgd?idem??bulc!orea??ci&ffartria?taborea??e&cn&a&l&lievrus-ria?ubma??netniam?rusni??erefnoc??gnahcxe?mordorea?ni&gne?lria?zagam??rawtfos??gni&d&art?ilg!arap?gnah???l&dnahdnuorg?ledom??noollab?retac?sael?t&lusnoc?uhcarap??vidyks??hcraeser?l&anruoj?euf?icnuoc?ortnoc!-ciffart-ria???n&gised?oi&nu?t&a&cifitrec?ercer?gi&tsevni-tnedicca?van??i&cossa!-regnessap??valivic??redef??cudorp?neverp-tnedicca????ograc?p&ihsnoipmahc?uorg!gnikrow???r&e&dart?enigne?korb?niart?trahc??o&htua?tacude???s&citsigol?e&civres?r??krow?serp!xe??tnega??t&farcr&ia?otor??hgil&f?orcim??liubemoh?n&atlusnoc?e&duts?m&esuma?n&iatretne?revog??piuqe????olip?ropria?si&lanruoj?tneics???w&erc?ohs??y&cnegreme?dobper?tefas????rref?z??p!.&a&aa?ca?pc??dem?ecartsnd.icb,gne?r&ab?uj??snduolc,t&acova?cca?hcer??wal?ysrab,???s!.&em?gro?hcs,moc?ten?ude?vog???t!.&116,ayo,gro?lim?moc?nayn,sulpnpv,t&cennockciuq.tcerid,en??ude?v&dr,og???o&hp?m?v?yk??tol?ua??v&iv?lov??xas?ykot??p&a&ehc?g?m?s??cj?eej?g!.&gro?ibom?moc?ossa?ppa,ten?ude???i&r!.nalc,?v?z??j!.&a&3&5xq6f--nx?xqi0ostn--nx??5wtb6--nx?85uwuu--nx?9xtlk--nx?bihc!.&a&bihciakoy?don?ma&him?ye&ragan?tat???r&a&bom?gan?hihci??u&agedos?kas?ustak???s&os?ufomihs??t&amihcay?iran??w&a&g&im&anah?o??omak??kihci?zustum??ihsak??y&agamak?imonihci???e&akas?nagot??i&azni?esohc?h&asa?s&abanuf?ohc???ka&to?zok??musi?orihs?r&akihabihsokoy?o&dim?tak??ukujuk??usihs??nano&hc?yk??o&d&iakustoy?ustam??hsonhot?k&a&rihs?t??iba??nihsaran?sobimanim?tas&arihsimao?imot??uhc?yihcay??u&kujno?s&ayaru?t&imik?tuf???zarasik????g&as!.&a&gas?m&a&tamah?yik??ihsak??rat?t&a&gatik?hatik??ira!ihsin????e&kaira?nimimak??i&akneg?g&aruyk?o??h&c&amo?uo??siorihs??kaznak?modukuf?ra&gonihsoy?mi???nezih?u&k&at?ohuok??s&ot?tarak?????ihs!.&a&kok?m&a&hagan?yirom??ihsakat??rabiam?wagoton??e&miharot?nokih??houyr?i&azaihsin?esok?kustakat?moihsagih??na&mihcahimo?nok??o&hsia?mag?t&asoyot?ok?tir???us&ay?t&asuk?o??????k&aso!.&a&d&awihsik?eki??k&a&noyot?s&akaayahihc?oihsagih???oadat?uziak??m&ayas!akaso??odak??r&a&bustam?wihsak??ediijuf??t&akarih?i&k?us???wag&ayen?odoyihsagih???e&son?tawanojihs??honim?i&akas?h&cugirom?s&ayabadnot?i&a&kat?t??n??oyimusihsagih???k&a&rabi?sim??ustakat??muzi?r&ijat?otamuk???nan&ak?n&ah?es???o&ay?n&a&ganihcawak?simuzi?tak??eba?ikibah?oyot??t&anim?iad?omamihs??uhc??ust&oimuzi?tes????ou&kuf!.&a&d&amay?eos??g&no?ok?usak??hiku?k&awayim?uzii??ma&kan?y&asih?im???rawak?t&a&gon?ka&h?num?t???umo??wa&g&a&kan?nay?t??ias??ko!rih???y&ihsa?usak???e&m&ay?uruk??taruk?us??i&a&nohs?raihcat??goruk?h&cukuf?s&a&gih?hukuy??in???k&a&gako?muzim??iust?o?ustani??m&anim?otihsoynihs?u??r&ogo?ugasas??usu??ne&siek?zu&b?kihc???o&gukihc?h&ak?ot?ukihc??j&ono?ukihc??kayim?nihsukihc?to?uhc??u&fiazad?gnihs?stoyot????zihs!.&a&bmetog?d&amihs?eijuf?ihsoy?omihs??kouzihs?mihsim?ra&biah?honikam??tawi?wa&g&ekak?ukik??kijuf??yimonijuf??i&a&ra?sok??hcamirom?juf?kaz&eamo?ustam??ma&nnak?ta??nukonuzi?orukuf??nohenawak?o&nosus?ti??u&stamamah?z&a&mun?wak??i!ay?i&hs&agih?in??manim??mihs????????m&a&tias!.&a&d&ihsoy?ot?usah??k&a&dih?sa??o&arihs?s???m&a&tias?y&as?o&rom?tah??ustamihsagih???i&hsagurust?jawak??uri??ni?wa&g&e&ko?man??ikot?o??k&ara?i&hsoy?mak???ru?zorokot??y&a&g&amuk?ihsok?otah??kuf??imo??ziin??e&bakusak?ogawak?sogo?ttas?zokoy??i&baraw?h&cugawak?s&oyim?ubustam???iroy?k&ato?ihs?u&k?stawi???m&akoyr?i&hsoy?juf??uziimak???naznar?o&dakas?ihsay?jnoh?n&a&go?nim??imijuf?nah?oy??r&ihsayim?otagan??t&asim!ak??igus?omatik??zak??u&bihcihc!ihsagih??sonuok?ynah????y&ak&aw!.&a&d&ira?notimak??kadih?ma&h&arihs?im??y&a&kaw?tik??oduk???ru&ustakihcan?y??sauy?wa&g&a&dira?zok??orih??konik??yok?zok??e&banat?dawi??i&garustak?jiat?mani??naniak?o&bog?nimik?t&asim?omihs&ah?uk????ugnihs???o!.&a&jos?koasak?m&ay&ako?ust??ihsayah??r&abi?ukawaihsin??wi&aka?nam???e&gakay?kaw??i&gan?h&cu&kasa?otes??sahakat??k&asim?ihsaruk??miin??n&anemuk?ezib??o&hsotas?jnihs?n&amat?imagak??ohs?uhcibik?????ot!.&a&damay?got?koakat?may&etat?ot??nahoj?riat?waki&inakan?reman???eb&ayo?oruk??i&h&asa?ciimak?sahanuf??kuzanu?m&an&i?ot??ih???nezuyn?otnan?u&hcuf?stimukuf?z&imi?ou???????ihs&o&gak!.&a&m&ayuok?ihsogak??si?yonak??e&banawak?n&at&akan?imanim??uka??tomoonihsin??i&adnesamustas?k&azarukam?oih??m&ama?uzi??usuy??nesi?o&knik?os?tomustam??uzimurat???rih!.&a&ka&n?s??m&ayukuf?i&hsorihihsagih?j&ate?imakikaso????r&a&bohs?h&ekat?im???es??tiak?wiad??e&kato?ruk??i&h&ci&akustah?mono?nihs??s&inares?oyim???manimasa?uk??negokikesnij?o&gnoh?namuk??uhcuf????uk&ot!.&a&bihci?mi&hsu&kot?stamok??m??wagakan??egihsustam?i&gum?h&coganas?soyim??kijaw?m&anim?uzia??ukihsihs??nan&a?iak??o&nati?turan????uf!.&a&batuf?m&a&to?y&enak?irok???ihs&im?ukuf??os?uko??r&aboihsatik?uganat??ta&katik?mawak?rih??w&a&g&akus?emas?uy??k&a&mat?rihs?sa??ihsi??nah??ohs???e&gnabuzia?iman?ta&d?tii???i&adnab?enet?hs&agih?iimagak??k&a&wi?zimuzi??ubay??minuk?r&ook?ustamay???nihsiat?o&g&etomo?ihsin?nan?omihs??no!duruf?rih??rihsawani?ta&may?simuzia???u&rahim?stamakawuzia?zia&ihsin?nay???????nug!.&a&bawak?doyihc?k&anna?oi&hsoy?juf?mot???m&ayakat?ustagaihsagih??n&ihsatak?nak??r&ahonagan?nak?o?u&kati?mamat???t&amun?inomihs?o??w&akubihs?iem?ohs???i&hsa&beam?yabetat??kas&akat?esi??m&akanim?uzio??ogamust?rodim??o&jonakan?n&eu?oyikust??tnihs??u&komnan?stasuk?yrik?????ran!.&a&bihsak?d&akatotamay?u!o???guraki?m&ay&atik&imak?omihs??irokotamay??oki??ra&hihsak?n??wa&geson?knet???e&kayim?ozamay?sog?ustim??i&a&rukas?wak??garustak?h&ciomihs?sinawak??jo?ka&mnak?toruk??makawak?nos?r&net?otakat?ugeh???o&d&na?oyo??gnas?jnihs?nihsoy!ihsagih??tomarawat?yrok????t&ag&amay!.&a&dihsio?k&atarihs?ourust??may&a&kan?rum??enak?onimak??rukho?ta&ga&may?nuf??hakat?kas??wa&g&ekas?orumam??ki&hsin?m??z&anabo?enoy?ot???zuy??e&agas?bonamay?dii?nihsagih?o??i&a&gan?nohs??h&asa?sinawak??nugo??o&dnet?jnihs?ynan??ukohak???iin!.&a&ga?k&ium?oagan??munou!imanim??t&a&bihs?giin??ioy??w&a&gioti?kikes?zuy??irak??yijo??e&kustim?mabust??i&aniat?hcamakot?kaz&awihsak?omuzi??m&a&gat?karum??o???n&anust?esog??o&das?ihcot?jnas?k&ihay?oym??mak?naga?ries??u&ories?steoj?????i&ka!.&a&go?k&asok?oimak??t&ago!rihcah??ika!atik???w&aki?oyk???e&mojog?natim?suranihsagih?t&ado?okoy???i&hsoyirom?magatak?naokimak??nesiad?o&hakin?jnoh!iruy??nuzak?rihson?tasi&juf?m??yjnoh??u&kobmes?oppah????o!.&a&dakatognub?m&asah?ihsemih??su?t&ekat?i&h?o????e&onokok?ustimak??i&jih?k&asinuk?ias?usu??mukust??onoognub?u&fuy?juk?ppeb?suk??????wa&ga&k!.&a&mihsoan?rihotok?waga&kihsagih?ya???emaguram?i&j&nonak?ustnez??kunas?monihcu??o&hsonot?nnam?yotim??u&st&amakat?odat??zatu????nak!.&a&dustam?kus&okoy?tarih??maz?nibe?r&a&gihsaimanim?h&esi?imagas??wa&do?guy???u&im?kamak???tikamay?wa&k&ia?oyik?umas??sijuf??yimonin??e&nokah?saya??i&akan?esiak?gusta?hsuz?kasagihc?o?ukust??o&nadah?sio?tamay?????kihsi!.&a&danihcu?gak?kihs?mijaw?t&abust?ikawak??wazanak??i&gurust?hcionon?mon?ukah??nasukah?o&anan?ton!akan???u&kohak?stamok?z&imana?us?????niko!.&a&han?m&arat?ijemuk?uru??n&e&dak?zi??no??ra&hihsin?rih??wa&kihsi?niko??yehi?zonig??e&osaru?seay??i&hsagih?jomihs?k&a&gihsi?not??ihsakot??m&a&ginuk?kihsug?maz??igo?otekat??nuga!noy???n&a&moti?timoy?wonig??i&jikan?k???o&gan?jnan?tiad&atik?imanim???u&botom?kusug&akan!atik??imot??rab&anoy?eah???????c&204ugv--nx?462a0t7--nx?678z7vq5d--nx?94ptr5--nx?a??d&17sql1--nx?3thr--nx?5&20xbz--nx?40sj5--nx??7&87tlk--nx?ptlk--nx??861ti4--nx?a?e??e&16thr--nx?5&1a4m2--nx?9ny7k--nx??im!.&a&bot?k&asustam?uzus??m&a&him?y&emak?im???ihs??nawuk?wi&em?k???e&bani?ogawak?si!imanim???i&arataw?gusim?h&asa?ciakkoy??k&a&mat?sosik?t??iat??raban??o&dat?hik?n&amuk?ihseru?o&du?mok????ust???mihe!.&a&m&a&h&ataway?iin??yustam??ij&awu?imak???taki!man???ebot?i&anoh?kasam?rabami??n&ania?egokamuk?oot??o&jias?kihcu?nustam?uhcukokihs?yi!es???u&kohik?zo????n!.&nriheg,teniesa.resu,?amihs!.&a&d&amah?ho?usam??kustay?m&a?ihsoni&hsin?ko???wakih??e&namihs?ustam??i&g&aka?usay??konikak?mikih??nannu?o&mu&kay?zi!ihsagih?uko???nawust?tasim??u&stog?yamat?????tawi!.&a&bahay?d&amay?on??koirom?t&a&honat?katnezukir??imus??w&as&ijuf?uzim??ihs???e&hon&i&hci?n??uk??tawi??i&a&duf?murak?wak??h&custo?si&amak?ukuzihs???j&oboj?uk??k&a&m&anah?uzuk??sagenak??esonihci??m&akatik?uzia&rih?wi????o&kayim?no&rih?t??tanufo??uhso????g&3zsiu--nx?71qstn--nx?l??h&03pv23--nx?13ynr--nx?22tsiu--nx?61qqle--nx??i&54urkm--nx?g&ayim!.&a&dukak?m&a&goihs?kihs??ihsustam!ihsagih??unawi??r&awago?iho??ta&bihs?rum??w&a&gano?kuruf??iat??y&imot?ukaw???e&mot?nimes??i&hsiorihs?ka&monihsi?s&awak?o???mak?r&ataw?o&muram?tan????o&az?jagat?t&asim?omamay???u&fir?k&irnasimanim?uhsakihcihs?????ihcot!.&a&g&a&h?kihsa??ust??kom?m&ay&o?usarak??unak??r&a&boihsusan?watho??iho?ukas??t&akihsin?iay??wa&konimak?zenakat??y&imonustu?oihs???e&iiju?kustomihs?nufawi??i&akihci?g&etom?ihcot?on???o&k&ihsam?kin??nas?sioruk?tab??u&bim?san?????h&c&ia!.&a&dnah?m&a!h&akat?im??yuni??ihs&ibot?ust???r&a&hat?tihs??ik?u&ihsagih?kawi???t&ihc?o&k?yot???wa&koyot?zani??yi&monihci?rak???e&inak?k&aoyot?usa??manokot?noyot??i&a&gusak?kot?sia??eot?h&asairawo?cugo?s&ahoyot?oyim???k&a&mok?zako??ihssi??motay?rogamag??n&an&ikeh?ok??ihssin??o&got?ihsin?jna?rihsnihs?suf?tes??u&bo?raho?s&oyik?takihs??yrihc?zah????ok!.&a&dusay?kadih?mayotom?r&ah&im?usuy??umakan??sot!ihsin??wa&g&atik?odoyin??k&as?o????i&esieg?hco!k??jamu?k&a!sus??usto??ma&gak?k??rahan??o&mukus?n&i?ust!ihsagih???torum?yot!o???u&koknan?zimihsasot????ugamay!.&a&m&ayukot?ihso??toyot??e&bu?subat??i&gah?kesonomihs?nukawi?rakih??nanuhs?otagan?u&ba?foh?otim?stamaduk?uy?????sanamay!.&a&dihsoyijuf?mayabat?r&ahoneu?ustakihsin??w&a&k&ayah?ijuf??suran??ohs???egusok?i&ak?h&cimakan?s&anamay?od???k&asarin?u&feuf?sto????o&k&akanamay?ihcugawakijuf??nihso?t&asimawakihci?ukoh??uhc??spla-imanim?u&b&nan?onim??fok?hsok?rust?????ka&rabi!.&a&bukust?gok?kan!ihcatih??m&a&sak?timo?wi??ihsak?ustomihs??ni?r&a&hihcu?way??u&agimusak?ihcust???t&ag&amay?eman??oihcatih??w&ag&arukas?o??os??yi&moihcatih?rom???e&bomot?dirot?not?tadomihs??i&a&k&as?ot??rao??esukihc?gahakat?h&asa?catih??k&a&rabi?saguyr??ihsani?uy??ma?rukustamat??o&dnab?giad?him?kati?rihsijuf?soj?t&asorihs?im??yihcay??u&fius?kihsu?simak????sagan!.&a&m&abo?ihsust??natawak?r&abamihs?u&mo?ustam???wijihc?yahasi??i&akias?hies?k&asagan?i??masah??neznu?o&besas?darih?t&eso?og!imaknihs????ust&igot?onihcuk?uf????zayim!.&a&biihs?guyh?k&oebon?ustorom??mihsuk?r&emihsin?uatik??ta&katik?mim??wag&atik?odak??ya??e&banakat?sakog??i&hsayabok?kaza&kat?yim??m&animawak?ot&inuk?nihs????nanihcin?o&j&ik?onokayim??n&ibe?ust??tias??urahakat????ro&moa!.&a&dawot?turust?wasim??e&hon&ihc&ah?ihs??nas?og?ukor??sario??i&anarih?ganayati?hsioruk?jehon?kasorih?makihsah?nawo?r&amodakan?omoa???o&gnihs?kkat??u&ragust?stum????ttot!.&a&r&ahawak?uotok??sa&kaw?sim???egok?irottot?nanihcin?o&ganoy?nih?tanimiakas??u&bnan?z&ay?ihc??????ukuf!.&a&deki?gurust?ma&bo?h&akat?im??yustak??sakaw??eabas?i&akas?ho?jiehie?ukuf??nezihce!imanim??ono????k&26rtl8--nx?4&3qtr5--nx?ytjd--nx??522tin--nx?797ti4--nx??l33ussp--nx?m&11tqqq--nx?41s3c--nx??n&30sql1--nx?65zqhe--nx?n7p7qrt0--nx??o&131rot--nx?7qrbk--nx?c?diakkoh!.&a&deki?gakihset?hcebihs?k&adih?u&fib?narihs???m&ayiruk?hot?ihs&orihatik?ukuf??oras?usta??r&ib&a!ka??o?uruf??ozo?u&gakihsagih?oyot???sakim?ta&gikust?mun??w&a&ga&k&an?uf??nus!imak???k&aru?i&h&asa?sagih??kat?mak??omihs?um??zimawi??ine?oyk??yot??e&a&mustam?nan??b&a&kihs?yak??o&noroh?to???ian?k&ihsam?ufoto??nakami?ppoko!ihsin??sotihc?tad!okah??uonikat??i&a&bib?mokamot?n&a&k&kaw?oroh??wi??eomak?ihsatu?okik?usta&moruk?sakan????eib?h&c&ioy?u&bmek?irihs???s&ase?ekka?oknar?uesom???jufirihsir?k&amamihs?i&at?n???m&atik?otoyot??oa&kihs?rihs??r&a&hs?kihsi?mot??ihs&aba?ir??otarib???n&a&hctuk?rorum?se?tokahs??uber??o&kayot?m&ire?ukay??naruf!ima&k?nim???orih?r&ih&ibo?suk??o&bah?h&i&b?hsimak??sa??pnan?yan??umen??t&asoyik?eko?ukoh???u&bassa?kotnihs?m&assaw?uo??pp&akiin?en&ioto?nuk??ip??rato?s&akat?t&eb&e?i&a?hs!a??robon??m&e?o&m?takan???no&h?tamah??o&mik?s?t??u&kir?ppihc?st???onihsnihs?ufuras??uaru??yru!koh??zimihs!ok?????g!oyh!.&a&bmat?dnas?gusak?k&at?o&oyot?y??uzarakat??m&ayasas?irah??wa&g&ani?okak??k&i&hci?mak??oy???yi&hsa?monihsin???i&asak?hs&aka?i&at?nawak???j&awa!imanim??emih??k&a&goa?s&agama?ukuf??wihsin??i&hsog?m???mati?oia?rogimak??n&annas?esnonihs??o&gasa!kat??ka?n&ikat?o?ustat??rihsay?sihs?tomus?yas??u&bay?gnihs?????nagan!.&a&bukah?d&a&w?yim??e&ki?u??ii??k&a&s&ay?uki??zus??ihsoo?ousay??m&ay&akat?ii??i&hsukufosik?jii??ukihc??n&i!hsetat??uzii??r&ah?ugot??saim?t&agamay?oyim??w&a&g&a&kan?n??o??kustam?ziurak??onim!imanim??u&koo?s!omihs????ya&ko?rih???e&akas?nagamok?subo??i&gakat?h&asa?c&a!mo!nanihs???uonamay??sukagot??k&a&kas?mimanim?to??ia&atik?imanim??oa?uzihcom??m&akawak?ijuf?o!t???r&ato?ijoihs?omakat???n&ana?esnoawazon??o&hukas?n&a&gan?kan??i&hc?muza??ustat??romok?si&gan?k??tomustam??u&k&as?ohukihc??stamega????to&mamuk!.&a&gamay?rahihsin?sukama!imak??tamanim??enufim?i&hcukik?k&ihsam?u??nugo!imanim??romakat??o&ara?rihsustay?sa?t&amay?om&amuk?us??u!koyg???yohc??u&sagan?zo????yk!.&a&bmatoyk?k&ies?oemak?uzaw??mayi&h&cukuf?sagih??muk??nihsamay?rawatiju?t&away?ik???e&ba&nat!oyk??ya??di?ni??i&ju?kazamayo?manim??natnan?o&gnatoyk?kum?mak?rihsamayimanim?y&gakan?ka&koagan?s??oj???u&ruziam?z&ayim?ik??????wtc1--nx?ykot!.&a&d&i&hcam?mus??oyihc??k&atim?ihsustak??m&a&t!uko??yarumihsa&gih?sum???i&hs&agoa?ika?o!t??uzuok??ren???r&a&honih?wasago??iadok?umah??ssuf?t&ik?o??wa&g&anihs?ode??k&ara?ihcat???y&agates?ubihs???e&amok?donih?m&o?urukihsagih??soyik??i&enagok?gani?h&ca&da?tinuk??sabati??j&nubukok?oihcah??manigus??o&huzim?jihcah?n&akan?ih!sasum??urika??rugem?t&a&mayihsagih?nim??iat?ok??uhc?yknub??u&fohc?hcuf?kujnihs?????r&2xro6--nx?g?o??s&9nvfe--nx?xvp4--nx??t&netnocresu,opsgolb,?u&4rvp8--nx?fig!.&a&d&eki?ih??kimot?m&ayakat?ihsah??ne?raha&gi&kes?makak??sak??taga&may?tik??wa&g&ibi?ustakan??karihs!ihsagih????e&katim?uawak??i&gohakas?hc&apna?uonaw??k&ago?es?ot??m&anuzim?ijat??nak?urat??nanig?o&dog?jug?makonim?nim?roy?sihcih??u&fig?s&otom?t&amasak?oay???????x5ytlk--nx?yu6d27srjd--nx?z72thr--nx?井福?京東?分大?取鳥?口山?城&宮?茨??媛愛?山&富?岡?歌和??岡&福?静??島&児鹿?広?徳?福??崎&宮?長??川&奈神?石?香??庫兵?形山?手岩?木栃?本熊?根島?梨山?森青?潟新?玉埼?田秋?知&愛?高??縄沖?良奈?葉千?賀&佐?滋??道海北?都京?重三?野長?阜岐?阪大?馬群???k!.&art?gro?moc?per?ude?vog???l&eh?l??m!ac?j??nd?o&g?h&pih?s!.ysrab,??lnud?oc?t!.&lldtn,snd-won,???pa!.&0mroftalp,arusah,bew,enilnigol,lecrev,nur:.a,,t&ibelet,xenw,?yfilten,??ra&a?hs??u&ekam?llag?org!.esruocsid,cts?kouk?nayalo???vsr?xece4ibgm--nx??q&a!3a9y--nx??g?i!.&gro?lim?moc?ten?ude?vog???m?se??r&a!.&acisum?bog?gro?lim?moc!.topsgolb,?rut?t&en?ni??ude?vog??4d5a4prebgm--nx?b?c?eydoog?los?t&at?s!uen???ugaj??b!.&21g?a&b&a&coros?iuc??itiruc??cnogoas?dicerapa?gniram?i&naiog?ramatnas??n&erom?irdnol??op?p&acam?irolf?ma&j?s???rief?tsivaob??b!aj?ib?mi?sb??c&ba?e&r?t??js?sp?t!e???d&em?mb?n&f?i??rt??e&dnarganipmac?ficer?ht?llivnioj?rdnaotnas??f&dj?ed?gg?n&e?i???g&e&l!.&a&b,m,p,?bp,c&a,s,?e&c,p,s,?fd,gm,ip,jr,la,ma,nr,o&g,r,t,?p&a,s,?r&p,r,?s&e,m,r,?tm,??s??l&s?z??n&c?e?o??ol!b?f?v??pp?ro??hvp?i&du?kiw?nana?oretin?r&c?eurab??sp?te?xat??l&at&an?rof??el?im?sq??m&a?da?e&gatnoc?leb??f?ic?oc!.topsgolb,??nce?o&ariebir?c&e?narboir?saso??d&o?ranreboas??e&g?t??i&b?dar?ecam?r??rp?t&a?erpoir???p&er?m!e?t??ooc?pa?se??qra?r&af?ga?o&davlas?j??tn?ut??s&a&ixac?mlap?nipmac??ed?u&anam?j?m???t&am?e&d?n?v??nc?o&f?n??ra?sf??u&caug9?de?ja?rg??v&da?ed?og!.&a&b?m?p??bp?c&a?s??e&c?p?s??fd?gm?ip?jr?la?ma?nr?o&g?r?t??p&a?s??r&p?r??s&e?m?r??tm???rs?t??xiv?z&hb?ls?o&c?f?????c!.&as?ca?de?if?o&c?g??ro???e&bew?ccos?dnik?e&b?n&igne?oip??rac??gni&arg?rheob??h&cor?sok?t&aew?orb???itnorf?k&col?o&p?rb???l&aed?ffeahcs??mal?nes?pinuj?t&a&eht?rebsnegömrev??law?nec?s&acnal?nom?ubkcolb??upmoc??v&o&c&sid?tfiws??rdnal??resbo??wulksretlow?ywal?zifp??f!.&aterg?bew-no,drp?e&c&itsuj-reissiuh?narf-ne-setsitned-sneigrurihc,?rianiretev??i&cc?rgabmahc??m&o&c?n??t??n&eicamrahp?icedem??ossa?s&e&lbatpmoc-strepxe?riaton?tsitned-sneigrurihc?uova??o&-x&bf,obeerf,?x&bf,obeerf,???t&acova?o&or-ne,psgolb,?r&epxe-ertemoeg?op!orea????vuog??avc7ylqbgm--nx?s??g!.&gro?m&oc?yn,?t&en?opsgolb,?ude?vog???h!.&e&erf,man??mo&c?rf??topsgolb,zi??ur??i!.&a&61f4a3abgm--nx?rf4a3abgm--nx??ca?di?gro?hcs?oc?ten?vog?نار&يا?یا???a&h?per??ew?lf??k!.&c&a?s??e&n?p?r??gk?iggnoeyg?kub&gn&oeyg?uhc??noej??l&im?uoes??man&gn&oeyg?uhc??noej??n&as&lu?ub??o&e&hcni?jead??wgnag???o&c?g??ro?s&e?h?m??topsgolb,u&gead?j&ej?gnawg????cilf??l!.&gro?moc?ten?ude?vog???m!.&topsgolb,vog???n!.&gro?moc?ofni?ten?ude?vog?zib???o&htua?odtnorf?t&c&a?od??laer???p!.&alsi?ca?eman?forp?gro?moc?o&fni?rp??t&en?se??ude?vog?zib???s?t!.&21k?bew?cn!.vog??eman?gro?kst?l&e&b?t??im?op??moc!.topsgolb,?neg?ofni?pek?rd?sbb?ten?ude?v&a?og?t??zib??f?m??ubad?vd??s&8sqif--nx?9zqif--nx?a!.vog?birappnb?gev?lliv?mtsirhc?s??b!.&ew,gro?moc?ten?ude?vog??c?oj?s?u??c&i&hparg?p?t&sigolyrrek?ylana???od??d&a?d?l?n&iwriaf?omaid??oogemoh?rac??e!.&bog?gro?mo&c!.topsgolb,?n??ude??civres!.enilnigol,?d&d2bgm--nx?oc??h&ctaw?guh??i&lppus?rtsudni?treporp!yrrek???jaiv?l&aw?cycrotom?etoh?gnis?pats??m&ag?oh?reh??nut?ohs?picer?r&it?ut&cip!.7331,?nev???s!i&rpretne?urc??ruoc??taicossa?vig??g!nidloh??h5c822qif--nx?i!.&ekacpuc,gro?moc?t&en?ni?opsgolb,?ude?vog??a09--nx?nnet?rap?targ??k&c&or!.&ecapsbew,snddym,ytic-amil,??us??hxda08--nx?row??l!.&c&a?s??ed,gro?o&c?fni??ten?ude?vog?zib??a&ed?tner??e&ssurb?toh!yrrek???lahsram?m?oot??m!.&bal,gro?moc?ten?ude?vog??b?etsys!.tniopthgink,?ialc??n&a&f?gorf?ol??egassap?i&a&grab?mod??giro??o&it&acav?cudorp?ulos??puoc???o&dnoc?geuj?leuv?ppaz?t&ohp?ua???p!.&ces?gro?moc?olp?ten?ude?vog??i&hsralohcs?lihp?t??u??r!.&au,ca?gro?mon,ni?oc?topsgolb,ude?vog?xo,?a&c?p?tiug??c?e&dliub?erac?gor?levart?mraf?n&niw?trap??wolf??ot&cartnoc?omatat??pj?uot??s!.&gro?moc?ten?ude?vog?zib??alg?e&n&isub!.oc,?tif??rp!xe!nacirema???xnal??iws??t&a&e&b?ytic??ob??ek&cit?ram??fig?h&cay?gilf??n&atnuocca?e&mt&rapa?sevni??ve!.oc,???rap??u!.&a&c!.&21k?bil?cc???g!.&21k?bil?cc???i!.&21k?bil?cc???l!.&21k?bil?cc???m!.&21k!.&hcorap?rthc?tvp???bil?cc???p!.&21k?bil?cc???si?v!.&21k?bil?cc???w!.&21k?bil?cc????c&d!.&21k?bil?cc???n!.&21k?bil?cc???s!.&21k?bil?cc????d&ef?i!.&21k?bil?cc???m!.&21k?bil?cc???n!.&bil?cc???s!.&bil?cc???urd,?e&d!.&21k?bil,cc???las-4-&dnal,ffuts,?m!.&21k?bil?cc???n!.&21k?bil?cc????h&n!.&21k?bil?cc???o!.&21k?bil?cc????i&h!.&bil?cc???m!.&21k?bil?c&c?et??goc?n&eg?otae??robra-nna?sum?tsd?wanethsaw???nd?r!.&bil?cc???v!.&21k?bil?cc???w!.&21k?bil?cc????jn!.&21k?bil?cc???k&a!.&21k?bil?cc???o!.&21k?bil?cc????l&a!.&21k?bil?cc???f!.&21k?bil?cc???i!.&21k?bil?cc????mn!.&21k?bil?cc???n&afflog,i!.&21k?bil?cc???m!.&21k?bil?cc???sn?t!.&21k?bil?cc????o&c!.&21k?bil?cc???m!.&21k?bil?cc???ttniop,?p&ion,rettalp,?r&a!.&21k?bil?cc???o!.&21k?bil?cc???p!.&21k?bil?cc????s&a!.&21k?bil?cc???dik?k!.&21k?bil?cc???m!.&21k?bil?cc???nd&deerf,uolc,??t&c!.&21k?bil?cc???m!.&21k?bil?cc???u!.&21k?bil?cc???v!.&21k?bil?cc????ug!.&21k?bil?cc???v&n!.&21k?bil?cc???w!.cc???x&ohparg,t!.&21k?bil?cc????y&b-si,k!.&21k?bil?cc???n!.&21k?bil?cc???w!.&21k?bil?cc????za!.&21k?bil?cc????ah!uab??bria?col?e!.ytrap.resu,?ineserf?lp?xe&l?n???vt?w!.&66duolc,gro?moc?s&ndnyd,tepym,?ten?ude?vog??a?e&iver?n??odniw??y&alcrab?cam?ot???t&0srzc--nx?a!.&amil4,ca!.hts??gni&liamerutuf,tsoherutuf,?o&c!.topsgolb,?fni,?ph21,r&euefknuf.neiw,o??v&g?irp,?xi2,ytic-amil,zib,?c?e!s??hc?if?l!asite??mami?rcomed??b!.&gro?moc?ten?ude?vog??b?gl??c&atnoc?e&les?rid!txen????dimhcs?e!.&eman?gro?moc?ofni?ten?ude?vog?zib??b?em?grat?id?k&circ?ram??n!.&0&002cilc,rab,?1rab,2rab,5inu,6vnyd,7&7ndc.r,erauqs,?a&l&-morf,moob,?minifed,remacytirucesym,tadsyawla,z,?b&boi,g,lyltsaf:.pam,,?c&inagro-gnitae,paidemym,?d&ecalpb,nab-eht-ni,uolc&meaeboda,nievas.citsalej,xednay:.e&garots,tisbew,?,??e&cnarusnihtlaehezitavirp,gdirbtib,ht-no-eciffo,l&acsnoom,ibom-eruza,?m&ecnuob,ohtanyd,tcerider,?nozdop,rehurht,s,tis-repparcs,zamkcar,?f&aeletis,crs.&cos,resu,?ehc-a-si,?g&ni&reesnes,tsohnnylf,?olbevres,?k&eeg-a&-si,si,?u,?l&acolottad,iamwt,s&d-ni,s-77ndc,??m&ac&asac,ih,?urofniem,?n&a&f&agp,lhn,?ibed,?dcduabkcalb,i,pv-ni,?o&c-morf,jodsnd,rp-ytinummoc,ttadym,?p&i&-&etsef,on,?emoh,fles,nwo,?j,mac-dnab-ta,o&-oidar-mah,hbew,?pa&duolc,egde,?tfe&moh,vres,?usnd,?r&e&tsulcyduolc,vres-xnk,?vdslennahc:.u,,?s&a&ila&nyd,snd,?nymsd,?bbevres,dylimaf,e&suohsyub,t&isbeweruza,ys,??kekokohcs,n&d&-won,d,golb,npv,?oitcnufduolc,?s&a-skcik,ecca&-citats,duolc,???t&adies,ceffeym,e&nretnifodne,smem,?farcenimevres,i-&ekorb,s&eod,lles,teg,??n&essidym,orfduolc,?r0p3l3t,s&ixetnod,ohgnik,??u&h,nyd,r,?x&inuemoh,spym,tsale.1ots-slj,unilemoh,?y&awetag-llawerif,ffijduolc,ltsaf.&dorp.&a,labolg,?lss.&a,b,labolg,?pam,slteerf,?n&-morf,ofipi,?srab,tieduolc,?z&a-morf,tirfym,???p?tcip?v??f&ig?o&l?sorcim???g!.&bog?dni?ed,g&olb,ro??lim?mo&c?n,?ot,ten?ude???h!.&dem?gro?l&er?op??m&oc?rif??o&fni?rp?s&rep?sa???po&hs?oc??t&en?luda?ra??ude?vuog???i!.&a&2n-loritds--nx?7e-etsoaellav--nx?8&c-aneseclrof--nx?i-lrofanesec--nx??at?b?c!cul??dv?i&blo&-oipmet?oipmet??cserb?drabmol?g&gof?urep??l&gup?i&cis?me&-oigger?oigger???uig&-&aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf???aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf????n&a&brev?cul?pmac?tac??idras?obrac&-saiselgi?saiselgi??resi??otsip?r&b&alac!-oigger?oigger??mu??dna&-&attelrab-inart?inart-attelrab??attelrabinart?inartattelrab?ssela??epmi?ugil??tnelav&-obiv?obiv??vap?z&e&nev?ps&-al?al???irog???l&iuqa!l??leib??m&or?rap??n!acsot?e&dom?is?sec&-&ilrof?ìlrof??ilrof?ìlrof???g&amor&-ailime?ailime??edras?olob??i&ssem?tal??ne!var??o&cna?merc?rev?vas???oneg?p?r!a&csep?rr&ac&-assam?assam??ef??von??etam?tsailgo!-lled?lled???s!ip?sam&-ararrac?ararrac??u&caris?gar???t!a&cilisab?recam??resac?soa!-&d&-&ellav?lav??ellav?lav??ellav??d&-&ellav?lav??ellav?lav??ellav??te&lrab&-&airdna-inart?inart-airdna??airdnainart?inartairdna??ssinatlac???udap?v!o&dap?neg?tnam???zn&airb&-a&lled-e-aznom?znom??a&lledeaznom?znom??eaznom??e&c&aip?iv??soc?top??om???b&-&23,46,61,?3c-lorit-ds-onitnert--nx?be-etsoa&-ellav--nx?dellav--nx??c!f-anesec-lrof--nx?m-lrof-anesec--nx??he-etsoa-d-ellav--nx?m!u??o2-loritds-nezob--nx?sn-loritds&-nasl&ab--nx?ub--nx??nitnert--nx??v!6-lorit-dsnitnert--nx?7-loritds&-nitnert--nx?onitnert--nx???z&r-lorit-ds&-nitnert--nx?onitnert--nx??s-loritds-onitnert--nx???c&f?is?l?m?p?r?v??d&p?u!olcnys,??e&c!cel?inev?nerolf??f?g!ida&-&a&-onitnert?onitnert??otla!-onitnert?onitnert???a&-onitnert?onitnert??otla!-on&azlob?itnert??onitnert????hcram?l?m!or??n&idu?o&n&edrop?isorf??torc???p?r?s&erav?ilom??t!nomeip?s&eirt?oa!-&d-e&ellav?éllav??e&ellav?éllav???de&ellav?éllav??e&ellav?éllav?????v?znerif??g&a?b?f?il?o?p?r?up?vf??hc?i&b?c?dol?f?l!lecrev?opan?rof&-anesec?anesec???m?n&a&part?rt&-attelrab-airdna?attelrabairdna???imir?ret??p?r!a&b?ilgac?ssas???s!idnirb??t&ei&hc?r??sa??v??l&a!c??b?c?o&m?rit&-&d&eus&-&nitnert?onitnert??nitnert?onitnert??us&-&nitnert?onitnert??nitnert?onitnert??üs&-&nitnert?onitnert??nitnert?onitnert???s&-onitnert?onitnert???d&eus!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??us&-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??üs!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert???s&-onitnert?onitnert?????m&ac?f?i?ol?r??n&a!lim?sl&ab?ub???b?c?e!v?zob??irut?m!p??p?r?t??o&a!v??b!retiv??c!cel??enuc?g!ivor??i&dem&-onadipmac?onadipmac??pmet&-aiblo?aiblo??rdnos?zal??l?m!a&greb?ret??oc?re&f?lap???n!a&dipmac&-oidem?oidem??lim?tsiro?zlob??ecip&-ilocsa?ilocsa??i&bru&-orasep?orasep??lleva?rot?tnert??r&elas?ovil??ulleb??p?r!a&sep&-onibru?onibru??znatac??oun??s!ivert?sabopmac??t!arp?e&nev?ssorg??n&arat?e&girga?rt?veneb????zz&era?urba???p&a?s?t??qa?r&a!m?s??b!a??c?f?g?k?me?o?p?s?t?v??s&a&b?iselgi&-ainobrac?ainobrac???b?c?elpan?i?m?ot?s?t?v??t&a?b?c?l?m?nomdeip?o!psgolb,?p?v??u&de?l?n?p??v&a?og?p?s?t?v??y&drabmol?ellav&-atsoa?atsoa??licis?nacsut??z&al?b?c?p??ìlrof&-anesec?anesec???derc?er?f!.sulptp,?m!r??utni??je3a3abgm--nx?kh?l!.&myn,topsgolb,vog??uda??m!.&gro?moc!.topsgolb,?ten?ude???n&a&morockivdnas?ruatser?tnuocca??e&g?m&eganam!.retuor,?piuqe??r??i!.ue?m?opdlog??opud?uocsid??o&b?cs!.vog,?d?g?h?j?oferab?p&edemoh?s???p!.&emon?gro?lbup?m&oc?yn,?t&en?ni?opsgolb,?ude?vog???r&a!m&law?s???epxe?op&er?pus!.ysrab,?s???s!.&adaxiabme?e&motoas?picnirp?rots??gro?lim?mo&c?n,?o&c?dalusnoc?hon,?ten?ude?vog??a&cmoc?f??e&b?padub?r?uq??i!rolf?tned??o&h!.&duolc&p,rim,?e&lej,tiseerf,?flah,s&pvtsaf,seccaduolc,?tsafym,??p!sua???urt??t!.&eman?gro?ibom?levart?m&oc?uesum??o&c?fni?r&ea?p???pooc?sboj?t&en?ni??ude?vog?zib??ayh?n?o!bba?irram???uognah?xen?y?ztej??u&2&5te9--nx?yssp--nx??a!.&a&s?w??civ?d&i?lq??fnoc?gro?moc!.topsgolb,?nsa?ofni?sat?t&ca?en?n??ude!.&a&s?w??ci&lohtac?v??dlq?sat?t&ca?n??wsn!.sloohcs????vog!.&a&s?w??civ?dlq?sat???wsn?zo??ti??c!.&fni?gro?moc?ten?ude?vog??i??d&e!.tir.segap-tig,?iab??e!.&dcym,enozgniebllew,noitatsksid,odagod.citsalej,snd&ps,uolc,?ysrab,??g!.&bew?gro?m&aug?oc??ofni?ten?ude?vog???h!.&0002?a&citore?idem?kitore??edszot?gro?ilus?letoh?m&alker?lif?t?urof??naltagni?o&c?ediv?fni?levynok?nisac??pohs?rarga?s&a&kal?zatu??emag?wen??t&lob?opsgolb,rops??virp?xe&s?zs??ytic?zsagoj??os?sut??l!.&myn,topsgolb,??m!.&ca?gro?moc?oc?ro?ten?vog???n!.&duolcesirpretne,eni&esrem,m,?mon,tenkcahs,uwu,?em!.ysrab,??o&ggnaw?y!c???r!.&a&i&kymlak,rikhsab,vodrom,?yegyda,?bps,ca,eniram,g&bc,nitsohurger.citsalej,ro,?ianatsuk,k&ihclan,s&m,rogitayp,??li&amdlc.bh,m,?moc,natsegad,onijym,pp,ri&b,dcm:.spv,,midalv,?s&ar,itym,?t&en,ni,opsgolb,set,?u&4an,de,?vo&g,n,?ynzorg,zakvakidalv,?myc?p?ug??s!.&a&d&golov,nagarak,?gulak,i&groeg,kymlak,lerak,nemra,rikhsab,ssakahk,vodrom,zahkba,?lut,rahkub,vut,yegyda,znep,?bps,da&baghsa,rgonilest,?gunel,i&anatsuk,hcos,ovan,ttailgot,?k&alhsygnam,ihclan,s&legnahkra,m,n&a&mrum,yrb,?i&buytka,nbo,??tiort,vorkop,??l&ocarak,ybmaj,?myn,na&gruk,jiabreza,ts&egad,hkazak-&htron,tsae,???ovonavi,r&adonsark,imidalv,?t&enxe,nek&hsat,mihc,??vo&hsalab,n,?ynzorg,z&akvakidalv,emret,??t&amok?i&juf?masih????v!.&em,g&olb,ro??moc?nc,ten?ude?ved,??ykuyr??v&b?c!.topsgolb,?ed!.&enilnigol,lecrev,ppa-rettalp,srekrow,vr&esi,uc,?ylf,??ih?l!.&di?fnoc?gro?lim?mo&c?n,?nsa?ten?ude?vog???m!.&eman?gro?lim?m&oc?uesum??o&fni?r&ea?p???pooc?t&en?ni??ude?vog?zib???o&g?m??rt?s!.&bog?der?gro?moc?ude???t!.&bew-eht-no,naht-&esrow,retteb,?sndnyd,?d?gh?i?won??uqhv--nx??w&a!.moc?hs?l??b!.&gro?oc???c!.&gro?moc?ten?ude??cp??e&iver!.oby,?n?s??g?k!.&bme?dni?gro?moc?ten?ude?vog???m!.&ca?gro?m&oc?uesum??oc?pooc?t&en?ni??ude?vog?zib??b??o&csom?h!s??n?w??p!.&344x,de?en?mon,o&c?g??ro?snduolc,ualeb???r!.&ca?gro?lim?oc?pooc?ten?vog??n??t!.&a46oa0fz--nx?b&82wrzc--nx?ulc??emag?gro?l&im?ru,?m&oc!.reliamym,?yn,?t&en?opsgolb,?ude?v&di?og?ta0cu--nx??zibe?業商?織組?路網???z!.&ca?gro?lim?oc?vog????x&a!.&cm,eb,gg,s&e,u,?tac,ue,yx,?t??c!.&hta,ofni,vog???e&d&ef?nay??ma!nab??rof?s??ilften?jt?m!.&bog?gro?m&oc?yn,?t&en?opsgolb,?ude??g?ma2ibgy--nx??o&b!x??f?rex!ijuf???rbgn--nx?s!.&myn,vog???x&am&jt?kt??x???y&4punu--nx?7rr03--nx?a&d!i&loh?rfkcalb??ot??g?lp?p!ila??rot?ssin?wdaorb??b!.&fo?lim?m&oc!.topsgolb,?yn,?vog??ab?gur??c!.&ca?dtl?eman?gro?m&oc!.&ecrofelacs.j,topsgolb,??t??orp?s&egolke?serp??t&en?nemailrap??vog?zib??amrahp?nega??d&dadog?uts??e&kcoh?ltneb?n&dys?om?rotta??snikcm??g!.&eb,gro?m&oc?yn,?oc?ten?ude?vog??olonhcet!.oc,?rene??hpargotohp?id?k!.&gro?moc?ten?ude?vog??s??l!.&clp?d&em?i??gro?hcs?moc?ten?ude?vog??f?imaf!nacirema??l&a?il??ppus??m!.&eman?gro?lim?moc?t&en?opsgolb,?ude?vog??edaca!.laiciffo,?ra??n&a&ffit?pmoc!ylimafa???os??o&j?s??p!.&gro?lim?moc?pooc?ten?ude?vog???r&e&corg?grus?llag?viled??lewej?otcerid?tnuoc?uxul??s!.&gro?lim?moc?ten?ude?vog??pil??t&efas?i&c!.gn,?ledif?n&ifx?ummoc!.&bdnevar,murofym,???r&ahc?uces??srevinu??laer?r&ap!.oby,?eporp??uaeb??u!.&bug?gro?lim?mo&c!.topsgolb,?n,?ten?ude??b!tseb???van!dlo??xes??z&a!.&eman?gro?lim?moc?o&fni?rp??pp?t&en?ni??ude?vog?zib???b!.&az,gro?m&o&c?n,?yn,?ten?ude?vog???c!.&4e,inum.duolc.&rsu,tlf,?m&laer,urtnecatem.motsuc,?oc,topsgolb,??d!.&gro?lop?moc?ossa?t&en?ra??ude?vog???ib!.&duolcsd,e&ht-rof,mos-rof,rom-rof,?izoj,lpb,nafamm,p&i&-on,fles,?ohbew,tfym,?retteb-rof,snd&nyd,uolc,?xro,?g??k!.&gro?lim?m&oc?yn,?ten?ude?vog???m!.&ca?gro?lim?oc?ten?ude?v&da?og????n!.&asq-irom--nx?ca?gro?htlaeh?i&r&c?o&am?ām???wi!k???keeg?l&im?oohcs??myn,neg?oc!.topsgolb,?t&en?nemailrap?vog???a!niflla???rawhcs?s!.&ca?gro?oc???t!.&c&a?s??e&m?n??ibom?l&etoh?im??o&c?fni?g??ro?vt???u!.&gro?moc?oc?ten??rwon??yx!.&etisgolb,gnitfarc,otpaz,ppahf,??zub??λε?υε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур?тйас?фр?юе?յահ?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?ي&رحبلا?طسلف???ه&ارمه?يدوعسلا??وكمارا?يبظوبا?ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ວາລ?ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ン&ゾマア?ョシッァフ??业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?販通?车汽众大?逊马亚?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
+          "a&0&0trk9--nx?27qjf--nx?e9ebgn--nx?nbb0c7abgm--nx??1&2oa08--nx?apg6qpcbgm--nx?hbbgm--nx?rdceqa08--nx??2&8ugbgm--nx?eyh3la2ckx--nx?qbd9--nx??3&2wqq1--nx?60a0y8--nx??4x1d77xrck--nx?6&1f4a3abgm--nx?2yqyn--nx?3np8lv81qo3--nx?5b06t--nx?axq--nx?ec7q--nx?lbgw--nx??883xnn--nx?9d2c24--nx?a&a?it??b!.&gro?lim?moc?sr,t&en?opsgolb,?ude?vog??abila?c?ihsot?m?n??c!.&b&a?m?n??c&b?g?q??ep?fn?k&s?y??ln?no?oc,p&i-on,ohsdaerpsym,?sn?t&n?opsgolb,?un?ysrab,?i&ma?r&emarp?fa??sroc??naiva?s??d&ats?n&eit?oh??om?sa?tl??eg?f&c?ob??g!emo?naripi?oy??hskihs?i&cnal?dem?hs?k!on??sa!.snduolc,??jnin?k&aso?dov?ede?usto??l!.&c,gro?moc?ofni?r&ep?nb,?t&en?ni??ude?vog??irgnahs?le&nisiuc?rbmuder???m!.&ca?gro?oc?sserp?ten?vog??ahokoy?e00sf7vqn--nx?m??n!.&ac?cc?eman?gro?ibom?loohcs?moc?ni?o&c?fni?rp??r&d?o??s&u?w??vt?xm??av?is?olecrab?tea??p!.&bog?ca?d&em?ls??g&ni?ro??mo&c?n??oba?ten?ude??c?g7hyabgm--nx?ra!.&461e?6pi?iru?nru?rdda-ni?siri???s??q!.&eman?gro?hcs?lim?moc?t&en?opsgolb,?ude?vog???r&az?emac?f4a3abgm--nx?n!d5uhf8le58r4w--nx??u&kas?tan???s!.&bup?dem?gro?hcs?moc?ten?ude?vog??ac!.uban.iu,?iv??t&ad?elhta?led?oyot??u!.&a&cinniv?emirc?i&hzhziropaz?stynniv??s&edo?sedo??tlay?vatlop??bs?cc,d&argovorik?o!roghzu??tl,?e&hzhziropaz?nvir?t??f&i?ni,?g&l?ro??hk?i&stvinrehc?ykstynlemhk??k&c?m?s&nagul?t&enod?ul??v&iknarf-onavi?orteporp&end?ind?????l&iponret?opotsa&bes?ves??p??m&k?oc?s?yrk??n&c?d?i?osrehk?v?ylov??o&c,nvor??p&d?p,z??r&c?imotihz?k?ymotyhz??sk?t&en?l?z??ude?v:c?e&alokin?ik??i&alokym?hinrehc?krahk?vl?yk??k?l?o&g!inrehc??krahk??r?,xc,y&ikstinlemhk?mus?s&akrehc?sakrehc?tvonrehc???z&ib,u????v!aj?bb?et?iv??waniko?x&a?iacal??yogan?z&.&bew?c&a?i&n?rga???gro?l&im?oohcs??m&on?t??o&c!.topsgolb,?gn??radnorg?sin?t&en?la??ude?vog?wal??zip???b&00ave5a9iabgm--nx?1&25qhx--nx?68quv--nx?e2kc1--nx??2xtbgm--nx?3&b2kcc--nx?jca1d--nx??4&6&1rfz--nx?qif--nx??96rzc--nx??7w9u16qlj--nx?88uvor--nx?a&0dc4xbgm--nx?c?her?n?ra?t??b!.&erots?gro?moc?o&c?fni??ten?ude?v&og?t??zib??a??c&j?s??d&hesa08--nx?mi??g?l!.&gro?moc?ten?ude?vog??m??s!.&gro?moc?ten?ude?vog???tc-retarebsnegmrev--nx?u&lc!.&elej,snduolc,y&nop,srab,??smas??p!.ysrab,??wp-gnutarebsnegmrev--nx??c&1&1q54--nx?hbgw--nx??2e9c2czf--nx?4&4ub1km--nx?a1e--nx?byj9q--nx?erd5a9b1kcb--nx??8&4xx2g--nx?c9jrb2h--nx??9jr&b&2h--nx?54--nx?9s--nx??c&eg--nx?h3--nx?s2--nx???a!.&gro?lim?moc?rrd,ten?ude?vog??3a09--nx!.&ca1o--nx?gva1c--nx?h&ca1o--nx?za09--nx??ta1d--nx?ua08--nx???da??b&a?b?ci?f76a0c7ylqbgm--nx?sh??c!.&eugaelysatnaf,gnipparcs,liamwt,revres-emag,s&nduolc,otohpym,seccaptf,?xsc,?0atf7b45--nx?a1l--nx??e!.&21k?bog?dem?gro?lim?moc?nif?o&fni?rp??ten?ude?vog??beuq?n?smoc??fdh?i&l&buperananab?ohtac??n&agro?ilc?osanap??sum?tic??l!.&gro?moc?oc?ten?ude?vog?yo,?l??m!.&mt?ossa??p1akcq--nx??n!.&mon?ossa??i?p??relcel?s!.&gro?moc?ten?ude?vog??c??t!.&e&m,w,?hc,?s?w??v!.&e0,gro?lim?moc?ten?ude?v&g:.d,,og???q??wp?yn??d&2urzc--nx?3&1wrpk--nx?c&4b11--nx?9jrcpf--nx???5xq55--nx?697uto--nx?75yrpk--nx?9ctdvkce--nx?a!.mon?d?er?olnwod??b2babgm--nx?c!.vog?g9a2g2b0ae0chclc--nx??e&m!bulc??r!k??sopxe?timil?w??fc?g!.&ude?vog???h&d3tbgm--nx?p?t??i!.&ased?bew?ca?etrof,golbw,hcs?lim?o&c!.topsgolb,?g??palf,r&egolb,o??sepnop?ten?ym?zib??ar?b?ordna?p?rdam??l&iub?og?row??m!.&ed,ot,pj,t&a,opsgolb,???n&a&b?l!.citats:.&setis,ved,?,raas???ob?uf??o&of?rp??r&a&c&tiderc?yalcrab??ugnav??ef506w4b--nx?k!.&oc,ude,?jh3a1habgm--nx??of??s!.&dem?gro?moc?ofni?ten?ude?v&og?t???m!kcrem???t!.topsgolb,excwkcc--nx?l??uolc!.&a&bura-vnej.&1ti,abura.rue.1ti,?tcepsrep,xo:.&ku,nt,?,?bewilek:.sc,,citsalej.piv,drayknil,elej,gnitsohdnert.&ed,hc,?letemirp:.ku,,m&edaid,ialcer.&ac,ku,su,??n&evueluk,woru,?r&epolroov,o&pav,tnemele,??tenraxa.1-se,ululetoj,xelpciffart,??za5cbgn--nx??e&1&53wlf--nx?7a1hbbgm--nx?ta3kg--nx??2a6a1b6b1i--nx?3ma0e1cvr--nx?418txh--nx?707b0e3--nx?a!.&ca?gro?hcs?lim?oc?t&en?opsgolb,?vog??09--nx??b!.&ca?gnitsohbew,nevueluk.yxorpze,pohsdaerpsym,snoitulostsohretni.duolc,topsgolb,?ortal?ut!uoy???c&0krbd4--nx?a&lp!.oc,?ps!.&lla4sx,rebu,tsafym,?artxe??sla??i!ffo??n&a&d?iler?nif?rusni!efil?srelevart???eics!.oby,??rofria??d!.&1sndnyd,42pi-nyd,7erauqs,amil4,b&ow-nrefeilgitsng--nx,rb-ni,vz-nelletsebgitsng--nx,?decalpb,e&daregtmueart,mohsnd,nihcamyek,?hcierebsnoissuksid,keegnietsi,lsd-ni,moc,n&-i-g-o-l,aw-ym,e&lletsebgitsnüg,sgnutiel,?i&emtsi,lreb-n&i,yd,??oitatsksid-ygolonys,pv&-n&i,yd,?nyd,?refeilgitsnüg,?orp-ytinummoc,p&h21,iog:ol,,ohsdaerpsym,?r&e&ntrapdeeps.remotsuc,su&-lautriv,lautriv,?t&adpusnd,tub-ni,uor-ym,?vres&-e&bucl,mohym,?bew-emoh:.nyd,,luhcs,??ogiv-&niem,ym,??s&d-&onys,ygolonys,?nd&-&dd,nufiat,sehcsimanyd,tenretni,yard,?isoc.nyd,ps,yard,?oper-&nvs,tig,?sndd:.&nyd,sndnyd,?,?topsgolb,vresi-&niem,tset,?xi2,y&awetag-&llawerif,ym,?srab,tic-amil,?zten&mitbel,sadtretteuf,??a&lg?rt!.oby,??i&sdoow?ug??nil?on--nx??e!.&bil?dem?eif?gro?irp?kiir?moc!.topsgolb,?pia?ude?vog??ei?ffoc?gg?r&f?ged???f&a&c?s??il??g!.&gro?lim?moc?t&en?vp??ude?vog??a&f?gtrom?p!.&3xlh,kselp,sndp,tengam,xlh,ycvrp,??rots?yov??elloc?na&hcxe?ro??roeg?ug??i!.&pohsdaerpsym,topsgolb,vog??tilop?v&bba?om???j!.&fo,gro?oc?ten???k!.&c&a?s??e&m?n??ibom?o&c!.topsgolb,?fni?g??ro??i&b?l?n???l&a&dmrif?s!.rof,rof???b&a?i&b?dua???c&aro?ric??dnik?g!oog??i&bom?ms??l&asal?erauqa??ppa?uhcs?yts!efil???m!.&4&32i,pct,?66c,ailisarb,b&dnevar,g-raegelif,?ca?duolcsd,e&d-raegelif,i&-raegelif,lpad:.tsohlacol,,?pcm,?g&ro?s-raegelif,?hctilg,k&catsegde,uoc,?noitatsksid,o&bmoy,c!ku,?t&nigol,poh,??p&ion,j-raegelif,ohbew,?qbw,r&aegelif,idcm,ofsnd,?s&dym,ndd,ti!bt,?umhol,?t&en?s&acdnuos,ohon,??u&a-raegelif,de?tcn,?v&irp?og??y&golonys,olpedew,srab,??a&g?n!.&reh.togrof,sih.togrof,???em?i&rp?twohs??orhc?w??n!goloc?i&lno!.&egats-oree,oree,ysrab,??w??o!.&derno:.gnigats,,ecivres,knilemoh,r&ednu,of,??hp?latipac?ts&der?e&gdirb?rif???z!.&66duolc,amil,sh,???ruoblem??om?p!.&bog?gro?lim?mo&c?n??t&en?opsgolb,?ude??irg?yks??r!.&mo&c?n??ossa?topsgolb,?a&c!htlaeh??pmoc?wtfos??bc?eh?if?ots!.&e&rawpohs,saberots,?yflles,??taeht?u&ces?sni?t&inruf?necca??za???s!.&a!bap.us,?b!ibnal?rofmok??c!a??d!b?n&arb?ubroflanummok???e?f!noc,?g!ro??h!f??i!trap??k!shf??l?m!oc,t??n!mygskurbrutan??o?p!ohsdaerpsym,p??r!owebdluocti,?s!serp?yspoi,?t!opsgolb,?u?vhf?w?x!uvmok??y?z??a&c?el?hc??i&er?urc??nesemoh?roh?uoh??t&a&d?ts&e!laer??lla???is!.&areduolc,e&lej,nilnigol,r&etnim,ocevon,?winmo,?k&rowtenoilof,wnf,?laicosnepo,n&eyb,oyc,?spvtsaf,thrs,xulel,ysrab,?bew??ov?ra?t&ioled?ol??utitsni??u&lb?qi&nilc?tuob???v!.&21e?b&ew?og??ce&r?t??erots?gro?lim?m&oc?rif??o&c?fni??stra?t&en?ni??ude?vog??as?e3gerb2h--nx?i&l!.xlh,?rd?ssergorp??ol??w&kct--nx?r??xul?y!.&gro?lim?moc?ten?ude?vog????f&0f3rkcg--nx?198xim--nx?280xim--nx?7vqn--nx?a!.&gro?moc?ten?ude?vog???b!.vog?wa9bgm--nx??c!.topsgolb,a1p--nx!.&a14--nx,b8lea1j--nx,c&avc0aaa08--nx,ma09--nx,?f&a1a09--nx,ea1j--nx,?gva1c--nx,nha1h--nx,pda1j--nx,zila1h--nx,??ns??ea1j--nx?fo?g?iam?l&a1d--nx?og??n!.&bew?cer?erots?m&oc?rif??ofni?re&hto?p??stra?ten???orp?p!.&gro?moc?ude???rus?t!w??vd7ckaabgm--nx?w??g&2&4wq55--nx?8zrf6--nx??3&44sd3--nx?91w6j--nx!.&a5wqmg--nx?d&22svcw--nx?5xq55--nx??gla0do--nx?m1qtxm--nx?vta0cu--nx????455ses--nx?5mzt5--nx?69vqhr--nx?7&8a4d5a4prebgm--nx?rb2c--nx??a!.&gro?mo&c?n??oc?ten??vd??b!.&0?1?2?3?4?5?6?7?8?9?a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t!opsgolb,?u?v?w?x?y!srab,?z???c!b?za9a0cbgm--nx??e!.&eman?gro?ics?lim?moc!.topsgolb,?nue?ten?ude?vog??a??g!.&ayc,gro?lenap:.nomead,,oc?saak,ten???i&a?v??k!.&g&olb,ro??ku,lim?moc?oi,pj,su,ten?ude?v&og?t,???m!.&drp?gro?lim?m&o&c?n??t??oc?ude?vog??pk??n!.&dtl,eman?gro?hcs?i!bom??l&im?oc,?m&oc!.topsgolb,?rif,?neg,ogn,ten?ude?vog??aw?i!b!mulp??car?d&art?dew??h&sif?tolc??k&iv?oo&b?c???ls?n&aelc?iart??p!pohs??re&enigne?tac??t&ad?ekram!.&htiw,morf,??hgil?lusnoc?neg?ov?soh!.tfarcnepo,??vi&g?l???o!s??u&rehcisrev?smas?tarebsnegömrev???o&d?lb?og!.&duolc,etalsnart,???r&2n084qlj--nx?ebmoolb?o!.&77ndc.c:sr,,a&remacytirucesym,t&neimip,sivretla,?z,?bew-llams,d&ab-yrev-si,e&sufnocsim,vas-si,?nuof-si,oog-yrev-si,uolc&arfniarodef,mw,??e&a,cin-yrev-si,grof&loot,peh,?l&as-4-ffuts,poeparodef,?m&-morf,agevres,ohruoyslles,?n&ozdop,uma.elet,?r&ehwongniogyldlob,iwym,uces-77ndc.nigiro.lss,?t&adidnac-a-si,is&-ybboh,golb,???fehc-a-si,golbymdaer,k&eeg-a&-si,si,?h,nut,?l&i&amwt,ve-yrev-si,?lawerif&-ym,ym,?sd-ni,?m&acssecca,edom-elbac,?n&af&blm,cfu,egelloc,lfn,s&citlec-a-si,niurb-a-si,tap-a-si,?xos-a-si,?ibptth,o&itatsksid,rviop,?pv-ni,?o&jodsnd,tp&az,oh,??p&i&-on,fles,?o&hbew,tksedeerf,?tf&e&moh,vres,?ym,??r&e&gatop,ppepteews,su-xunil-a-si,?gmtrec,vdmac,?s&a&ila&nyd,snd,?nymsd,?b&alfmw,bevres,?dylimaf,eirfotatophcuoc,j,koob-daer,ltbup,nd&-won,deerf,emoh,golb,kcud,mood,nyd:.&emoh,og,?,ps,rvd,tog,uolc,?s&a-skcik,ndd,?tnemhcattaomb,u,?t&ce&jorparodef.&duolc,gts.so.ppa,so.ppa,?riderbew,?e&ews-yrev-si,nretni&ehtfodne,fodne,??hgink-a-si,igude,oi-allizom,s&ixetn&od,seod,?o&h-emag,l-si,?rifyam,??ue:.&a&-q,c,?cm,dc,e&b,d,e,i,m,s,?g&b,n,?hc,i&f,s,?k&d,m,s,u,?l&a,i,n,p,?n&c,i,?o&n,r,ssa,?pj,r&f,g,h,k,t,?s&e,i:rap,,u,?t&a,en,i,l,m,ni,p,?u&a,de,h,l,r,?vl,y&c,m,?z&c,n,??,vresnyd,x&inuemoh,unilemoh,?y&limafxut,srab,???ub&mah?oj???s!.&delacsne,gro?moc?rep?t&en?opsgolb,?ude?vog??gb639j43us5--nx??t?u!.&c&a?s??en?gro?moc?o&c?g??ro?topsgolb,??v!.ta,a1c--nx??wsa08--nx??h&0ee5a3ld2ckx--nx?4wc3o--nx!.&a&2xyc3o--nx?3j0hc3m--nx?ve4b3c0oc21--nx??id1kzuc3h--nx?l8bxi8ifc21--nx?rb0ef1c21--nx???8&8yvfe--nx?a7maabgm--nx??b!.&gro?moc?ten?ude?vog??mg??c!.&7erauqs,amil4,duolc-drayknil,gniksnd,p&h21,ohsdaerpsym,?sndtog,topsgolb,wolf.e&a.1pla,nigneppa,?xi2,ytic-amil,?aoc?et?ir!euz??r&aes!errecnac??uhc??sob?taw!s???d0sbgp--nx?f&2lpbgm--nx?k??g!.&gro?lim?moc?ude?vog???m!a1j--nx??ocir?p!.&gro?i?lim?moc?ogn?ten?ude?vog???s!.&g&nabhsah,ro??l&im?xv,?m&oc?roftalp.&cb,su,tne,ue,??pib,ten?vog?won,yolpedew,?a&c?nom??i&d?f?ri???t!.&ca?enilno,im?ni?o&c?g??pohs,ro?ten??iaf!.oby,?laeh!.arh,?orxer?ra&ba?e???vo!.lopdren,?zb??i&3tupk--nx?7a0oi--nx?a!.&ffo?gro?moc?ten?uwu,?1p--nx?bud?dnuyh?tnihc??b!.&gro?moc?oc?ro?ude??ahduba?o!m!.&duolcsd,ysrab,???s??c!.&ayb-tropora--nx?ca?d&e?m??esserp?gro?ln,moc?nif,o&c?g?ssa??ro?t&en?ni?roporéa??ude?vuog??cug?t??d&dk?ua??e&bhf--nx?piat??f!.&aw5-nenikkh--nx,dnala?iki,mroftalpduolc.if,nenikkäh,pohsdaerpsym,retnecatad.&omed,saap,?topsgolb,yd,?onas??g!.&d&om?tl??gro?moc?ude?vog???h&c&atih?ra??s&abodoy?ibustim???juohs?k!.&gro?moc?ofni?ten?ude?vog?zib??b4gc--nx?iw?nisleh?s?uzus??l!.&aac,topsgolb,?drahcir?iamsi??maim?n!.&b&ew?og??ca?gro?lim?mo&c?n??ni?o&c?fni??pp?t&en?ni??ude?zib??airpic?i&hgrobmal?m??re??om?rarref?s!.&egaptig,ppatig,topsgolb,?ed??t&aresam?i&c?nifni??rahb?tagub??ut?v!.&21k?gro?moc?oc?ten???wik?xa&rp?t??yf??j&6pqgza9iabgm--nx?8da1tabbgl--nx?b!.&ossa?topsgolb,uaerrab?vuog???d?f!.&ca?eman?gro?lim?moc?o&fni?rp??ten?vog?zib???nj?s?t!.&bew?c&a?in??eman?gro?lim?moc?o&c?g??t&en?ni?set??ude?vog?zib???yqx94qit--nx??k&8uxp3--nx?924tcf--nx?arfel?c&a&bdeef?lb??ebdnul?ilc?reme?ud??d!.&erots,ger,mrif,oc,pohsdaerpsym,topsgolb,zib,?t??e&es?samet??h!.&a&4ya0cu--nx?5wqmg--nx??b3qa0do--nx?cni,d&2&2svcw--nx?3rvcl--nx??5xq55--nx?tl,?g&a0nt--nx?la0do--nx?ro??i&050qmg--nx?7a0oi--nx?xa0km--nx??m&1qtxm--nx?oc??npqic--nx?saaces,t&en?opsgolb,?ude?v&di?og?ta0cu--nx??xva0fz--nx?人&个?個?箇??司公?府政?絡&網?网??織&組?组??织&組?组??络&網?网??育&敎?教???n??i&tsob?vdnas??l!.&bew?c&a?os??dtl?gro?hcs?letoh?moc?nssa?ogn?prg?t&en?ni??ude?vog??at?cd?is??m!.&eman?fni?gro?moc?t&en?opsgolb,?ude?vog???n&ab!cfdh?etats?mmoc?t&en?fos??u??i!l!.&noyc,pepym,??p???oob?p!.&b&ew?og??gro?kog?m&af?oc??nog?ofni?pog?sog?ten?ude?vog?zib???row!.&morf,ot,?ten!.&htumiza,nolt,o&c,vra,??doof???s!.topsgolb,?t?u!.&c&a?lp??d&om?tl??e&cilop?m??gro!.&gul:g,,sgul,??nnoc,o&c!.&bunsorter.tsuc,e&lddiwg,n&ilnoysrab,ozgniebllew,??krametyb.&hd,mv,?omida,p&i-on,ohsdaerpsym,?t&fihsreyal.j,opsgolb,?vres-hn,ysrab,??rpoc,?psoh,shn?t&en?nmyp,?vog!.eci&ffoemoh,vres,??ysrab,???l&04sr4w--nx?a!.&gro?lim?moc?t&en?opsgolb,?ude?vog??bolg?c?ed?g!el??i&c&nanif!.oc,lpl??os??romem?tnedurp??n&if?oitanretni??t&i&gid!.sppaduolc:.nodnol,,?p&ac?soh???ned?ot??utum!nretsewhtron???c!.&bog?lim?oc?topsgolb,vog???dil?e&datic?n&ahc?nahc!gnikooc?levart?rehtaew???t!ria?tam??vart??f&8f&pbgo--nx?tbgm--nx??a?n??g!.&gro?moc?oc?ten?ude?xx,zib,??h&d?op??i!.&21k?ca?fdi?gro?inum?oc!.&egapvar,topsgolb,??ten?vog??a&f?m&e?g?toh???m?r?xil??l&a&b&esab?t&eksab!.&sua,zn,??oof???c?mt??e&d?hs??ihmailliw?j??m!.&esserp?gro?moc?ten?ude?v&og?uog????n!.&n&iemodleeutriv,o&med,rtsic,??oc,pohsdaerpsym,retsulc-gnitsoh,topsgolb,wsma,yalphk,?o??o&a?btuf?l!.gmo,?o&c!.&ed,rotnemele,??hcs??rit?u??p!.&a&cin&diws?gel??d&g,ortso?urawon??i&dem?mraw?nydg,?k&elo&guld?rtso??slopolam?tsu?ytsyrut??l&ip?o&kzs?w&-awolats?oksnok????n&erapohs,img?zcel,?rog&-ai&bab?nelej??j?z??syn?tsaim?w&a&l&eib?i?o??zsraw??o&namil?tainop,??z&eiwolaib?mol???c&e&iw&alselob?o&nsos?rtso???le&im?zrogz???orw,p??d&em,ia?ragrats?uolc&inu,sds,??e&c&i&lrog?w&ilg,o&hc&arats?orp??klop?tak????yzreibok??i&csjuoniws?ksromop?saldop??l&ahdop?opo??napokaz,tatselaer?z&romop?swozam???g&alble?ezrbo&lok?nrat??ro??hcyzrblaw?i&csomohcurein?grat?klawus??k&e&rut?walcolw??in&byr?diws,sark,?le?o&nas?tsylaib??rob&el?lam??s&als?jazel?nadg,puls?rowezrp???l&colw?e&r?vart??i&am?m???m&o&c?dar?n?tyb??s&g?iruot??t!a???n&a&gaz?nzop,?i&bul?cezczs?lbul,molow?nok?zd&eb?obeiws???uleiw?y&tzslo?z&rtek?seic????o&c,fni?k&celo?zdolk??lkan?n&leim?pek?t&uk?yzczs??z&copo?eing?rowaj???rga?tua?w&ejarg?ogarm???p&e&eb,lks??klwwortso?ohs!daerpsym,??romophcaz?sos?t&aiwop?en?opos,ra,sezc??ude?v&irp?og!.&a&p?s!w???bni&p?w??ci?dtiw?essp?fiw?g&imu?u??hiiw?m&igu?rio?u!o???nds?o&ks?p!pu??s?wtsorats??p&a?sp!mk?pk?wk??u&m?p??wk?z??r&ksw?s??s&i?oiw?u?zu??talusnok?w&gzr?i&p?rg?w??m?opu?u!imzw???zouw????w&a&l&corw?sizdow??w??o&golg?k&ark,ul?zsurp??r&az?gew??t&rabul,sugua??z&coks?sezr????xes?y&buzsak?d&azczseib?ikseb??hcyt?n&jes?lod-zreimizak??pal?r&ogt?uzam??walup?zutrak??z&am-awar?c&aprak?iwol?zsogdyb??dalezc?ib?s&i&lak?p??uklo????l??r&as?f?s??s!.&gro?moc?ten?ude?vog???t!.vog??ubnatsi?x3b689qq6--nx?yc5rb54--nx??m&00tsb3--nx?1qtxm--nx?981rvj--nx?a!.&aayn,enummoc?gro?moc?o&c?idar,ken,?t&en?opsgolb,??c!bew??dretsma?e&rts?t!.&citsalej,esruocsid,???fma?xq--nx??b!.&gro?moc?ten?ude?vog??i??c!.&moc?oc?ten?vog???d!.&gro?moc?ten?ude?vog???f!.&gro?moc?oidar,ten?ude??i??g!vu96d8syzf--nx??h?i!.&ca?gro?moc?o&c!.&clp?dtl???r,?t&en?t??vt??k?rbg4--nx??k!.&drp?e&rianiretev?sserp??gro?lim?m&o&c?n??t??nicedem?ossa?pooc?s&eriaton?neicamrahp?sa??ude?v&og?uog????l&if?ohkcots??o!.&dem?gro?m&oc?uesum??o&c?rp??ten?ude?vog??b?c!.&2aq,3pmevres,5sndd,a&c&-morf,ir&bafno,fa,??g&-morf,oy-sehcaet,?i-morf,m&-morf,all&-a-si,amai,??p&-morf,c-a-si,?r&emacytirucesym,odih,?s,tadtsudgniht,v-morf,w-morf,z,?b&dnevarym,ew&-sndnyd,draiw.segap,ottad,?g,ildts.ipa,?c&amytirucesemoh,d-morf,esyrcs,itsalej.omed,n&-morf,vym,?p&kroweht,ytirucesemoh,?q,rievres,s-morf,?d&aerotffuts,e&calpb,ifitrec-&si,ton-si,?llortnocduolc,rewopenignepw:.sj,,tsohecapsppa,?i&-morf,rgevissam.saap,?m-morf,n&-morf,abeht-htiw-si,?s-morf,uolc&-noitatsyalp,hr,iafaw.&d&ej,yr,?nol,?meaeboda,panqym:-&ahpla,ved,?,smetsystuo,tekcilc,ved&j,pw,??vreser,wetomer,?e&butuoyhtiw,ciffo-sndnyd,d:-morf,o&celgoog,n&il.srebmem,neve.&1-&su,ue,?2-&su,ue,?3-&su,ue,?4-&su,ue,????,erf&-sndnyd,sndd,?filflahevres,gnahcxeevres,i&hcet-a-si,p-sekil,?k&auqevres,irtsretnuocevres,?l&bitpa-no,googhtiw,?m&agevres,ina-otni-si,oh-&sndnyd,ta-sndnyd,??n&-morf,ilno&-evreser,ysrab,?og-si,?r&alfduolcyrt,ehwynanohtyp:.ue,,ihcec,?srun-a-si,t&i&nuarepo,s&-ybboh,aloy,tipohs,xiw,??omer-sndnyd,upmocsma,ysgolb,?v&als-elcibuc-a-si,i&lsndd,tavresnoc-a-si,??z&amkcar,eelg,iig,??fehc-a-si,g&ni&gats-&raeghtua,swennwot,?ksndd,robsikrow,?o&fgp,lb&-sndnyd,pawodni,sihtsetirw,???h&n-morf,o-morf,?i&fiwehtno,h-morf,kiw-sndnyd,m-morf,pdetsoh,r-morf,w-morf,z&ihcppa,nilppa,??jn-morf,k&a&-morf,erfocsic,?cils-si,eeg&-a&-si,si,?sndd,?h,latsnaebcitsale:.&1-&htuos-pa,lartnec-&ac,ue,?ts&ae&-&as,su,?ht&ron-pa,uos-pa,??ew-&su,ue,vog-su,???2-ts&ae&-su,ht&ron-pa,uos-pa,??ew-&su,ue,??3-ts&aehtron-pa,ew-ue,??,o-morf,r&adhtiwtliub,ow&-&sndnyd,ta-sndnyd,?ten-orehkcats,??u,?l&a&-morf,colottad,rebil-a-si,?f-morf,i&-morf,am&-sndnyd,detsohpw,??l&ecelffaw,uf-ytnuob:.a&hpla,teb,?,?ppmswa,ru-&elpmis,taen,?ssukoreh,xegap,?m&n-morf,pml.ppa,rofererac-htlaeh,sacrasevres,uirarret-yltsaf,?n&a&cilbuper-a-si,f&-sllub-a-si,racsan-a-si,?i&cisum-a-si,ratrebil-a-si,??c,dc&hsums,umpw,xirtrepmi,?eerg-a-si,i-morf,m-morf,o&ehtnaptog,isam-al-a-tse,r&italik,tap-el-tse,?s&iam-al-a-tse,replausunu,??pj,t-morf,?o&bordym,c,hce-namtsop,jodsnd,m&-morf,ed-baltlow,?n:iloxip,,ttadym,?p&2pevres,aelutym,i&-sndnyd,fles,ogol,ruoy&esol,hctid,?ym&eerf,teg,??ohsdaerpsym,pa&-rettalp,anis:piv,,esaberif,k1,lortnocduolc,oifilauq,r&aegyks,oetem:.ue,,?tnorfegap,ukoreh,?t&fevres,thevres,??r&a:-morf,tskcor-a-si,,b,e&d&iv&erp-yb-detsoh.saap,orpnwo,?ner&.ppa,no,??e&bevres,nigne-na-si,?ggolb&-a-si,ndi,?h&caet-a-si,pargotohp-a-si,?krow-drah-a-si,n&gised-a-si,ia&rtlanosrep-a-si,tretne-na-si,??p&acsdnal-a-si,eekkoob-a-si,?retac-a-si,subq,tn&ecysrab,iap-a-si,uh-a-si,?vres&-&ki.&cpj-rev-duolcj,duolcj,?s&ndnyd,pvtsaf,??inim,nmad,sak,?y&alp-a-si,wal-a-si,?zilibomdeepsegap,?g,ituob,k,mgrp.nex,o&-morf,sivdalaicnanif-a-si,t&areleccalabolgswa,c&a-na-si,od-a-si,?susaym,??p-morf,u&as-o-nyd,e&tsoh.&duolc-gar,hc-duolc-gar,?ugolb-nom-tse,?omuhevres,??s&a&apod,ila&nyd,snd,?nymsd,vnacremarf,?bbevres,ci&p&-sndnyd,evres,?tcatytiruces,?dylimaf,e&cived-anelab,itilitu3,lahw-eht-sevas,mag-otni-si,t&isro,yskciuq,??i&ht2tniop,pa&elgoog,tneltneg,??jfac,k&-morf,aerf-ten,colb&egrof,pohsym,??m&-morf,cxolb,?n&d&-pmet,dyard,golb,mood,tog,?kselp,nyd,ootrac-otni-si,?o&-xobeerf,xobeerf,?ppa&raeghtua,tneg,?r&ac-otni-si,e&ntrap-paelut,tsohmaerd,??s&e&l-rof-slles,rtca-na-si,?ibodym,?tsaeb-cihtym.&a&llicno,zno,?ilay,lacarac,re&gitnef,motsuc,?sv,toleco,x:n&ihps,yl,?,?u,wanozama.&1-&htuos-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??la&nretxe-3s,rtnec-&ac&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????ts&ae&-&as&-&3s,etisbew-3s,?.kcatslaud.3s,?su:-etisbew-3s,.kcatslaud.3s,,?ht&ron-pa&-&3s,etisbew-3s,?.kcatslaud.3s,?uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-&3s,etisbew-3s,?.kcatslaud.3s,?vog-su-&3s,spif-3s,????2-ts&ae&-su&-3s,.&3s,etisbew-3s,kcatslaud.3s,??ht&ron-pa&-3s,.&3s,etisbew-3s,kcatslaud.3s,??uos-pa&-&3s,etisbew-3s,?.kcatslaud.3s,???ew-&su-&3s,etisbew-3s,?ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,????3&-tsew-ue&-3s,.&3s,etisbew-3s,kcatslaud.3s,??s,???t&arcomed-a-si,c&-morf,etedatad.&ecnatsni,omed,??eel&-si,rebu-si,?hgilfhtiwletoh,m-morf,n&atnuocca-na-si,e&duts-a-si,r-ot-ecaps,tnocresu&buhtig,e&capsppa,lbavresbo.citats,?pl,???ops&edoc,golb,ppa,?s&i&hcrana-&a-si,na-si,?laicos-a-si,pareht-a-si,tra-na-si,xetn&od,seod,??oh&piym,sfn,??u&-morf,nyekcoh-asi,?v-morf,?u&-rof-slles,4,e,h,oynahtretramssi,r:ug-a-si,,?v&n-morf,w-morf,?w&o&lpwons-yrt,zok,?ww100,?x&bsbf.sppa,em,i&nuemoh,rtrepmi,?obaniateb,t-morf,unilemoh,?y&a&bnx:.&2u,lacol-2u,?,l&erottad,pezam,?wetag-llawerif,?dnacsekil,fipohsym,k&-morf,niksisnd,?rotceridevitcaym,u:goo,,w-morf,x&alagkeeg,orphsilbup,???inu??m!.&dna,rof,??or?tsla??p!.nwo,?raf!.jrots,etats??s?t!.&gro?lim?mo&c?n??oc?ten?ude?vog???u&esum!.&a&92chg-seacinumocelet-e-soierroc--nx?atnav?c&i&aduj?rfatsae??rollam??d&anac?enomaledasac?irolf??e&raaihpledalihp?srednu??g&hannavas?oonattahc??hamo?i&auhsu?bmuloc!hsitirb??dem?groeg?hpledalihp?l&artsua?etalif??n&igriv?rofilac??ssur?tsonod??ksa&la?rben??l&lojal?q-snl--nx?uossim!trof???m&a&bala?nap??enic?o&m?r???n&a&cirema?idni??edasap?ilorachtuos?olecrab??r&abrabatnas?ezzivs??su?t&nalta?osennim??zalp??c&dnotgnihsaw?ebeuq?i&depolcycne?ficap?hpargonaeco?lbup?sum?t&carporihc?lec?naltadim??vu??yn??d&a&dhgab?etsmraf?m?orliar??i&rdam?ulegnedleeb??leif?n&a!l&gne?nif?ragyduj?t&ocs?rop??yram???u&brofsdgybmeh?osdnaegami???r&augria?ofxo???e&c&a&l&ap?phtrib??ps??n&a&lubma?tsiser??e&fedlatsaoc?gilletni?ics!foyrotsih????pein?rof??d&nukneklov?revasem??e&rt?tsurt??f&atnas?ildliw??g&a&lliv?tireh!lanoitan???dirbmac?rog??i&cnum?nollaw??koorbrehs?l&ab?bib?cycrotom?i&ssim?txet??oks?tsac??m&affollah?it!iram??utsoc??n&golos?ilno?recul??r&a&uqs?waled!foetats???i&hs&acnal?kroy?pmahwen??otsih??omitlab?ut&an?cetihcra?inruf?luc!irga?su???vuol??s&abatad?iacnarf?sius?uoh!lum???t&a&locohc?rak?ts!e!yrtnuoc!su?????imesoy?tevroc??u&qihpargonaeco?velleb??vit&caretni?omotua???f&iuj?ohgrub??g&n&i&dliub?ginerevmuesum?kiv?lahw?nim?peekemit?vil??ulmmastsnuk??orf?r&ebnrats?u&b&ierf?le?m&ah?uan??ram?s&mailliw!lainoloc??naitsirhc?retepts??zlas??ob&irf?mexul?????h&atu?c&raeser?sirotsih?uot??g&ea1h--nx?rubsttip??si&tirb?wej??t&laeh?ro&n?wtrof??uo&mnom?y????i&d6glbhbd9--nx?iawah?k&nisleh?s??lad!rodavlas??sissa?tannicnic??k&c&nivleeg?olc!-dna-hctaw?dnahctaw???fj?inebis?l&is?ofron??na&rfenna?t??oorbnarc?r&am&ned?reiets??oy!wen????l&a&ci&dem?golo&eahcra?meg?oz??natob?rotsih??ertnom?iromem?noita&cude?n??oc?rutluc?trop?utriv?van??e&nurb?s&ab?surb??utriv??i&artnogero?sarb??l&a&besab?hsnoegrus??e&hs?rdnevle??i&b?m!dniw????o&bup?ohcs?tsirb???m&a&dretsma?ets?h&netlehc?rud???ct?elas!urej??l&if?ohkcots?u??raf?silanruoj?u&esumyrotsihlarutan?ira&tenalp?uqa??terobra???n&a&c!irema!evitan???gihcim?i&dni?tpyge??mfoelsi?wehctaksas??e&d&alokohcs?ews?rag!cinatob?lacinatob?s&nerdlihc?u????gahnepoc?hcneum?laftsew?ppahcsnetewruutan?r&dlihc?ednaalv?hu!dnutamieh???sseig??gised!dn&atra?utsnuk???h&ab!nesie??ojts??i&lreb?tsua??l&eok?ocnil??n&ob?urbneohcs??o&dnol?gero?i&s&iv&dnadnuos?elet??nam??t&a&c&inummoc?ude!tra???dnuof?erc?i&cossa?va??kinummokelet?nissassa?r&belectsevrah?oproc?tsulli??silivic?t&nalp?s??vres&erp?noclatnemnorivne??zilivic??c&elloc?if-ecneics??ibihxe???ri?s&dnah?imaj?reffej?sral??t&erbepac?nilc?sob???r&e&b?dom?tsew?uab?zul??obredap??vahnebeok?wot??o&2a6v-seacinumoc--nx?ablib?c&edtra?ixemwen?sicnarfnas??elap?g&a&cihc?to??eidnas??i&cadnuf?diserp?ratno??llecitnom?mitiram?nirot?r&htna?ienajedoir???pohskrow?qari?r&aw!dloc?livic??dd?e&b&ma?yc??irrac?llimsiwel?naksiznarf?papswen?t&aeht?exe?nec!ecneics?larutluc?muesum?tra??s&ehc&nam?or??neum??upmoc???ia!nepo??obal?u&asonid?obal?takirak???s&a&l&g?l&ad?eh???xet??di&k?pardnarg??e&cneics!larutan??dnal?hcsi&deuj?rotsih!nizidem?rutan??selhcs??itinamuh?l&aw?egnasol?l&e&rutansecneics?xurb??iasrev???r&e&em?ugif??tsac??suohcirotsih?u&en?q&adac?itna!nacirema?su????õçacinumoc!elet-e-soierroc???gnirpsmlap?htab?i&lopanaidni?rap?uoltnias?xa??l&essurb?lod??mraeriflanoitan?n&a&blats?l??erdlihc?oi&snam?tacinummoc!elet-dna-stsop???äl??re&dnalf?lttes?mraf?nim?tnececneics??s&alg?erp??t&farc!dnastra??nalp?olip?ra!e&nif?vitaroced!su???su?xuaeb???u&b!muloc??cric???t&agilltrop?cejorp?dats?e&esum?kramnaidni??iorted?ne&m&elttes?norivne?piuqemraf??vnoc??oped?r&a!drib?enif?gttuts?hsiwej?kcor?n&acirema?ootrac??tamsa?yraropmetnoc??op&aes?snart?wen??ufknarf??s&a&cdaorb?octsae??ewhtuos?ilayol?nuk?r&ohnemled?uhlyram??urt???u&a&bgreb?etalpodaroloc??rmyc??w&ocsom?rn??x&esse?ineohp?nam?tas??y&a&bekaepasehc?w&etag?liar???camrahp?doc?e&hsub?l&ekreb?l&av!eniwydnarb??ort???n&dys?om??rrus?s&nreug?rejwen???golo&e&ahcra?g??motne?nh&cet?te??oz?po&rhtna?t??roh??hpargotohp?l&etalihp?imaf??m&edaca?onortsa??n&atob?yn??ps?r&a&ropmetnoc?tilim??e&diorbme?llag!tra??vocsid??lewej?nosameerf?otsih!dnaecneics?ecneics?gnivil!su??la&col?rutan??retupmoc?su??tsudnidnaecneics??spelipe?t&eicos!lacirotsih??i&nummoc?srevinu??nuoc???z&arg?iewhcs?nil?ojadab?urcatnas??моки?םילשורי???rof??z!.&ca?gro?hcs?lim?moc?o&c?fni??ten?ude?vog?zib????n&315rmi--nx?a&brud?cilbuper?f?grompj?hkaga?idraug?m?ol?ssin?u&hix?qna??varac?yalo??b!.&gro?moc?oc,ten?ude?vog??c??c!.&ah?bh?c&a?s??d&5xq55--nx?g?s?uolctnatsni,?eh?g&la0do--nx?ro??h&a?q?s??i&7a0oi--nx?h??j&b?f?t?x?z??kh?l&h?im?j??m&n?oc!.swanozama.&1-htron-nc.3s,be.1-&htron-nc,tsewhtron-nc,????n&h?l?s?y??om?qc?s&g?j??ten?ude?vog?wt?x&g?j?n?s??z&g?x??司公?絡網?络网??b??d&g!.ypnc,?ka??e&drag?erg?fuak?gawsklov?hctik?i&libommi?w??m!.r&iaper,of,??po?r!ednaalv??sier?ves??g!.&ca?gro?moc?ten?ude?vog??is&ed!.ssb,?irev???h!.&bog?cc,gro?lim?moc?ten?ude???i!.&bew,c&a?in??dni?esabapus,gro?lim?mrif?neg?oc?s&er?nduolc,?t&en?opsgolb,?ude?vog?ysrab,?elknivlac?griv?ks?lreb?p?v?w!.taht,?x??k!.&gro?ten?ude?vog???l&eok?ocnil??m!.&cyn,gro?ude?vog???o&dnol!.&fo,ni,??i&hsaf!.fo,?n&o?utiderc??siv!orue??t&a&cude!.oc,?dnuof?tsyalp??c&etorp?u&a?rtsnoc?????kin?las?mrom?nac?p&q?uoc??s&iam?nhojcs?pe?scire??t&ron?sob??zama??p!.&gro?oc?ten?ude?vog??k??r&e&c?yab??op!.eidni,??s!.&gro?moc?osrep?t&opsgolb,ra??ude?v&inu?uog????t!.&d&ni?uolcegnaro,?esnefed?gro?ltni?m&oc!nim??siruot??n&erut?if??o&fni?srep??sn&e?r??t&an?en!irga?ude??rnr??unr?vog??m??u&f?r!.&bdnevar,lper,sh,tnempoleved,??stad?xamay?y??v!.&ca?eman?gro?htlaeh?moc?o&fni?rp??t&en?ni?opsgolb,?ude?vog?zib???wo&rc?t!epac????o&76i4orfy--nx?a!.&bp?de?go?oc?ti?vg??boat??b!.&a&ci&sum?tilop??i&c&arcomed?neic??golo&ce?ncet??m&edaca?onoce??rt&ap?sudni??vilob??n&egidni?icidem??serpme?tsiver?vitarepooc??b&ew?og??dulas?e&rbmon?tr&a?op&ed?snart????g&olb?ro??ikiw?l&a&noi&canirulp?seforp??rutan??im??moc?o&fni?lbeup?rga?tneimivom??saiciton?t&askt?en?ni??ude?vt??h?iew?olg??c!.&bew?cer?dr&c,rac,?esabapus,gro?ipym,l&im?per:.di,,?m&o&c!.topsgolb,?n??rif?udon,?ofni?s&egap&dael,l,?tra??t&4n,en?ni??ude?vog??a?e?in?mara?s&edarb?ic???d!.&b&ew?og??dls?gro?lim?moc?t&en?ra??ude?vog??agoba?if?zd7acbgm--nx??e&c?d&iv?or??morafla??f!ni!.&e&g&delwonk-fo-l&errab,lerrab,?ellocevoli,?ht-skorg,rom-rof-ereh,tadpusn:d,,?llatiswonk,macrvd,ofni-v,p&i&-on,fles,?ohbew,?ruo-rof,s&iht-skorg,nd&-cimanyd,nyd,uolc,??tsrifyam,ysrab,zmurof,???g&el?n!am?ib???hwsohw?i!.&35nyd,8302,a&minifed,tad-b,?b&altig,uhtig,?c&inone:.remotsuc,,zh,?d&in,u&olc&iaznab.ppa,ropav,?rd,??e&c&apsinu.1rf-duolc,ivedniser,?donppad.sndnyd,egipa,lej,nilnigol,sufxob,t&i&beulb,snoehtnap,?newtu,ybeeb.saap,??gni&gatsniser.secived,tsohytsoh,?k&coregrof.di,orgn,ramytefasresworb,?m&oc?udon,?n&mtsp:.kcom,,yded,?ot&oq,pyrctfihs,?p&opilol,pa&-arusah,e&nalpkcab,tybeeb.1dkes,???r&e&tsneum-hf,vres&cisab,lautriv,??ial.sppa,?s&codehtdaer,gnihtbew,nemeis-om,pparevelc,tacdnas,?t&e&kcubtib,notorp,?i&belet,detfihs,kecaps,?raedon.egats,s&ohg,udgniht.&cersid.&dvreser,tsuc,?dorp.tsuc,gnitset.&dvreser,tsuc,?ved.&dvreser,tsuc,????vgib.0ku,whs,x&bslprbv.g,cq,rotide,?y&olpedew,srab,??b?d&ar?u&a?ts???j?r?syhp??j!.&eman?gro?hcs?lim?moc?ten?ude?vog???ll&ag?o??m!.&gro?moc?ten?ude?vog??g?il?mi?orp??n!.&a&0&b-ekhgnark--nx?c-iehsrgev--nx?g-lksedlig--nx?k-negnanvk--nx??1&p-nedragy--nx?q-&asierrs--nx?grebsnt--nx?lado-rs--nx?n&egnidl--nx?orf-rs--nx??regnayh--nx?ssofenh--nx??r-datsgrt--nx?s-ladrjts--nx?v-y&senner--nx?vrejks--nx???3g-datsobegh--nx?4&5-&dnaleprj--nx?goksnerl--nx?tednalyh--nx??6-neladnjm--nx?s-&antouvachb--nx?impouvtalm--nx??y-&agrjnevvad--nx?ikhvlaraeb--nx???7k-antouvacchb--nx?8&k-rekie-erv--nx?l-ladrua-rs--nx?m-darehsdrk--nx??a!.sg??bct-eimeuvejsemn--nx?d&do?iisevvad?lov?narts?uas??f&1-&l--nx?s--nx??2-h--nx??g&10aq0-ineve--nx?av?ev?lot?r&ajn&evvad?u??ájn&evvad?u????h?iz-lf--nx?j&ddadab?sel??k&el?hoj&sarak?šárák??iiv&ag&na&el?g??ŋ&ael?ág???ran???l&f?lahrevo?o&ms?s??sennev?t-&ilm--nx?tom--nx??u&-edr--nx?s??øms??muar?n&0-tsr--nx?2-dob--nx?5-&asir--nx?tals--nx??a&r!-i-om?f?t??t??douvsatvid?kiv?m&os?øs??n&od?ød??ra?sen?t&aouvatheig?ouv&a&c&ch&ab?áb??h&ab?áb???n??i&ag?ág??sa&mo?ttvid??án???z-rey--nx?ær&f?t???o&p-&ladr--nx?sens--nx??q-nagv--nx?r-asns--nx?s-kjks--nx?v-murb--nx?w-&anr&f--nx?t--nx??ublk--nx???ppol?q&0-t&baol--nx?soum--nx?veib--nx??x-&ipphl--nx?r&embh--nx?imph--nx???y-tinks--nx??r&f-atsr--nx?g-&an&ms--nx?nd--nx??e&drf--nx?ngs--nx??murs--nx?netl--nx?olmb--nx?sorr--nx??h-&a&lms--nx?yrf--nx??emjt--nx??i&-&lboh--nx?rsir--nx?y&d&ar--nx?na--nx??ksa--nx?lem--nx?r&ul--nx?yd--nx????stu??j-&drav--nx?rolf--nx?sdav--nx??kua?l-&drojf--nx?lares--nx??m-tlohr--nx?n-esans--nx?olf?p-sdnil--nx?s-ladrl--nx?tih?v-rvsyt--nx??s&a&ns?ons??i&ar?er&dron?r&os?øs???ár??la&g?h??mor!t??sir?uf?åns??t&koulo&nka?ŋká??la?p-raddjb--nx?r-agrjnu--nx?s&aefr&ammah?ámmáh??orf?r&o?ø???u-vreiks--nx??u&h-dnusel--nx?i-&drojfk--nx?vleslm--nx??j-ekerom--nx?k-rekrem--nx?u-&dnalr--nx?goksr--nx?sensk--nx??v-nekyr--nx?w-&k&abrd--nx?ivjg--nx??oryso--nx??y-y&dnas--nx?mrak--nx?n&art--nx?nif--nx??reva--nx??z-smort--nx??v!.sg?ledatskork?reiks??wh-antouvn--nx?x&9-dlofts--nx.aoq-relv--nx?d-nmaherk--nx?f-dnalnks--nx?h-neltloh--nx?i-drgeppo--nx?j-gve&gnal--nx?lreb--nx??m-negnilr--nx?n-drojfvk--nx??y&7-ujdaehal--nx?8-antouvig--nx?b-&dlofrs--nx?goksmr--nx?kivryr--nx?retslj--nx??e-nejsom--nx?f-y&krajb--nx?re&dni--nx?tso--nx??stivk--nx??g-regark--nx?orf?ørf??z9-drojfstb--nx??b&25-akiivagael--nx?53ay7-olousech--nx?a&iy-gv--nx?le-tl&b--nx?s--nx??n0-ydr--nx??c&0-dnal-erdns--nx?z-netot-erts--nx??g&g-regnarav-rs--nx?o-nejssendnas--nx??ju-erdils-ertsy--nx?nj-dnalh-goksrua--nx?q&q-ladsmor-go-erm--nx.&ari-yreh--nx?ednas??s-neslahsladrjts--nx???ca&4s-atsaefrmmh--nx?8m-dnusynnrb--nx?il-tl--nx?le-slg--nx?n5-rdib--nx?op-drgl--nx?uw-ynnrb--nx??d&a&qx-tggrv--nx?reh!nnivk?sd&ork?ørk??uas??ts&e&bi?kkar?llyh?nnan??g&ort?ørt??k&alf?irderf??levev?mirg?obeg&ah?æh??r&ah?ejg????barm-jdddb--nx?ie!rah?s&etivk?ladman???lof&r&os?øs??ts&ev.ednas?o.relav?ø.relåv???n&a&l&-erd&n&os?øs??ron??adroh.so?dron.&a&g5-b--nx?ri-yreh--nx??ob?y&oreh?øreh??øb??e&m!lejh??pr&oj?øj??vi??gyb?n&aks?åks??o&h-goksrua?rf??r&o?ua?ø??tros?øh-goksrua??rts!e&devt?lab?mloh???s&ellil?naitsirk?rof???u&l!os??s!d&im?lejt??e&guah?l&a?å???kkoh?lavk?naitsirk?r&af?eg&e?ie???tef?y&onnorb?ønnørb?????r&a&blavs!.sg??g&eppo?la???o&j&f&a!dniv?k?vk??die?e&dnas?kkelf??llins?r&iel?ots??s&lab?t&ab?åb??yt??å!k??ævk??les??ts??åg&eppo?lå???ureksub.sen??e&ayb-yrettn--nx?d&ar?lom?r&of?øf??år??g&gyr?nats??i&meuv&ejsem&aan?åån??sekaal??rjea??j&d&ef?oks??les??k&er&aom?åom??hgna&ark?årk??iregnir?kot!s??s&ig?uaf???l&bmab?kyb?l&av?ehtats??oh??m&it?ojt?øjt??n&arg?g&os?øs??meh?reil?te?ummok?yrb??r&dils-erts&ev?y&o?ø???ua?vod??sa&ans?åns??t&robraa?spaav??urg??f&62ats-ugsrop--nx?a&10-ujvrekkhr--nx?7k-tajjrv-attm--nx??o!.sg?h??s!.sg??v!.sg???g&5aly-yr&n--nx?v--nx??a&llor?ve&gnal?lreb???n&av!snellu??org??oks&die?m&or?ør??ner&ol?øl??r&o?ø???r&eb!adnar?edyps?s&die?elf?gnok?n&ot?øt????obspras??uahatsla?åve&gnal?lreb???h&0alu-ysm--nx?7&4ay8-akiivagg--nx?5ay7-atkoulok--nx??a!.sg???i&e&hsr&agev?ågev??rf??k&h&avlaraeb?ávlaraeb??s??lm&a?å??mpouvtal&am?ám??pph&al?ál??rrounaddleid?ssaneve?ššáneve??j&0aoq-ysgv--nx?94bawh-akhojrk--nx??k&a&b&ord?ørd??jks?lleis??iv!aklejps?l&am?evs?u??mag?nel?ojg?r&a&l?n??epok?iel?y&or?ør???s&ah?kel?om??øjg??kabene?ojsarak?ram&deh.&aoq-relv--nx?rel&av?åv??so??e&let.&ag5-b--nx?ob?øb??ra???åjks??l&a!d&anrus?d&numurb?ron??e&gnard?nte?s&meh?sin??ttin??g&is?nyl??kro?l&em?l&ejfttah?of??u&ag-ertdim?s???n&am?era?gos?i&b?nroh?r??kos?nus?oj??o-&dron?r&os?øs???ppo?r&a!l?nram??e&gne?l?v??is?o&jts?ts??u&a-&dron?r&os?øs???h??å?æl?øjts??s&e&jg?nivk?ryf??kav?mor-go-er&om.&ednas?yoreh??øm.&ednas?yøreh???uag??t&las?rajh?suan??v&l&a?e-rots??u-go-eron??yt??ksedlig?res&a?å???bib&eklof?seklyf??es!dah??h!.sg??i&m?syrt??l&ejf?ov&etsua?gnit?ksa?sdie???n!.sg??o!.sg?boh?g?h??r!.sg??å!ksedlig??øboh??m&a&rah?vk??f!.sg??h!.sg??i&e&h&dnort?rtsua?ssej??rkrejb??ksa??ol?t!.sg??u&dom?esum?r&ab?drejg?evle?os?uh?æb?øs??ttals???n&a&g&av?okssman?åv??jlis?or?r&g?rev???e&d&do&sen?ton??lah?r&agy&o?ø??ojfsam???g&iets?n&a&l&as?lab??n&avk?ævk??t&arg?ddosen??v&al?essov???i&d&ol?øl??l&ar?ær???yl??reb??iks?k&srot?y&or?ør???l&a&d&gnos?n&er?ojm?øjm??om??tloh??ug?åtloh??mmard?ojs&om?sendnas??ppolg?s&lahsladr&ojts?øjts??o??t&o&l?t-erts&ev?o?ø???roh?øl??vly&kkys?nav??yam-naj!.sg??øjs&om?sendnas???g&orf?ujb??i&dnaort?vnarg??kob?ladendua?maherk&a?å??n&it?urgsrop??orf-&dron?r&os?øs???r&aieb?evats??sfev?uaks?yrts??o&6axi-ygvtsev--nx?c,d&ob?rav??ievs?kssouf?l&m&ob?øb??ous&adna?ech&ac?áč???so!.sg???msdeks?niekotuak?r&egark?olf?y&oso?øso???s&dav?mort???p&ed?ohsdaerpsym,p&akdron?elk???r&a&d&dj&ab?áb??iab??jtif?luag?mah?vsyt??e&gn&a&k&iel?ro??merb?n&at?mas??rav-r&os?øs??srop?talf?v&ats?el??y&oh?øh???ivsgnok??il?jkniets?k&a&nvej?rem?s&gnir?nellu???ie-er&den?v&o?ø???ram?sa?årem??la&jf?vh??m&b&ah?áh??mahellil??nnul?ts&l&oj?øj??ul??y&o?ø???imp&ah?áh??m!.sg??osir?t!.sg??ádiáb?ævsyt?øsir??s&adnil?en&dnas?e&dga?k&ri&b?k??som??ve??me&h?jg??nroh-go-ejve?s&a?ednil?k&o?ø??of?yt?å??tsev??gv?hf?igaval?o&r&or?ør??sman??so&fen&oh?øh??m?v??uh&lem?sreka.sen??å!dnil???t&a&baol?g&aov?grav??jjr&av-attam?áv-attám??l&a&b?s??ás??soum?ts?v&eib?our???e&dnaly&oh?øh??f?s&nyt?rokomsdeks?sen??vtpiks??in&aks?áks??loh&ar?år??n!.sg??o&m&a?å??psgolb,?s!.sg?efremmah?or?ør??terdi?á&baol?ggráv?lá&b?s??soum?veib???u&b!.sg?alk?e&dna?gnir?nner??les?ælk??dra&b?eb??g&nasrop?vi?ŋásrop??j&daehal&a?á??jedub?v&arekkhar?árekkhár???ksiouf?n&diaegadvoug?taed???v&irp?lesl&am?åm???y&b&essen?nart?sebel?tsev??o&d&ar?na!s??or??gavtsev?k&rajb?sa??lem?mrak?n&art?n&if?orb???r&a&mah?n?v??e&dni?t&so?ton??va??ul?yd??s&am?enner?gav?lrak?tivk??vrejks??ø&d&ar?na!s??ør??gåvtsev?k&rajb?sa??lem?mrak?n&art?n&if?ørb???r&e&dni?t&so?tøn??va??ul?yd?æ&n?v???s&enner?gåv?tivk?åm??vrejks???á&slág?tlá?vreiks??å&gåv?h?jddådåb?lf??ø&d&ob?rav??r&egark?olf??s&dav?mort????aki?i&sac?tal??u??o&b?f?g?hay?o?ttat??r!.&cer?erots?gro?m&o&c?n??rif?t??o&c,fni??pohs,stra?t&n?opsgolb,?www??e&a!.&a&ac?cgd?idem??bulc!orea??ci&ffartria?taborea??e&cn&a&l&lievrus-ria?ubma??netniam?rusni??erefnoc??gnahcxe?mordorea?ni&gne?lria?zagam??rawtfos??gni&d&art?ilg!arap?gnah???l&dnahdnuorg?ledom??noollab?retac?sael?t&lusnoc?uhcarap??vidyks??hcraeser?l&anruoj?euf?icnuoc?ortnoc!-ciffart-ria???n&gised?oi&nu?t&a&cifitrec?ercer?gi&tsevni-tnedicca?van??i&cossa!-regnessap??valivic??redef??cudorp?neverp-tnedicca????ograc?p&ihsnoipmahc?uorg!gnikrow???r&e&dart?enigne?korb?niart?trahc??o&htua?tacude???s&citsigol?e&civres?r??krow?serp!xe??tnega??t&farcr&ia?otor??hgil&f?orcim??liubemoh?n&atlusnoc?e&duts?m&esuma?n&iatretne?revog??piuqe????olip?ropria?si&lanruoj?tneics???w&erc?ohs??y&cnegreme?dobper?tefas????rref?z??p!.&a&aa?ca?pc??dem?ecartsnd.icb,gne?r&ab?uj??snduolc,t&acova?cca?hcer??wal?ysrab,???s!.&em?gro?hcs,moc?ten?ude?vog???t!.&116,ayo,gro?lim?moc?nayn,sulpnpv,t&cennockciuq.tcerid,en??ude?v&dr,og???o&hp?m?v?yk??tol?ua??v&iv?lov??xas?ykot??p&a&ehc?g?m?s??eej?g!.&gro?ibom?moc?ossa?ppa,ten?ude???i&r!.nalc,?v?z??j!.&a&3&5xq6f--nx?xqi0ostn--nx??5wtb6--nx?85uwuu--nx?9xtlk--nx?bihc!.&a&bihciakoy?don?ma&him?ye&ragan?tat???r&a&bom?gan?hihci??u&agedos?kas?ustak???s&os?ufomihs??t&amihcay?iran??w&a&g&im&anah?o??omak??kihci?zustum??ihsak??y&agamak?imonihci???e&akas?nagot??i&azni?esohc?h&asa?s&abanuf?ohc???ka&to?zok??musi?orihs?r&akihabihsokoy?o&dim?tak??ukujuk??usihs??nano&hc?yk??o&d&iakustoy?ustam??hsonhot?k&a&rihs?t??iba??nihsaran?sobimanim?tas&arihsimao?imot??uhc?yihcay??u&kujno?s&ayaru?t&imik?tuf???zarasik????g&as!.&a&gas?m&a&tamah?yik??ihsak??rat?t&a&gatik?hatik??ira!ihsin????e&kaira?nimimak??i&akneg?g&aruyk?o??h&c&amo?uo??siorihs??kaznak?modukuf?ra&gonihsoy?mi???nezih?u&k&at?ohuok??s&ot?tarak?????ihs!.&a&kok?m&a&hagan?yirom??ihsakat??rabiam?wagoton??e&miharot?nokih??houyr?i&azaihsin?esok?kustakat?moihsagih??na&mihcahimo?nok??o&hsia?mag?t&asoyot?ok?tir???us&ay?t&asuk?o??????k&aso!.&a&d&awihsik?eki??k&a&noyot?s&akaayahihc?oihsagih???oadat?uziak??m&ayas!akaso??odak??r&a&bustam?wihsak??ediijuf??t&akarih?i&k?us???wag&ayen?odoyihsagih???e&son?tawanojihs??honim?i&akas?h&cugirom?s&ayabadnot?i&a&kat?t??n??oyimusihsagih???k&a&rabi?sim??ustakat??muzi?r&ijat?otamuk???nan&ak?n&ah?es???o&ay?n&a&ganihcawak?simuzi?tak??eba?ikibah?oyot??t&anim?iad?omamihs??uhc??ust&oimuzi?tes????ou&kuf!.&a&d&amay?eos??g&no?ok?usak??hiku?k&awayim?uzii??ma&kan?y&asih?im???rawak?t&a&gon?ka&h?num?t???umo??wa&g&a&kan?nay?t??ias??ko!rih???y&ihsa?usak???e&m&ay?uruk??taruk?us??i&a&nohs?raihcat??goruk?h&cukuf?s&a&gih?hukuy??in???k&a&gako?muzim??iust?o?ustani??m&anim?otihsoynihs?u??r&ogo?ugasas??usu??ne&siek?zu&b?kihc???o&gukihc?h&ak?ot?ukihc??j&ono?ukihc??kayim?nihsukihc?to?uhc??u&fiazad?gnihs?stoyot????zihs!.&a&bmetog?d&amihs?eijuf?ihsoy?omihs??kouzihs?mihsim?ra&biah?honikam??tawi?wa&g&ekak?ukik??kijuf??yimonijuf??i&a&ra?sok??hcamirom?juf?kaz&eamo?ustam??ma&nnak?ta??nukonuzi?orukuf??nohenawak?o&nosus?ti??u&stamamah?z&a&mun?wak??i!ay?i&hs&agih?in??manim??mihs????????m&a&tias!.&a&d&ihsoy?ot?usah??k&a&dih?sa??o&arihs?s???m&a&tias?y&as?o&rom?tah??ustamihsagih???i&hsagurust?jawak??uri??ni?wa&g&e&ko?man??ikot?o??k&ara?i&hsoy?mak???ru?zorokot??y&a&g&amuk?ihsok?otah??kuf??imo??ziin??e&bakusak?ogawak?sogo?ttas?zokoy??i&baraw?h&cugawak?s&oyim?ubustam???iroy?k&ato?ihs?u&k?stawi???m&akoyr?i&hsoy?juf??uziimak???naznar?o&dakas?ihsay?jnoh?n&a&go?nim??imijuf?nah?oy??r&ihsayim?otagan??t&asim!ak??igus?omatik??zak??u&bihcihc!ihsagih??sonuok?ynah????y&ak&aw!.&a&d&ira?notimak??kadih?ma&h&arihs?im??y&a&kaw?tik??oduk???ru&ustakihcan?y??sauy?wa&g&a&dira?zok??orih??konik??yok?zok??e&banat?dawi??i&garustak?jiat?mani??naniak?o&bog?nimik?t&asim?omihs&ah?uk????ugnihs???o!.&a&jos?koasak?m&ay&ako?ust??ihsayah??r&abi?ukawaihsin??wi&aka?nam???e&gakay?kaw??i&gan?h&cu&kasa?otes??sahakat??k&asim?ihsaruk??miin??n&anemuk?ezib??o&hsotas?jnihs?n&amat?imagak??ohs?uhcibik?????ot!.&a&damay?got?koakat?may&etat?ot??nahoj?riat?waki&inakan?reman???eb&ayo?oruk??i&h&asa?ciimak?sahanuf??kuzanu?m&an&i?ot??ih???nezuyn?otnan?u&hcuf?stimukuf?z&imi?ou???????ihs&o&gak!.&a&m&ayuok?ihsogak??si?yonak??e&banawak?n&at&akan?imanim??uka??tomoonihsin??i&adnesamustas?k&azarukam?oih??m&ama?uzi??usuy??nesi?o&knik?os?tomustam??uzimurat???rih!.&a&ka&n?s??m&ayukuf?i&hsorihihsagih?j&ate?imakikaso????r&a&bohs?h&ekat?im???es??tiak?wiad??e&kato?ruk??i&h&ci&akustah?mono?nihs??s&inares?oyim???manimasa?uk??negokikesnij?o&gnoh?namuk??uhcuf????uk&ot!.&a&bihci?mi&hsu&kot?stamok??m??wagakan??egihsustam?i&gum?h&coganas?soyim??kijaw?m&anim?uzia??ukihsihs??nan&a?iak??o&nati?turan????uf!.&a&batuf?m&a&to?y&enak?irok???ihs&im?ukuf??os?uko??r&aboihsatik?uganat??ta&katik?mawak?rih??w&a&g&akus?emas?uy??k&a&mat?rihs?sa??ihsi??nah??ohs???e&gnabuzia?iman?ta&d?tii???i&adnab?enet?hs&agih?iimagak??k&a&wi?zimuzi??ubay??minuk?r&ook?ustamay???nihsiat?o&g&etomo?ihsin?nan?omihs??no!duruf?rih??rihsawani?ta&may?simuzia???u&rahim?stamakawuzia?zia&ihsin?nay???????nug!.&a&bawak?doyihc?k&anna?oi&hsoy?juf?mot???m&ayakat?ustagaihsagih??n&ihsatak?nak??r&ahonagan?nak?o?u&kati?mamat???t&amun?inomihs?o??w&akubihs?iem?ohs???i&hsa&beam?yabetat??kas&akat?esi??m&akanim?uzio??ogamust?rodim??o&jonakan?n&eu?oyikust??tnihs??u&komnan?stasuk?yrik?????ran!.&a&bihsak?d&akatotamay?u!o???guraki?m&ay&atik&imak?omihs??irokotamay??oki??ra&hihsak?n??wa&geson?knet???e&kayim?ozamay?sog?ustim??i&a&rukas?wak??garustak?h&ciomihs?sinawak??jo?ka&mnak?toruk??makawak?nos?r&net?otakat?ugeh???o&d&na?oyo??gnas?jnihs?nihsoy!ihsagih??tomarawat?yrok????t&ag&amay!.&a&dihsio?k&atarihs?ourust??may&a&kan?rum??enak?onimak??rukho?ta&ga&may?nuf??hakat?kas??wa&g&ekas?orumam??ki&hsin?m??z&anabo?enoy?ot???zuy??e&agas?bonamay?dii?nihsagih?o??i&a&gan?nohs??h&asa?sinawak??nugo??o&dnet?jnihs?ynan??ukohak???iin!.&a&ga?k&ium?oagan??munou!imanim??t&a&bihs?giin??ioy??w&a&gioti?kikes?zuy??irak??yijo??e&kustim?mabust??i&aniat?hcamakot?kaz&awihsak?omuzi??m&a&gat?karum??o???n&anust?esog??o&das?ihcot?jnas?k&ihay?oym??mak?naga?ries??u&ories?steoj?????i&ka!.&a&go?k&asok?oimak??t&ago!rihcah??ika!atik???w&aki?oyk???e&mojog?natim?suranihsagih?t&ado?okoy???i&hsoyirom?magatak?naokimak??nesiad?o&hakin?jnoh!iruy??nuzak?rihson?tasi&juf?m??yjnoh??u&kobmes?oppah????o!.&a&dakatognub?m&asah?ihsemih??su?t&ekat?i&h?o????e&onokok?ustimak??i&jih?k&asinuk?ias?usu??mukust??onoognub?u&fuy?juk?ppeb?suk??????wa&ga&k!.&a&mihsoan?rihotok?waga&kihsagih?ya???emaguram?i&j&nonak?ustnez??kunas?monihcu??o&hsonot?nnam?yotim??u&st&amakat?odat??zatu????nak!.&a&dustam?kus&okoy?tarih??maz?nibe?r&a&gihsaimanim?h&esi?imagas??wa&do?guy???u&im?kamak???tikamay?wa&k&ia?oyik?umas??sijuf??yimonin??e&nokah?saya??i&akan?esiak?gusta?hsuz?kasagihc?o?ukust??o&nadah?sio?tamay?????kihsi!.&a&danihcu?gak?kihs?mijaw?t&abust?ikawak??wazanak??i&gurust?hcionon?mon?ukah??nasukah?o&anan?ton!akan???u&kohak?stamok?z&imana?us?????niko!.&a&han?m&arat?ijemuk?uru??n&e&dak?zi??no??ra&hihsin?rih??wa&kihsi?niko??yehi?zonig??e&osaru?seay??i&hsagih?jomihs?k&a&gihsi?not??ihsakot??m&a&ginuk?kihsug?maz??igo?otekat??nuga!noy???n&a&moti?timoy?wonig??i&jikan?k???o&gan?jnan?tiad&atik?imanim???u&botom?kusug&akan!atik??imot??rab&anoy?eah???????c&204ugv--nx?462a0t7--nx?678z7vq5d--nx?94ptr5--nx?a??d&17sql1--nx?3thr--nx?5&20xbz--nx?40sj5--nx??7&87tlk--nx?ptlk--nx??861ti4--nx?a?e??e&16thr--nx?5&1a4m2--nx?9ny7k--nx??im!.&a&bot?k&asustam?uzus??m&a&him?y&emak?im???ihs??nawuk?wi&em?k???e&bani?ogawak?si!imanim???i&arataw?gusim?h&asa?ciakkoy??k&a&mat?sosik?t??iat??raban??o&dat?hik?n&amuk?ihseru?o&du?mok????ust???mihe!.&a&m&a&h&ataway?iin??yustam??ij&awu?imak???taki!man???ebot?i&anoh?kasam?rabami??n&ania?egokamuk?oot??o&jias?kihcu?nustam?uhcukokihs?yi!es???u&kohik?zo????n!.&nriheg,teniesa.resu,?amihs!.&a&d&amah?ho?usam??kustay?m&a?ihsoni&hsin?ko???wakih??e&namihs?ustam??i&g&aka?usay??konikak?mikih??nannu?o&mu&kay?zi!ihsagih?uko???nawust?tasim??u&stog?yamat?????tawi!.&a&bahay?d&amay?on??koirom?t&a&honat?katnezukir??imus??w&as&ijuf?uzim??ihs???e&hon&i&hci?n??uk??tawi??i&a&duf?murak?wak??h&custo?si&amak?ukuzihs???j&oboj?uk??k&a&m&anah?uzuk??sagenak??esonihci??m&akatik?uzia&rih?wi????o&kayim?no&rih?t??tanufo??uhso????g&3zsiu--nx?71qstn--nx?l??h&03pv23--nx?13ynr--nx?22tsiu--nx?61qqle--nx??i&54urkm--nx?g&ayim!.&a&dukak?m&a&goihs?kihs??ihsustam!ihsagih??unawi??r&awago?iho??ta&bihs?rum??w&a&gano?kuruf??iat??y&imot?ukaw???e&mot?nimes??i&hsiorihs?ka&monihsi?s&awak?o???mak?r&ataw?o&muram?tan????o&az?jagat?t&asim?omamay???u&fir?k&irnasimanim?uhsakihcihs?????ihcot!.&a&g&a&h?kihsa??ust??kom?m&ay&o?usarak??unak??r&a&boihsusan?watho??iho?ukas??t&akihsin?iay??wa&konimak?zenakat??y&imonustu?oihs???e&iiju?kustomihs?nufawi??i&akihci?g&etom?ihcot?on???o&k&ihsam?kin??nas?sioruk?tab??u&bim?san?????h&c&ia!.&a&dnah?m&a!h&akat?im??yuni??ihs&ibot?ust???r&a&hat?tihs??ik?u&ihsagih?kawi???t&ihc?o&k?yot???wa&koyot?zani??yi&monihci?rak???e&inak?k&aoyot?usa??manokot?noyot??i&a&gusak?kot?sia??eot?h&asairawo?cugo?s&ahoyot?oyim???k&a&mok?zako??ihssi??motay?rogamag??n&an&ikeh?ok??ihssin??o&got?ihsin?jna?rihsnihs?suf?tes??u&bo?raho?s&oyik?takihs??yrihc?zah????ok!.&a&dusay?kadih?mayotom?r&ah&im?usuy??umakan??sot!ihsin??wa&g&atik?odoyin??k&as?o????i&esieg?hco!k??jamu?k&a!sus??usto??ma&gak?k??rahan??o&mukus?n&i?ust!ihsagih???torum?yot!o???u&koknan?zimihsasot????ugamay!.&a&m&ayukot?ihso??toyot??e&bu?subat??i&gah?kesonomihs?nukawi?rakih??nanuhs?otagan?u&ba?foh?otim?stamaduk?uy?????sanamay!.&a&dihsoyijuf?mayabat?r&ahoneu?ustakihsin??w&a&k&ayah?ijuf??suran??ohs???egusok?i&ak?h&cimakan?s&anamay?od???k&asarin?u&feuf?sto????o&k&akanamay?ihcugawakijuf??nihso?t&asimawakihci?ukoh??uhc??spla-imanim?u&b&nan?onim??fok?hsok?rust?????ka&rabi!.&a&bukust?gok?kan!ihcatih??m&a&sak?timo?wi??ihsak?ustomihs??ni?r&a&hihcu?way??u&agimusak?ihcust???t&ag&amay?eman??oihcatih??w&ag&arukas?o??os??yi&moihcatih?rom???e&bomot?dirot?not?tadomihs??i&a&k&as?ot??rao??esukihc?gahakat?h&asa?catih??k&a&rabi?saguyr??ihsani?uy??ma?rukustamat??o&dnab?giad?him?kati?rihsijuf?soj?t&asorihs?im??yihcay??u&fius?kihsu?simak????sagan!.&a&m&abo?ihsust??natawak?r&abamihs?u&mo?ustam???wijihc?yahasi??i&akias?hies?k&asagan?i??masah??neznu?o&besas?darih?t&eso?og!imaknihs????ust&igot?onihcuk?uf????zayim!.&a&biihs?guyh?k&oebon?ustorom??mihsuk?r&emihsin?uatik??ta&katik?mim??wag&atik?odak??ya??e&banakat?sakog??i&hsayabok?kaza&kat?yim??m&animawak?ot&inuk?nihs????nanihcin?o&j&ik?onokayim??n&ibe?ust??tias??urahakat????ro&moa!.&a&dawot?turust?wasim??e&hon&ihc&ah?ihs??nas?og?ukor??sario??i&anarih?ganayati?hsioruk?jehon?kasorih?makihsah?nawo?r&amodakan?omoa???o&gnihs?kkat??u&ragust?stum????ttot!.&a&r&ahawak?uotok??sa&kaw?sim???egok?irottot?nanihcin?o&ganoy?nih?tanimiakas??u&bnan?z&ay?ihc??????ukuf!.&a&deki?gurust?ma&bo?h&akat?im??yustak??sakaw??eabas?i&akas?ho?jiehie?ukuf??nezihce!imanim??ono????k&26rtl8--nx?4&3qtr5--nx?ytjd--nx??522tin--nx?797ti4--nx??l33ussp--nx?m&11tqqq--nx?41s3c--nx??n&30sql1--nx?65zqhe--nx?n7p7qrt0--nx??o&131rot--nx?7qrbk--nx?c?diakkoh!.&a&deki?gakihset?hcebihs?k&adih?u&fib?narihs???m&ayiruk?hot?ihs&orihatik?ukuf??oras?usta??r&ib&a!ka??o?uruf??ozo?u&gakihsagih?oyot???sakim?ta&gikust?mun??w&a&ga&k&an?uf??nus!imak???k&aru?i&h&asa?sagih??kat?mak??omihs?um??zimawi??ine?oyk??yot??e&a&mustam?nan??b&a&kihs?yak??o&noroh?to???ian?k&ihsam?ufoto??nakami?ppoko!ihsin??sotihc?tad!okah??uonikat??i&a&bib?mokamot?n&a&k&kaw?oroh??wi??eomak?ihsatu?okik?usta&moruk?sakan????eib?h&c&ioy?u&bmek?irihs???s&ase?ekka?oknar?uesom???jufirihsir?k&amamihs?i&at?n???m&atik?otoyot??oa&kihs?rihs??r&a&hs?kihsi?mot??ihs&aba?ir??otarib???n&a&hctuk?rorum?se?tokahs??uber??o&kayot?m&ire?ukay??naruf!ima&k?nim???orih?r&ih&ibo?suk??o&bah?h&i&b?hsimak??sa??pnan?yan??umen??t&asoyik?eko?ukoh???u&bassa?kotnihs?m&assaw?uo??pp&akiin?en&ioto?nuk??ip??rato?s&akat?t&eb&e?i&a?hs!a??robon??m&e?o&m?takan???no&h?tamah??o&mik?s?t??u&kir?ppihc?st???onihsnihs?ufuras??uaru??yru!koh??zimihs!ok?????g!oyh!.&a&bmat?dnas?gusak?k&at?o&oyot?y??uzarakat??m&ayasas?irah??wa&g&ani?okak??k&i&hci?mak??oy???yi&hsa?monihsin???i&asak?hs&aka?i&at?nawak???j&awa!imanim??emih??k&a&goa?s&agama?ukuf??wihsin??i&hsog?m???mati?oia?rogimak??n&annas?esnonihs??o&gasa!kat??ka?n&ikat?o?ustat??rihsay?sihs?tomus?yas??u&bay?gnihs?????nagan!.&a&bukah?d&a&w?yim??e&ki?u??ii??k&a&s&ay?uki??zus??ihsoo?ousay??m&ay&akat?ii??i&hsukufosik?jii??ukihc??n&i!hsetat??uzii??r&ah?ugot??saim?t&agamay?oyim??w&a&g&a&kan?n??o??kustam?ziurak??onim!imanim??u&koo?s!omihs????ya&ko?rih???e&akas?nagamok?subo??i&gakat?h&asa?c&a!mo!nanihs???uonamay??sukagot??k&a&kas?mimanim?to??ia&atik?imanim??oa?uzihcom??m&akawak?ijuf?o!t???r&ato?ijoihs?omakat???n&ana?esnoawazon??o&hukas?n&a&gan?kan??i&hc?muza??ustat??romok?si&gan?k??tomustam??u&k&as?ohukihc??stamega????to&mamuk!.&a&gamay?rahihsin?sukama!imak??tamanim??enufim?i&hcukik?k&ihsam?u??nugo!imanim??romakat??o&ara?rihsustay?sa?t&amay?om&amuk?us??u!koyg???yohc??u&sagan?zo????yk!.&a&bmatoyk?k&ies?oemak?uzaw??mayi&h&cukuf?sagih??muk??nihsamay?rawatiju?t&away?ik???e&ba&nat!oyk??ya??di?ni??i&ju?kazamayo?manim??natnan?o&gnatoyk?kum?mak?rihsamayimanim?y&gakan?ka&koagan?s??oj???u&ruziam?z&ayim?ik??????wtc1--nx?ykot!.&a&d&i&hcam?mus??oyihc??k&atim?ihsustak??m&a&t!uko??yarumihsa&gih?sum???i&hs&agoa?ika?o!t??uzuok??ren???r&a&honih?wasago??iadok?umah??ssuf?t&ik?o??wa&g&anihs?ode??k&ara?ihcat???y&agates?ubihs???e&amok?donih?m&o?urukihsagih??soyik??i&enagok?gani?h&ca&da?tinuk??sabati??j&nubukok?oihcah??manigus??o&huzim?jihcah?n&akan?ih!sasum??urika??rugem?t&a&mayihsagih?nim??iat?ok??uhc?yknub??u&fohc?hcuf?kujnihs?????r&2xro6--nx?g?o??s&9nvfe--nx?xvp4--nx??t&netnocresu,opsgolb,?u&4rvp8--nx?fig!.&a&d&eki?ih??kimot?m&ayakat?ihsah??ne?raha&gi&kes?makak??sak??taga&may?tik??wa&g&ibi?ustakan??karihs!ihsagih????e&katim?uawak??i&gohakas?hc&apna?uonaw??k&ago?es?ot??m&anuzim?ijat??nak?urat??nanig?o&dog?jug?makonim?nim?roy?sihcih??u&fig?s&otom?t&amasak?oay???????x5ytlk--nx?yu6d27srjd--nx?z72thr--nx?井福?京東?分大?取鳥?口山?城&宮?茨??媛愛?山&富?岡?歌和??岡&福?静??島&児鹿?広?徳?福??崎&宮?長??川&奈神?石?香??庫兵?形山?手岩?木栃?本熊?根島?梨山?森青?潟新?玉埼?田秋?知&愛?高??縄沖?良奈?葉千?賀&佐?滋??道海北?都京?重三?野長?阜岐?阪大?馬群???k!.&art?gro?moc?per?ude?vog???l&eh?l??m!.uj,ac?j??nd?o&g?h&pih?s!.ysrab,??lnud?oc?t!.&lldtn,snd-won,???pa!.&0mroftalp,arusah,bew:erif,,e&niln&igol,okoob,?tupmocegde,?lecrev,n&aecolatigidno,ur:.a,,?poon,remarf,t&ibelet,xenw,?yfilten,??ra&a?hs??u&ekam?llag?org!.esruocsid,cts?kouk?nayalo???vsr?xece4ibgm--nx??q&a!3a9y--nx??g?i!.&gro?lim?moc?ten?ude?vog???m?se??r&a!.&acisum?bog?gro?lim?moc!.topsgolb,?rut?t&en?ni??ude?vog??4d5a4prebgm--nx?b?c?eydoog?los?t&at?s!uen???ugaj??b!.&21g?a&b&a&coros?iuc??itiruc??cnogoas?dicerapa?gniram?i&naiog?ramatnas??n&erom?irdnol??op?p&acam?irolf?ma&j?s???rief?tsivaob??b!aj?ib?mi?sb??c&ba?e&r?t??js?sp?t!e???d&em?mb?n&f?i??rt??e&dnarganipmac?ficer?ht?llivnioj?rdnaotnas??f&dj?ed?gg?n&e?i???g&e&l!.&a&b,m,p,?bp,c&a,s,?e&c,p,s,?fd,gm,ip,jr,la,ma,nr,o&g,r,t,?p&a,s,?r&p,r,?s&e,m,r,?tm,??s??l&s?z??n&c?e?o??ol!b?f?v??pp?ro??hvp?i&du?kiw?nana?oretin?r&c?eurab??sp?te?xat??l&at&an?rof??el?im?sq??m&a?da?e&gatnoc?leb??f?ic?oc!.&duolclautriv.elacs.sresu,topsgolb,???nce?o&ariebir?c&e?narboir?saso??d&o?ranreboas??e&g?t??i&b?dar?ecam?r??rp?t&a?erpoir???p&er?m!e?t??ooc?pa?se??qra?r&af?ga?o&davlas?j??tn?ut??s&a&ixac?mlap?nipmac??ed?u&anam?j?m???t&am?e&d?n?v??nc?o&f?n??ra?sf??u&caug9?de?ja?rg??v&da?ed?og!.&a&b?m?p??bp?c&a?s??e&c?p?s??fd?gm?ip?jr?la?ma?nr?o&g?r?t??p&a?s??r&p?r??s&e?m?r??tm???rs?t??xiv?z&hb?ls?o&c?f?????c!.&as?ca?de?if?o&c?g??ro???e&bew?ccos?dnik?e&b?n&igne?oip??rac??gni&arg?rheob??h&cor?sok?t&aew?orb???itnorf?k&col?o&p?rb???l&aed?ffeahcs??mal?nes?pinuj?t&a&eht?rebsnegömrev??law?nec?s&acnal?nom?ubkcolb??upmoc??v&o&c&sid?tfiws??rdnal??resbo??wulksretlow?ywal?zifp??f!.&aterg?bew-no,drp?e&c&itsuj-reissiuh?narf-ne-setsitned-sneigrurihc,?lipuog,rianiretev??hny,i&cc?rgabmahc??m&o&c?n??t??n&eicamrahp?icedem??ossa?pohsdaerpsym,s&e&lbatpmoc-strepxe?riaton?tsitned-sneigrurihc?uova??o&-x&bf,obeerf,?x&bf,obeerf,???t&acova?o&or-ne,psgolb,?r&epxe-ertemoeg?op!orea????vuog??avc7ylqbgm--nx?s??g!.&gro?moc?t&en?opsgolb,?ude?vog???h!.&e&erf,man??mo&c?rf??topsgolb,zi??ur??i!.&a&61f4a3abgm--nx?rf4a3abgm--nx??ca?di?gro?hcs?oc?ten?vog?نار&يا?یا???a&h?per??ew?lf??k!.&c&a?s??e&n?p?r??gk?iggnoeyg?kub&gn&oeyg?uhc??noej??l&im?uoes??man&gn&oeyg?uhc??noej??n&as&lu?ub??o&e&hcni?jead??wgnag???o&c?g??ro?s&e?h?m??topsgolb,u&gead?j&ej?gnawg????cilf??l!.&gro?moc?ten?ude?vog???m!.&topsgolb,vog???n!.&gro?moc?ofni?ten?ude?vog?zib???o&htua?odtnorf?t&c&a?od??laer???p!.&alsi?ca?eman?forp?gro?moc?o&fni?rp??t&en?se??ude?vog?zib???s?t!.&21k?bew?cn!.vog??eman?gro?kst?l&e&b?t??im?op??moc!.topsgolb,?neg?ofni?pek?rd?sbb?ten?ude?v&a?og?t??zib??f?m??ubad?vd??s&8sqif--nx?9zqif--nx?a!.vog?birappnb?gev?lliv?mtsirhc?s??b!.&ew,gro?moc?ten?ude?vog??c?oj?s?u??c&i&hparg?p?t&sigolyrrek?ylana???od??d&a?d?l?n&iwriaf?omaid??oogemoh?rac??e!.&bog?gro?mo&c!.topsgolb,?n??pohsdaerpsym,ude??civres!.enilnigol,?d&d2bgm--nx?oc??h&ctaw?guh??i&lppus?rtsudni?treporp!yrrek???jaiv?l&aw?cycrotom?etoh?gnis?pats??m&ag?oh?reh??nut?ohs?picer?r&it?ut&cip!.7331,?nev???s!i&rpretne?urc??ruoc??taicossa?vig??g!nidloh??h5c822qif--nx?i!.&ekacpuc,gro?moc?t&en?ni?opsgolb,?ude?vog??a09--nx?nnet?rap?targ??k&c&or!.&ecapsbew,snddym,ytic-amil,??us??hxda08--nx?row??l!.&c&a?s??ed,gro?o&c?fni??ten?ude?vog?zib??a&ed?tner??e&ssurb?toh!yrrek???lahsram?m?oot??m!.&bal,etisinim,gro?moc?ten?ude?vog??b?etsys!.tniopthgink,?ialc??n&a&f?gorf?ol??egassap?i&a&grab?mod??giro??o&it&acav?cudorp?ulos??puoc???o&dnoc?geuj?leuv?ppaz?t&ohp?ua???p!.&ces?gro?moc?olp?ten?ude?vog??i&hsralohcs?lihp?t??u??r!.&au,ca?gro?ni?oc?topsgolb,ude?vog?xo,yldnerb.pohs,?a&c?p?tiug??c?e&dliub!.etisduolc,?erac?gor?levart?mraf?n&niw?trap??wolf??ot&cartnoc?omatat??pj?uot??s!.&em?gro?hcs?moc?ten?ude?vog?zib??alg?e&n&isub!.oc,?tif??rp!xe!nacirema???xnal??iws??t&a&e&b?ytic??ob??ek&cit?ram??fig?h&cay?gilf??n&atnuocca?e&mt&rapa?sevni??ve!.oc,???rap??u!.&a&c!.&21k?bil?cc???g!.&21k?bil?cc???i!.&21k?bil?cc???l!.&21k?bil?cc???m!.&21k!.&hcorap?rthc?tvp???bil?cc???p!.&21k?bil?cc???si?v!.&21k?bil?cc???w!.&21k?bil?cc????c&d!.&21k?bil?cc???n!.&21k?bil?cc???s!.&21k?bil?cc????d&e&f?lacsne.xhp,?i!.&21k?bil?cc???m!.&21k?bil?cc???n!.&bil?cc???s!.&bil?cc???u&olcrim,rd,??e&d!.&21k?bil,cc???las-4-&dnal,ffuts,?m!.&21k?bil?cc???n!.&21k?bil?cc????h&n!.&21k?bil?cc???o!.&21k?bil?cc????i&h!.&bil?cc???m!.&21k?bil?c&c?et??goc?n&eg?otae??robra-nna?sum?tsd?wanethsaw???nd?r!.&bil?cc???v!.&21k?bil?cc???w!.&21k?bil?cc????jn!.&21k?bil?cc???k&a!.&21k?bil?cc???o!.&21k?bil?cc????l&a!.&21k?bil?cc???f!.&21k?bil?cc???i!.&21k?bil?cc????mn!.&21k?bil?cc???n&afflog,i!.&21k?bil?cc???m!.&21k?bil?cc???sn?t!.&21k?bil?cc????o&c!.&21k?bil?cc???m!.&21k?bil?cc???ttniop,?p&ion,rettalp,?r&a!.&21k?bil?cc???o!.&21k?bil?cc???p!.&21k?bil?cc????s&a!.&21k?bil?cc???dik?k!.&21k?bil?cc???m!.&21k?bil?cc???nd&deerf,uolc,??t&c!.&21k?bil?cc???m!.&21k?bil?cc???u!.&21k?bil?cc???v!.&21k?bil?cc????ug!.&21k?bil?cc???v&n!.&21k?bil?cc???w!.cc???x&ohparg,t!.&21k?bil?cc????y&b-si,k!.&21k?bil?cc???n!.&21k?bil?cc???w!.&21k?bil?cc????za!.&21k?bil?cc????ah!uab??bria?col?e!.ytrap.resu,?ineserf?lp?xe&l?n???vt?w!.&66duolc,gro?moc?s&ndnyd,tepym,?ten?ude?vog??a?e&iver?n!.elbaeciton,??odniw??y&alcrab?cam?ot???t&0srzc--nx?a!.&amil4,ca!.hts??gni&liamerutuf,tsoherutuf,?o&c!.topsgolb,?fni,?p&h21,ohsdaerpsym,?r&euefknuf.neiw,o??v&g?irp,?xi2,ytic-amil,zib,?c?e!s??hc?if?l!asite??mami?rcomed??b!.&gro?moc?ten?ude?vog??b?gl??c&atnoc?e&les?rid!txen????dimhcs?e!.&eman?gro?moc?ofni?ten?ude?vog?zib??b?em?grat?id?k&circ?ram??n!.&0&002cilc,rab,?1rab,2rab,5inu,6vnyd,7&7ndc.r,erauqs,?a&l&-morf,moob,?minifed,remacytirucesym,tadsyawla,z,?b&boi,g,lyltsaf:.pam,,?c&inagro-gnitae,paidemym,?d&ecalpb,irgevissam.saap.&1-&gs,nol,rf,yn,?2-&nol,yn,??nab-eht-ni,uolc&meaeboda,nievas.c&di-etsedron,itsalej,?xednay:.e&garots,tisbew,?,??e&c&narusnihtlaehezitavirp,rofelacs.j,?gdirbtib,ht-no-eciffo,l&acsnoom,ibom-eruza,?m&ecnuob,ohtanyd,tcerider,?n&ilno-evreser,ozdop,?rehurht,s:abapus,,tis-repparcs,zamkcar,?f&aeletis,crs.&cos,resu,?ehc-a-si,?g&ni&reesnes,sirkcilc,tsohnnylf,?olb&evres,tsaf,??k&catsvano,eeg-a&-si,si,?u,?l&acolottad,iamwt,s&d-ni,s-77ndc,??m&ac&asac,ih,?urofniem,?n&a&f&agp,lhn,?i&bed,llerk,??dcduabkcalb,i,pv-ni,?o&c-morf,duppa,jodsnd,rp-ytinummoc,ttadym,?p&i&-&etsef,on,?emoh,fles,nwo,?j,mac-dnab-ta,o&-oidar-mah,h&bew,sdaerpsym,??pa&duolc,egde,?tfe&moh,vres,?usnd,?r&e&tsulcyduolc,vres-xnk,?vdslennahc:.u,,?s&a&ila&nyd,snd,?nymsd,?bbevres,dylimaf,e&gde-ndc,suohsyub,t&isbeweruza,ys,??k&catstsaf,ekokohcs,?n&d&-won,d,golb,npv,?oitcnufduolc,?ppacitatseruza:.&2suts&ae,ew,?aisatsae,eporuetsew,sulartnec,?,s&a-skcik,ecca&-citats,duolc,???t&adies,ce&ffeym,jorprot:.segap,,?e&nretnifodne,smem,?farcenimevres,i-&ekorb,s&eod,lles,teg,??n&essidym,orfduolc,?r0p3l3t,s&ixetnod,oh&-spv:.citsalej.&cir,lta,sjn,?,gnik,???u&h,nyd,r:eakust.citsalej,,?ved-naissalta.dorp.ndc,x&inuemoh,spym,tsale.&1ots-slj,2ots-slj,3ots-slj,?unilemoh,?y&awetag-llawerif,ffijduolc:.&ed-1arf,su-1tsew,?,ltsaf.&dorp.&a,labolg,?lss.&a,b,labolg,?pam,slteerf,?n&-morf,ofipi,?srab,?z&a-morf,tirfym,???p?tcip?v??f&ig?o&l?sorcim???g!.&bog?dni?ed,g&olb,ro??lim?moc?ot,ten?ude???h!.&dem?gro?l&er?op??m&oc?rif??o&fni?rp?s&rep?sa???po&hs?oc??t&en?luda?ra??ude?vuog???i!.&a&2n-loritds--nx?7e-etsoaellav--nx?8&c-aneseclrof--nx?i-lrofanesec--nx??at?b?c!cul??dv?i&blo&-oipmet?oipmet??cserb?drabmol?g&gof?urep??l&gup?i&cis?me&-oigger?oigger???uig&-&aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf???aizenev&-iluirf?iluirf??ev&-iluirf?iluirf??v&-iluirf?iluirf????n&a&brev?cul?pmac?tac??idras?obrac&-saiselgi?saiselgi??resi??otsip?r&b&alac!-oigger?oigger??mu??dna&-&attelrab-inart?inart-attelrab??attelrabinart?inartattelrab?ssela??epmi?ugil??tnelav&-obiv?obiv??vap?z&e&nev?ps&-al?al???irog???l&iuqa!l??leib??m&or?rap??n!acsot?e&dom?is?sec&-&ilrof?ìlrof??ilrof?ìlrof???g&amor&-ailime?ailime??edras?olob??i&ssem?tal??ne!var??o&cna?merc?rev?vas???oneg?p?r!a&csep?rr&ac&-assam?assam??ef??von??etam?tsailgo!-lled?lled???s!ip?sam&-ararrac?ararrac??u&caris?gar???t!a&cilisab?recam??resac?soa!-&d&-&ellav?lav??ellav?lav??ellav??d&-&ellav?lav??ellav?lav??ellav??te&lrab&-&airdna-inart?inart-airdna??airdnainart?inartairdna??ssinatlac???udap?v!o&dap?neg?tnam???zn&airb&-a&lled-e-aznom?znom??a&lledeaznom?znom??eaznom??e&c&aip?iv??soc?top??om???b&-&23,46,61,?3c-lorit-ds-onitnert--nx?be-etsoa&-ellav--nx?dellav--nx??c!f-anesec-lrof--nx?m-lrof-anesec--nx??he-etsoa-d-ellav--nx?m!u??o2-loritds-nezob--nx?sn-loritds&-nasl&ab--nx?ub--nx??nitnert--nx??v!6-lorit-dsnitnert--nx?7-loritds&-nitnert--nx?onitnert--nx???z&r-lorit-ds&-nitnert--nx?onitnert--nx??s-loritds-onitnert--nx???c&f?is?l?m?p?r?v??d&p?u!olcnys,??e&c!cel?inev?nerolf??f?g!ida&-&a&-onitnert?onitnert??otla!-onitnert?onitnert???a&-onitnert?onitnert??otla!-on&azlob?itnert??onitnert????hcram?l?m!or??n&idu?o&n&edrop?isorf??torc???p?r?s&erav?ilom??t!nomeip?s&eirt?oa!-&d-e&ellav?éllav??e&ellav?éllav???de&ellav?éllav??e&ellav?éllav?????v?znerif??g&a?b?f?il?o?p?r?up?vf??hc?i&b?c?dol?f?l!lecrev?opan?rof&-anesec?anesec???m?n&a&part?rt&-attelrab-airdna?attelrabairdna???imir?ret??p?r!a&b?ilgac?ssas???s!idnirb??t&ei&hc?r??sa??v??l&a!c??b?c?o&m?rit&-&d&eus&-&nitnert?onitnert??nitnert?onitnert??us&-&nitnert?onitnert??nitnert?onitnert??üs&-&nitnert?onitnert??nitnert?onitnert???s&-onitnert?onitnert???d&eus!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??us&-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert??üs!-&n&asl&ab?ub??ezob?itnert??onitnert??nitnert?onitnert???s&-onitnert?onitnert?????m&ac?f?i!t.nepo.citsalej.duolc,?ol?r??n&a!lim?sl&ab?ub???b?c?e!en.cj,v?zob??irut?m!p??p?r?t??o&a!v??b!retiv??c!cel??enuc?g!ivor??i&dem&-onadipmac?onadipmac??pmet&-aiblo?aiblo??rdnos?zal??l?m!a&greb?ret??oc?re&f?lap???n!a&dipmac&-oidem?oidem??lim?tsiro?zlob??ecip&-ilocsa?ilocsa??i&bru&-orasep?orasep??lleva?rot?tnert??r&elas?ovil??ulleb??p?r!a&sep&-onibru?onibru??znatac??oun??s!ivert?sabopmac??t!arp?e&nev?ssorg??n&arat?e&girga?rt?veneb????zz&era?urba???p&a?ohsdaerpsym,s?t??qa?r&a!m?s??b!a??c?f?g?k?me?o?p?s?t?v??s&a&b?iselgi&-ainobrac?ainobrac???b?c?elpan?i?m?ot?s?t?v??t&a?b?c?l?m?nomdeip?o!psgolb,?p?v??u&de?l?n?p??v&a?og?p?s?t?v??y&drabmol?ellav&-atsoa?atsoa??licis?nacsut??z&al?b?c?p??ìlrof&-anesec?anesec???derc?er?f?m!r??utni??je3a3abgm--nx?kh?l!.&topsgolb,vog??uda??m!.&gro?moc!.topsgolb,?ten?ude???n&a&morockivdnas?ruatser?tnuocca??e&g?m&eganam!.retuor,?piuqe??r??i!.ue?m?opdlog??opud?uocsid??o&b?cs!.&ude,vog:.ecivres,,??d?g?h?j?oferab?p&edemoh?s???p!.&emon?gro?lbup?moc?t&en?ni?opsgolb,?ude?vog???r&a!m&law?s???epxe?op&er?pus!.ysrab,?s???s!.&adaxiabme?e&motoas?picnirp?rots??gro?lim?moc?o&c?dalusnoc?hon,?ten?ude??a&cmoc?f??e&b?padub?r?uq??i!rolf?tned??o&h!.&duolc&p,rim,?e&lej,tiseerf,?flah,lrupmet,s&pvtsaf,seccaduolc,?tsafym,vedumpw,??p!sua???urt??t!.&eman?gro?ibom?levart?m&oc?uesum??o&c?fni?r&ea?p???pooc?sboj?t&en?ni??ude?vog?zib??ayh?n?o!bba?irram???uognah?xen?y!.gro,?ztej??u&2&5te9--nx?yssp--nx??a!.&a&s?w??civ?d&i?lq??fnoc?gro?moc!.&pohsdaerpsym,stelduolc.lem,topsgolb,??nsa?ofni?sat?t&ca?en?n??ude!.&a&s?w??ci&lohtac?v??dlq?sat?t&ca?n??wsn!.sloohcs????vog!.&a&s?w??civ?dlq?sat???wsn?zo??ti??c!.&fni?gro?moc?ten?ude?vog??i??d&e!.tir.segap-tig,?iab??e!.&dcym,enozgniebllew,noitatsksid,odagod.citsalej,snd&ps,uolc,?ysrab,??g!.&bew?gro?m&aug?oc??ofni?ten?ude?vog???h!.&0002?a&citore?idem?kitore??edszot?gro?ilus?letoh?m&alker?lif?t?urof??naltagni?o&c?ediv?fni?levynok?nisac??pohs?rarga?s&a&kal?zatu??emag?wen??t&lob?opsgolb,rops??virp?xe&s?zs??ytic?zsagoj??os?sut??l!.topsgolb,?m!.&ca?gro?moc?oc?ro?ten?vog???n!.&duolcesirpretne,eni&esrem,m,?tenkcahs,?em!.ysrab,??o&ggnaw?y!c???r!.&3kl,a&i&kymlak,rikhsab,vodrom,?yegyda,?bps,ca,duolcrim,e&niram,rpcm,?g&bc,nitsohurger.citsalej,ro,?ianatsuk,k&ihclan,s&m,rogitayp,??li&amdlc.bh,m,?moc,natsegad,onijym,pp,ri&b,d&cm:.spv,,orue,?midalv,?s&ar,itym,?t&en,ni,opsgolb,set,?u&4an,de,?vo&g,n,?ynzorg,zakvakidalv,?myc?p?ug??s!.&a&d&golov,nagarak,?gulak,i&groeg,kymlak,lerak,nemra,rikhsab,ssakahk,vodrom,zahkba,?lut,rahkub,vut,yegyda,znep,?bps,da&baghsa,rgonilest,?gunel,i&anatsuk,hcos,ovan,ttailgot,?k&alhsygnam,ihclan,s&legnahkra,m,n&a&mrum,yrb,?i&buytka,nbo,??tiort,vorkop,??l&ocarak,ybmaj,?na&gruk,jiabreza,ts&egad,hkazak-&htron,tsae,???ovonavi,r&adonsark,imidalv,?t&enxe,nek&hsat,mihc,??vo&hsalab,n,?ynzorg,z&akvakidalv,emret,??t&amok?i&juf?masih????v!.&em,g&olb,ro??moc?nc,ten?ude?ved,??ykuyr??v&b?c!.topsgolb,?ed!.&enilnigol,gnigats-oned,hcetaidem,lecrev,o&ned,tpyrctfihs,?ppa-rettalp,s&egap,rekrow,?vr&esi,uc,?weiverpbuhtig,ylf,??ih?l!.&di?fnoc?gro?lim?moc?nsa?ten?ude?vog???m!.&eman?gro?lim?m&oc?uesum??o&fni?r&ea?p???pooc?t&en?ni??ude?vog?zib???o&g?m??rt?s!.&bog?der?gro?moc?ude???t!.&bew-eht-no,naht-&esrow,retteb,?sndnyd,?d?gh?i?won??uqhv--nx??w&a!.moc?hs?l??b!.&gro?oc???c!.&gro?moc?ten?ude??cp??e&iver!.oby,?n?s??g?k!.&bme?dni?gro?moc?ten?ude?vog???m!.&ca?gro?m&oc?uesum??oc?pooc?t&en?ni??ude?vog?zib??b??o&csom?h!s??n?w??p!.&344x,de?en?o&c?g??ro?snduolc,ualeb???r!.&ca?gro?lim?oc?pooc?ten?vog??n??t!.&a46oa0fz--nx?b&82wrzc--nx?ulc??emag?gro?l&im?ru,?moc!.reliamym,?t&en?opsgolb,?ude?v&di?og?ta0cu--nx??zibe?業商?織組?路網???z!.&ca?gro?lim?oc?vog????x&a!.&cm,eb,gg,s&e,u,?tac,ue,yx,?t??c!.&hta,ofni,vog???e&d&ef?nay??ma!nab??rof?s??ilften?jt?m!.&bog?gro?moc?t&en?opsgolb,?ude??g?ma2ibgy--nx??o&b!x??f?rex??rbgn--nx?s!.vog??x&am&jt?kt??x???y&4punu--nx?7rr03--nx?a&d!i&loh?rfkcalb??ot??g?lp?p!ila??rot?ssin?wdaorb??b!.&duolcym,fo?hcetaidem,lim?moc!.topsgolb,?vog??ab?gur??c!.&ca?dtl?eman?gro?m&oc!.&ecrofelacs.j,topsgolb,??t??orp?s&egolke?serp??t&en?nemailrap??vog?zib??amrahp?nega??d&dadog?uts??e&kcoh?ltneb?n&dys?om?rotta??snikcm??g!.&eb,gro?moc?oc?ten?ude?vog??olonhcet!.oc,?rene??hpargotohp?id?k!.&gro?moc?ten?ude?vog??s??l!.&clp?d&em?i??gro?hcs?moc?ten?ude?vog??f?imaf!nacirema??l&a?il??ppus??m!.&eman?gro?lim?moc?t&en?opsgolb,?ude?vog?zib??edaca!.laiciffo,?ra??n&a&ffit?pmoc!ylimafa???os??o&j?s??p!.&gro?lim?moc?pooc?ten?ude?vog???r&e&corg?grus?llag?viled??lewej?otcerid?tnuoc?uxul??s!.&gro?lim?moc?ten?ude?vog??pil??t&efas?i&c?ledif?n&ifx?ummoc!.&bdnevar,gon,murofym,???r&ahc?uces??srevinu??laer?r&ap!.oby,?eporp??uaeb??u!.&bug?gro?lim?moc!.topsgolb,?ten?ude??b!tseb???van!dlo??xes??z&a!.&eman?gro?lim?moc?o&fni?rp??pp?t&en?ni??ude?vog?zib???b!.&az,gro?jsg,moc?ten?ude?vog???c!.&4e,inum.duolc.&rsu,tlf,?m&laer,urtnecatem.motsuc,?oc,topsgolb,??d!.&cos?gro?lop?m&oc?t??ossa?t&en?ra??ude?vog???ib!.&duolcsd,e&ht-rof,mos-rof,rom-rof,?izoj,nafamm,p&i&-on,fles,?ohbew,tfym,?retteb-rof,snd&nyd,uolc,?xro,?g??k!.&duolcj,gro?lim?moc?t&en?ropeletzak.saapu,?ude?vog???m!.&ca?gro?lim?oc?ten?ude?v&da?og????n!.&asq-irom--nx?ca?gro?htlaeh?i&r&c?o&am?ām???wi!k???keeg?l&im?oohcs??neg?oc!.topsgolb,?t&en?nemailrap?vog???a!niflla???rawhcs?s!.&ca?gro?oc???t!.&c&a?s??e&m?n??ibom?l&etoh?im??o&c?fni?g??ro?vt???u!.&gro?moc?oc?ten??rwon??yx!.&e&nozlacol,tisgolb,?gnitfarc,otpaz,??zub??λε?υε?авксом?брс!.&гро?до?ка?р&бо?п!у?????г&б?ро??дкм?зақ?итед?килотак?леб?мок?н&йално?ом??рку?сур!.&арамас,бпс,гро,зиб,ичос,ксм,м&ок,ырк,?рим,я,??тйас?фр?юе?յահ?לארשי?םוק?اي&روس?سيلم?ناتيروم??بر&ع?غملا??ة&كبش?ي&دوعسلا?روس??یدوعسلا??ت&ا&راما?لاصتا??را&ب?ڀ?ھب???ر&ئازجلا?ازاب?صم?طق??سنوت?عقوم?قارع?ك&تيب?يلوثاك??موك?ن&ا&تس&كاپ?کاپ??دوس?ر&يا?یا??مع?يلعلا??درالا?ميلا?ي&رحبلا?طسلف???ه&ارمه?يدوعسلا??وكمارا?يبظوبا?ۃیدوعسلا?टेन?त&राभ?ोराभ??नठगंस?मॉक?्मतराभ?ত&রাভ?ৰাভ??ালংাব?ਤਰਾਭ?તરાભ?ତରାଭ?ாயித்நஇ?ைக்ஙலஇ?்ரூப்பக்ஙிச?్తరాభ?ತರಾಭ?ംതരാഭ?ාකංල?มอค?ยทไ!.&จิกรุธ?ต็นเ?ร&ก์คงอ?าหท??ลาบฐัร?าษกึศ???ວາລ?ეგ?なんみ?アトス?トンイポ?ドウラク?ムコ?ル&グーグ?ーセ??ン&ゾマア?ョシッァフ??业企?东广?乐娱?亚基诺?你爱我?信中?务政?动移?博微?卦八?厅餐?司公?品食?善慈?团集?国中?國中?址网?坡加新?城商?尚时?山佛?店&商?网?酒大里嘉??府政?康健?息信?戏游?拉里格香?拿大?教主天?机手?构机!织组??标商?歌谷?浦利飞?港香!.&人個?司公?府政?絡網?織組?育教???湾台?灣&台?臺??物购?界世?益公?看点?科盈訊電?站网?籍書?线在?络网?网文中?聘招?販通?车汽众大?逊马亚?通联?里嘉?锡马淡?門澳?门澳?闻新?電家?국한?넷닷?성삼?컴닷??");
 
   /**
    * If a hostname is not a key in the EXCLUDE map, and if removing its leftmost component results
@@ -50,7 +50,7 @@
    */
   public static final ImmutableMap<String, PublicSuffixType> UNDER =
       TrieParser.parseTrie(
-          "ac.vedwa,d&b?uolc.&etiso&isnes,tnegam,?iaznab,rehcnar-no,scitats,??e&b.lrusnart,d.ecapsrebu,noz.notirt,t&atse.etupmoc,is.hsmroftalp,?y??gp?h&c.tenerif:.cvs,,k?trae.sppad:.zzb,,?k&c?f?nil.bewd,rowten.secla,u.hcs??ln.lrusnart,m&j?m?oc.&aimhtirogla,duolcmeaeboda.ved,edonil.recnalabedon,ico-remotsuc:.&ico,pco,sco,?,mme0,s&t&cejboedonil,nemelepiuq,?wanozama.&1-etupmoc,ble,etupmoc,??t&neyoj.snc,opsppa.r,???nc.moc.swanozama.&ble,etupmoc,?o&c.pato,i.&duolciaznab.sdraykcab,elacsnoom,oir-no,reniatnoceruza,s&3k-no,olots,?xcq.sys,y5s,??p&j.&a&mahokoy?yogan??ebok?i&adnes?kasawak??oroppas?uhsuykatik??n??r&b.mon?e??s&edoc.owo,w.rosivda,?t&a.&ofnistro.&nednuk,xe,?smcerutuf:.&ni,xe,?,?en.cimonotpyrc,?u&e.lrusnart,r.onijym.&gni&dnal,tsoh,?murtceps,spv,??ved.&erahbew,gts,lcl,?z&c.murtnecatem.duolc,yx.tibelet,??");
+          "ac.vedwa,d&b?uolc.&etiso&isnes,tnegam,?iaznab,rehcnar-no,scitats,??e&b.lrusnart,d.&ecapsrebu,yksurf,?noz.notirt,t&atse.etupmoc,is.&hsmroftalp,tst,???gp?h&c.tenerif:.cvs,,k?trae.sppad:.zzb,,?k&c?f?nil.bewd,rowten.secla,u.hcs??ln.lrusnart,m&j?m?oc.&duolcmeaeboda.ved,edonil.recnalabedon,ico-remotsuc:.&ico,pco,sco,?,lrihwyap,mme0,osseccandcved,s&t&cejboedonil,nemelepiuq,?wanozama.&1-etupmoc,ble,etupmoc,??t&neyoj.snc,opsppa.r,???n&c.moc.swanozama.&ble,etupmoc,?ur.edoc,?o&c.pato,i.&duolciaznab.sdraykcab,elacsnoom,oir-no,reniatnoceruza,s&3k-no,olots,?xcq.sys,y5s,??p&j.&a&mahokoy?yogan??ebok?i&adnes?kasawak??oroppas?uhsuykatik??n?pa.&knalfhtron,repoleved,??r&b.mon?e??s&edoc.owo,w.rosivda,?t&a.&ofnistro.&nednuk,xe,?smcerutuf:.&ni,xe,?,?en.&cimonotpyrc,hvo.&gnitsoh,saapbew,???u&e.lrusnart,r.onijym.&gni&dnal,tsoh,?murtceps,spv,??ved.&e&gats&gts,lcl,?rahbew,?gts,lcl,yawetag,?z&c.murtnecatem.duolc,yx.tibelet,??");
 
   /**
    * The elements in this map would pass the UNDER test, but are known not to be public suffixes and
@@ -59,5 +59,5 @@
    */
   public static final ImmutableMap<String, PublicSuffixType> EXCLUDED =
       TrieParser.parseTrie(
-          "kc.www?moc.aimhtirogla.&smaet,tset,?pj.&a&mahokoy.ytic?yogan.ytic??ebok.ytic?i&adnes.ytic?kasawak.ytic??oroppas.ytic?uhsuykatik.ytic???");
+          "kc.www?pj.&a&mahokoy.ytic?yogan.ytic??ebok.ytic?i&adnes.ytic?kasawak.ytic??oroppas.ytic?uhsuykatik.ytic???");
 }
diff --git a/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixType.java b/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixType.java
index f0c5292..be1d07f 100644
--- a/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixType.java
+++ b/guava/src/com/google/thirdparty/publicsuffix/PublicSuffixType.java
@@ -62,8 +62,4 @@
     }
     throw new IllegalArgumentException("No enum corresponding to given code: " + code);
   }
-
-  static PublicSuffixType fromIsPrivate(boolean isPrivate) {
-    return isPrivate ? PRIVATE : REGISTRY;
-  }
 }
diff --git a/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java b/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
index 9c387eb..dd77780 100644
--- a/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
+++ b/guava/src/com/google/thirdparty/publicsuffix/TrieParser.java
@@ -17,8 +17,8 @@
 import com.google.common.annotations.GwtCompatible;
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-import java.util.List;
+import com.google.common.collect.Queues;
+import java.util.Deque;
 
 /** Parser for a map of reversed domain names stored as a serialized radix tree. */
 @GwtCompatible
@@ -34,7 +34,7 @@
     int encodedLen = encoded.length();
     int idx = 0;
     while (idx < encodedLen) {
-      idx += doParseTrieToBuilder(Lists.<CharSequence>newLinkedList(), encoded, idx, builder);
+      idx += doParseTrieToBuilder(Queues.<CharSequence>newArrayDeque(), encoded, idx, builder);
     }
     return builder.build();
   }
@@ -50,7 +50,7 @@
    * @return The number of characters consumed from {@code encoded}.
    */
   private static int doParseTrieToBuilder(
-      List<CharSequence> stack,
+      Deque<CharSequence> stack,
       CharSequence encoded,
       int start,
       ImmutableMap.Builder<String, PublicSuffixType> builder) {
@@ -67,7 +67,7 @@
       }
     }
 
-    stack.add(0, reverse(encoded.subSequence(start, idx)));
+    stack.push(reverse(encoded.subSequence(start, idx)));
 
     if (c == '!' || c == '?' || c == ':' || c == ',') {
       // '!' represents an interior node that represents a REGISTRY entry in the map.
@@ -92,7 +92,7 @@
         }
       }
     }
-    stack.remove(0);
+    stack.pop();
     return idx - start;
   }
 
diff --git a/pom.xml b/pom.xml
index df7f411..3cecc43 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.guava</groupId>
   <artifactId>guava-parent</artifactId>
-  <version>30.0-jre</version>
+  <version>31.0.1-jre</version>
   <packaging>pom</packaging>
   <name>Guava Maven Parent</name>
   <description>Parent for guava artifacts</description>
@@ -14,10 +14,11 @@
   <properties>
     <!-- Override this with -Dtest.include="**/SomeTest.java" on the CLI -->
     <test.include>%regex[.*.class]</test.include>
-    <truth.version>1.0</truth.version>
-    <animal.sniffer.version>1.18</animal.sniffer.version>
+    <truth.version>1.1.2</truth.version>
+    <checker-framework.version>3.12.0</checker-framework.version>
+    <animal.sniffer.version>1.20</animal.sniffer.version>
     <maven-javadoc-plugin.version>3.1.0</maven-javadoc-plugin.version>
-    <maven-source-plugin.version>3.2.0</maven-source-plugin.version>
+    <maven-source-plugin.version>3.2.1</maven-source-plugin.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   <issueManagement>
@@ -52,8 +53,8 @@
     </developer>
   </developers>
   <ciManagement>
-    <system>Travis CI</system>
-    <url>https://travis-ci.org/google/guava</url>
+    <system>GitHub Actions</system>
+    <url>https://github.com/google/guava/actions</url>
   </ciManagement>
   <modules>
     <module>guava</module>
@@ -119,6 +120,16 @@
           <configuration>
             <source>1.8</source>
             <target>1.8</target>
+            <compilerArgs>
+              <!--
+                   Make includes/excludes fully work:
+                   https://issues.apache.org/jira/browse/MCOMPILER-174
+
+                   (Compare what guava-gwt has to do for maven-javadoc-plugin.)
+              -->
+              <arg>-sourcepath</arg>
+              <arg>doesnotexist</arg>
+            </compilerArgs>
           </configuration>
         </plugin>
         <plugin>
@@ -141,7 +152,7 @@
           <artifactId>animal-sniffer-maven-plugin</artifactId>
           <version>${animal.sniffer.version}</version>
           <configuration>
-            <annotations>com.google.common.util.concurrent.IgnoreJRERequirement</annotations>
+            <checkTestClasses>true</checkTestClasses>
             <signature>
               <groupId>org.codehaus.mojo.signature</groupId>
               <artifactId>java18</artifactId>
@@ -216,7 +227,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-enforcer-plugin</artifactId>
-          <version>3.0.0-M2</version>
+          <version>3.0.0-M3</version>
         </plugin>
       </plugins>
     </pluginManagement>
@@ -248,12 +259,18 @@
       <dependency>
         <groupId>org.checkerframework</groupId>
         <artifactId>checker-qual</artifactId>
-        <version>3.5.0</version>
+        <version>${checker-framework.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.checkerframework</groupId>
+        <artifactId>checker-qual</artifactId>
+        <version>${checker-framework.version}</version>
+        <classifier>sources</classifier>
       </dependency>
       <dependency>
         <groupId>com.google.errorprone</groupId>
         <artifactId>error_prone_annotations</artifactId>
-        <version>2.3.4</version>
+        <version>2.7.1</version>
       </dependency>
       <dependency>
         <groupId>com.google.j2objc</groupId>
@@ -263,25 +280,25 @@
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
-        <version>4.13</version>
+        <version>4.13.2</version>
         <scope>test</scope>
       </dependency>
       <dependency>
         <groupId>org.easymock</groupId>
         <artifactId>easymock</artifactId>
-        <version>3.0</version>
+        <version>4.3</version>
         <scope>test</scope>
       </dependency>
       <dependency>
         <groupId>org.mockito</groupId>
         <artifactId>mockito-core</artifactId>
-        <version>2.19.0</version>
+        <version>3.9.0</version>
         <scope>test</scope>
       </dependency>
       <dependency>
         <groupId>com.google.jimfs</groupId>
         <artifactId>jimfs</artifactId>
-        <version>1.1</version>
+        <version>1.2</version>
         <scope>test</scope>
       </dependency>
       <dependency>
diff --git a/util/deploy_snapshot.sh b/util/deploy_snapshot.sh
index 2eaea17..d021318 100755
--- a/util/deploy_snapshot.sh
+++ b/util/deploy_snapshot.sh
@@ -5,18 +5,12 @@
 set -e -u
 
 function mvn_deploy() {
-  mvn clean source:jar javadoc:jar deploy \
-    --settings="$(dirname $0)/settings.xml" -DskipTests=true "$@"
+  mvn clean source:jar javadoc:jar deploy -DskipTests=true "$@"
 }
 
-if [ "$TRAVIS_REPO_SLUG" == "google/guava" ] && \
-   [ "$TRAVIS_JDK_VERSION" == "openjdk8" ] && \
-   [ "$TRAVIS_PULL_REQUEST" == "false" ] && \
-   [ "$TRAVIS_BRANCH" == "master" ]; then
-  echo "Publishing Maven snapshot..."
+echo "Publishing Maven snapshot..."
 
-  mvn_deploy
-  mvn_deploy -f android/pom.xml
+mvn_deploy
+mvn_deploy -f android/pom.xml
 
-  echo "Maven snapshot published."
-fi
+echo "Maven snapshot published."
diff --git a/util/settings.xml b/util/settings.xml
deleted file mode 100644
index 306d14a..0000000
--- a/util/settings.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
-  <servers>
-    <server>
-      <id>sonatype-nexus-snapshots</id>
-      <username>${env.CI_DEPLOY_USERNAME}</username>
-      <password>${env.CI_DEPLOY_PASSWORD}</password>
-    </server>
-  </servers>
-</settings>
diff --git a/util/update_snapshot_docs.sh b/util/update_snapshot_docs.sh
index 14202e1..95e9429 100755
--- a/util/update_snapshot_docs.sh
+++ b/util/update_snapshot_docs.sh
@@ -1,25 +1,18 @@
 #!/bin/bash
 
-# see http://benlimmer.com/2013/12/26/automatically-publish-javadoc-to-gh-pages-with-travis-ci/ for details
-
 set -e -u
 
-if [ "$TRAVIS_REPO_SLUG" == "google/guava" ] && \
-   [ "$TRAVIS_JDK_VERSION" == "openjdk8" ] && \
-   [ "$TRAVIS_PULL_REQUEST" == "false" ] && \
-   [ "$TRAVIS_BRANCH" == "master" ]; then
-  echo "Publishing Javadoc and JDiff..."
+echo "Publishing Javadoc and JDiff..."
 
-  cd $HOME
-  git clone -q -b gh-pages https://${GH_TOKEN}@github.com/google/guava gh-pages > /dev/null
-  cd gh-pages
+cd $HOME
+git clone -q -b gh-pages "https://x-access-token:${GITHUB_TOKEN}@github.com/google/guava.git" gh-pages > /dev/null
+cd gh-pages
 
-  git config --global user.email "travis@travis-ci.org"
-  git config --global user.name "travis-ci"
+git config --global user.name "$GITHUB_ACTOR"
+git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com"
 
-  ./updaterelease.sh snapshot
+./updaterelease.sh snapshot
 
-  git push -fq origin gh-pages > /dev/null
+git push -fq origin gh-pages > /dev/null
 
-  echo "Javadoc and JDiff published to gh-pages."
-fi
+echo "Javadoc and JDiff published to gh-pages."